Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/engine/Core.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public final class Core {
private static final GameSettings SETTINGS_LEVEL_7 =
new GameSettings(8, 7, 2, 500,4.8);
private static final GameSettings SETTINGS_BOSS =
new GameSettings(1, 1, 3, 500,4.8,true);
new GameSettings(8, 7, 3, 500,4.8,true);
private static int LEVEL;

/** Frame to draw the screen on. */
Expand Down Expand Up @@ -156,7 +156,7 @@ public static void main(final String[] args) {
// TODO 1P mode와 2P mode 진입 구현
// TODO gameState 생성자에 따라 1P와 2P mode 구분
// 1p에는 level0부터, 2p는 level1부터 시작
if(SelectScreen.gameMode == 1) gameState = new GameState(0, 0, MAX_LIVES, 0, 0);
if(SelectScreen.gameMode == 1) gameState = new GameState(1, 0, MAX_LIVES, 0, 0);
else gameState = new GameState(1, 0, MAX_LIVES, MAX_LIVES, 0, 0, 0, 0);

switch (returnCode) {
Expand Down
68 changes: 47 additions & 21 deletions src/entity/EnemyShipFormation.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ public class EnemyShipFormation implements Iterable<EnemyShip> {
private int checkFirst = 1;
/** store special enemy ship's index */
private List<Integer> special_enemy;
/** save initial formation for testing */
public List<List<EnemyShip>> init_formation;

/** Directions the formation can move. */
private enum Direction {
Expand Down Expand Up @@ -165,7 +167,7 @@ public EnemyShipFormation(final GameSettings gameSettings, final GameState gameS
for (int i = 0; i < this.nShipsWide; i++)
this.enemyShips.add(new ArrayList<EnemyShip>());

if (nShipsWide > 7)
if (nShipsWide > 7 && !BossStage)
lastStage = true;

// The list store a special enemy's index.
Expand Down Expand Up @@ -199,7 +201,13 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B
}
}
} else {
spriteType = SpriteType.Boss;
if (i==1 || i==5) {
spriteType = SpriteType.EnemyShipE;
} else if (i==2 || i==3 || i==4) {
spriteType = SpriteType.EnemyShipD1;
} else {
spriteType = SpriteType.EnemyShipC1;
}
}

EnemyShip enemyShip = null;
Expand All @@ -213,6 +221,11 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B
}
}

if (BossStage) {
this.setXpos = 70;
this.positionY = 130;
}

switch (spriteType)
{
case EnemyShipA1:
Expand Down Expand Up @@ -245,25 +258,33 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B
+ setXpos, (SEPARATION_DISTANCE * i)
+ positionY, spriteType,gameState);
break;
case Boss:
enemyShip = new EnemyBoss((SEPARATION_DISTANCE
* this.enemyShips.indexOf(column))
+ setXpos, (SEPARATION_DISTANCE * i)
+ positionY, spriteType,gameState);
break;
default:
enemyShip = new EnemyShip((SEPARATION_DISTANCE
* this.enemyShips.indexOf(column))
+ setXpos, (SEPARATION_DISTANCE * i)
+ positionY, spriteType,gameState);
}
column.add(enemyShip);
if (BossStage) {
if (i != 2 && i != 3 && i != 4)
column.add(enemyShip);
else if (col != 2 && col != 3 && col != 4 && col != 5)
column.add(enemyShip);
} else {
column.add(enemyShip);
}

this.shipCount++;
ship_index++;
}
col++;
}

if (BossStage) {
List<EnemyShip> Bosslist = new ArrayList<EnemyShip>();
Bosslist.add(new EnemyBoss(205, 230, SpriteType.Boss, gameState));
this.enemyShips.add(Bosslist);
}

this.shipWidth = this.enemyShips.get(0).get(0).getWidth();
this.shipHeight = this.enemyShips.get(0).get(0).getHeight();

Expand All @@ -275,6 +296,8 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B
for (List<EnemyShip> column : this.enemyShips)
this.shooters.add(column.get(column.size() - 1));

this.init_formation = this.enemyShips;

if (nShipsHigh > 5)
moreDiff = true;

Expand Down Expand Up @@ -392,7 +415,7 @@ public final void update() {
/** if ship remains one switch flag.
* it works only on odd row
* */
if(shipCount==1) flag*= -1;
if (shipCount == 1) flag *= -1;
}
}

