diff --git a/src/engine/Core.java b/src/engine/Core.java index 9328b080..0daa4ae5 100644 --- a/src/engine/Core.java +++ b/src/engine/Core.java @@ -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. */ @@ -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) { diff --git a/src/entity/EnemyShipFormation.java b/src/entity/EnemyShipFormation.java index 70d2781c..534feeb7 100644 --- a/src/entity/EnemyShipFormation.java +++ b/src/entity/EnemyShipFormation.java @@ -113,6 +113,8 @@ public class EnemyShipFormation implements Iterable { private int checkFirst = 1; /** store special enemy ship's index */ private List special_enemy; + /** save initial formation for testing */ + public List> init_formation; /** Directions the formation can move. */ private enum Direction { @@ -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()); - if (nShipsWide > 7) + if (nShipsWide > 7 && !BossStage) lastStage = true; // The list store a special enemy's index. @@ -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; @@ -213,6 +221,11 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B } } + if (BossStage) { + this.setXpos = 70; + this.positionY = 130; + } + switch (spriteType) { case EnemyShipA1: @@ -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 Bosslist = new ArrayList(); + 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(); @@ -275,6 +296,8 @@ else if (i / (float) this.nShipsHigh < PROPORTION_B for (List column : this.enemyShips) this.shooters.add(column.get(column.size() - 1)); + this.init_formation = this.enemyShips; + if (nShipsHigh > 5) moreDiff = true; @@ -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; } } @@ -425,10 +448,11 @@ else if (currentDirection == Direction.LEFT) if (moreDiff) { for (List 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; @@ -441,21 +465,23 @@ else if (currentDirection == Direction.LEFT) } } - for (List column : this.enemyShips) + for (List 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(); } + } } } diff --git a/test/entity/EnemyShipFormationTest.java b/test/entity/EnemyShipFormationTest.java new file mode 100644 index 00000000..c4c27dec --- /dev/null +++ b/test/entity/EnemyShipFormationTest.java @@ -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); + } + ); + } +} \ No newline at end of file