Expand Down Expand Up @@ -425,10 +448,11 @@ else if (currentDirection == Direction.LEFT)
if (moreDiff) {
for (List<EnemyShip> column : this.enemyShips) {
for (EnemyShip enemyShip : column) {
if ((int)((enemyShip.getpositionY()-100)/40)%2!=0) {
enemyShip.move(complexSpeed, 0);
} else
enemyShip.move(-complexSpeed, 0);
if (!BossStage)
if ((int) ((enemyShip.getpositionY() - 100) / 40) % 2 != 0) {
enemyShip.move(complexSpeed, 0);
} else
enemyShip.move(-complexSpeed, 0);
}
}
complexSpeed = -complexSpeed;
Expand All @@ -441,21 +465,23 @@ else if (currentDirection == Direction.LEFT)
}
}

for (List<EnemyShip> column : this.enemyShips)
for (List<EnemyShip> column : this.enemyShips) {
for (EnemyShip enemyShip : column) {
// In the last stage, the enemy's ships started out in different positions,
// so their coordinates changed accordingly.
if (lastStage) {
if ((int)((enemyShip.getpositionY() - 100) / 40) % 2 != 0) {
enemyShip.move(-movementX, movementY);
if (!BossStage)
if (lastStage) {
if ((int) ((enemyShip.getpositionY() - 100) / 40) % 2 != 0) {
enemyShip.move(-movementX, movementY);
} else {
enemyShip.move(movementX, movementY);
}
} else {
enemyShip.move(movementX, movementY);
}
} else {
enemyShip.move(movementX, movementY);
}
enemyShip.update();
}
}
}
}

Expand Down
66 changes: 66 additions & 0 deletions test/entity/EnemyShipFormationTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package entity;

import engine.DrawManager;
import engine.Frame;
import engine.GameSettings;
import engine.GameState;
import org.junit.jupiter.api.Test;
import screen.GameScreen;

import static org.junit.jupiter.api.Assertions.*;

class EnemyShipFormationTest {
@Test
void testEnemyShipFormation() {
assertAll(
"multi",
() -> {
// Test case 1
GameSettings gameSettings = new GameSettings(5, 4, 60, 2000, 5.5);
GameState gameState = new GameState(1, 0, 1, 0, 0);
EnemyShipFormation BossenemyShipFormation = new EnemyShipFormation(gameSettings, gameState);

DrawManager.SpriteType checkSpritetype;

checkSpritetype = BossenemyShipFormation.init_formation.get(0).get(0).spriteType;
assertTrue((DrawManager.SpriteType.EnemyShipC1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipD1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipE == checkSpritetype));

checkSpritetype = BossenemyShipFormation.init_formation.get(1).get(1).spriteType;
assertTrue((DrawManager.SpriteType.EnemyShipB1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipD1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipE == checkSpritetype));

checkSpritetype = BossenemyShipFormation.init_formation.get(3).get(3).spriteType;
assertTrue((DrawManager.SpriteType.EnemyShipA1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipD1 == checkSpritetype)
|| (DrawManager.SpriteType.EnemyShipE == checkSpritetype));
},
() -> {
// Test case 2
GameSettings gameSettings = new GameSettings(8, 7, 3, 500,4.8,true);
GameState gameState = new GameState(8, 0, 1, 0, 0);
EnemyShipFormation BossenemyShipFormation = new EnemyShipFormation(gameSettings, gameState);

DrawManager.SpriteType checkSpritetype;


checkSpritetype = BossenemyShipFormation.init_formation.get(0).get(0).spriteType;
assertEquals(DrawManager.SpriteType.EnemyShipC1, checkSpritetype);

checkSpritetype = BossenemyShipFormation.init_formation.get(1).get(2).spriteType;
assertEquals(DrawManager.SpriteType.EnemyShipD1, checkSpritetype);

checkSpritetype = BossenemyShipFormation.init_formation.get(3).get(2).spriteType;
assertEquals(DrawManager.SpriteType.EnemyShipE, checkSpritetype);

checkSpritetype = BossenemyShipFormation.init_formation.get(8).get(0).spriteType;
assertEquals(DrawManager.SpriteType.Boss, checkSpritetype);

int formationLength = BossenemyShipFormation.init_formation.get(2).size();
assertEquals(4, formationLength);
}
);
}
}