From acfc107d7676fe0ac0e7b0557ee26347f242d6ed Mon Sep 17 00:00:00 2001 From: Shinjongyun Date: Thu, 19 Sep 2024 19:42:55 +0900 Subject: [PATCH 1/2] =?UTF-8?q?1=EC=A3=BC=EC=B0=A8=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.name | 1 + .idea/dbnavigator.xml | 403 ++++++++++++++++++++++++++++++++++ .idea/misc.xml | 2 +- src/main/java/Game.java | 48 ++++ src/main/java/Ladder.java | 57 ++++- src/main/java/Line.java | 33 +++ src/main/java/Player.java | 12 + src/test/java/LadderTest.java | 51 ++++- 8 files changed, 604 insertions(+), 3 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/dbnavigator.xml create mode 100644 src/main/java/Game.java create mode 100644 src/main/java/Line.java create mode 100644 src/main/java/Player.java diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..51f9fd7 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +kuit-ladder \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000..6dafaf6 --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 8f86b33..690f4c6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/src/main/java/Game.java b/src/main/java/Game.java new file mode 100644 index 0000000..20f7b31 --- /dev/null +++ b/src/main/java/Game.java @@ -0,0 +1,48 @@ +import java.util.Scanner; + +public class Game { + private final Ladder ladder; + private final Player player; + + public Game(int row, int numberOfPerson, int playerStartPosition) { + this.ladder = new Ladder(row, numberOfPerson); + this.player = new Player(playerStartPosition); + } + + public void play(int numberOfLine) { + try { + ladder.drawLine(numberOfLine); + + // 사다리는 0부터 시작하기 때문에 + int result = ladder.run(player.getStartPosition())+1; + System.out.println(result); + } catch (Exception e) { + System.out.println("Program terminated due to an error: " + e.getMessage()); + } + + + } + + public static void main(String[] args) { + int row, numberOfPerson, numberOfLine; + Scanner scanner = new Scanner(System.in); + + /*System.out.println("Enter the number of rows in the game: "); + row=scanner.nextInt(); + + System.out.println("Enter the number of persons in the game: "); + numberOfPerson=scanner.nextInt();*/ + + System.out.print("Input your start position (MAX 3): "); + int startPosition = scanner.nextInt(); + + System.out.print("Input your Number of Line (Max 5): "); + numberOfLine = scanner.nextInt(); + + // 사다리의 크기는 가로로 3, 세로로 5로 설정했습니다. + Game game = new Game(5, 3, startPosition); + game.play(numberOfLine); + + scanner.close(); + } +} \ No newline at end of file diff --git a/src/main/java/Ladder.java b/src/main/java/Ladder.java index 0d2b070..601f48d 100644 --- a/src/main/java/Ladder.java +++ b/src/main/java/Ladder.java @@ -1,8 +1,63 @@ +import java.util.Random; +import java.util.Scanner; + public class Ladder { + Scanner scanner = new Scanner(System.in); + private final int[][] rows; + private final int row; + private final int column; public Ladder(int row, int numberOfPerson) { - rows = new int[row][numberOfPerson]; + this.row = row; + this.column = numberOfPerson; + this.rows = new int[row][numberOfPerson]; + } + + public void drawLine(int numberOfLine) throws IllegalArgumentException { + int x, y; + for (int i = 0; i < numberOfLine; i++) { + System.out.print("Input your line (MAX 3), (Rule is 1 2, ExitCode is -1): "); + x = scanner.nextInt(); + y = scanner.nextInt(); + + if (x == -1 || y == -1) { + throw new IllegalArgumentException("Exit code entered."); + } + + if (x < 1 || x > rows.length || y < 1 || y > rows.length || Math.abs(x - y) != 1) { + throw new IllegalArgumentException("Invalid input. x and y must be between 1"); + } + + new Line(x, y, i, rows); + } } + + + int run(int start) { + + int currentRow=0; + int currentCol=start; + while(true) { + if (rows[currentRow][currentCol]==1&¤tCol + 1 < rows[currentRow].length && rows[currentRow][currentCol + 1] == 1) { + // j+1이 배열의 범위를 벗어나지 않을 때만 실행 + currentCol++; + } + else if (rows[currentRow][currentCol]==1&¤tCol - 1 >= 0 && rows[currentRow][currentCol- 1] == 1) { + // j-1이 음수가 아닐 때만 실행 + currentCol--; + } + else if(currentRow==this.row-1) { + break; + } + currentRow++; + } + return currentCol; + } + + public int[][] getRows() { + return rows; + } + } diff --git a/src/main/java/Line.java b/src/main/java/Line.java new file mode 100644 index 0000000..8f62a40 --- /dev/null +++ b/src/main/java/Line.java @@ -0,0 +1,33 @@ +public class Line { + + private int x; + private int y; + private int t; + private int[][] rows; + + public Line(int x, int y, int i, int[][] rows) { + + sort(x, y); + this.rows=rows; + + if (this.x >= 0 && this.x <= rows.length && i >= 0 && i < rows[0].length) { + this.rows[i][this.x - 1] = 1; + } + if (this.y >= 0 && this.y <= rows.length && i >= 0 && i < rows[0].length) { + this.rows[i][this.y -1] = 1; + } + + } + + public void sort(int x, int y) { + + this.x=x; + this.y=y; + + if (this.x > this.y) { + this.t = y; + this.y = x; + this.x = t; + } + } +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java new file mode 100644 index 0000000..57b170f --- /dev/null +++ b/src/main/java/Player.java @@ -0,0 +1,12 @@ +public class Player { + private final int startPosition; + + public Player(int startPosition) { + // 사다리는 0부터 시작하기 때문에 + this.startPosition = startPosition-1; + } + + public int getStartPosition() { + return startPosition; + } +} diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java index 741a915..de3c7de 100644 --- a/src/test/java/LadderTest.java +++ b/src/test/java/LadderTest.java @@ -1,5 +1,54 @@ -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + class LadderTest { + @Test + @DisplayName("사다리 생성 테스트") + void testLadderCreation() { + Ladder ladder = new Ladder(5, 3); + assertThat(ladder).isNotNull(); + } + + @Test + @DisplayName("사다리 라인 생성 테스트") + public void testDrawLine() { + + Ladder ladder = new Ladder(5, 3); + int[][] rows = ladder.getRows(); + + Line line = new Line(1, 2, 0, rows); + + assertThat(rows[0][0]).isEqualTo(1); + assertThat(rows[0][1]).isEqualTo(1); + + } + + @Test + @DisplayName("사다리 게임 테스트") + void testRun() { + Ladder ladder = new Ladder(5, 3); + int[][] rows = ladder.getRows(); + + rows[1][0] = 1; + rows[1][1] = 1; + rows[2][1] = 1; + rows[2][2] = 1; + rows[3][1] = 1; + rows[3][2] = 1; + + assertThat(ladder.run(0)).isEqualTo(1); + assertThat(ladder.run(1)).isEqualTo(0); + assertThat(ladder.run(2)).isEqualTo(2); + } + } \ No newline at end of file From d857faeaddb78198d3c1f426f83fd8dc3f6692b8 Mon Sep 17 00:00:00 2001 From: Shinjongyun Date: Fri, 27 Sep 2024 02:07:21 +0900 Subject: [PATCH 2/2] =?UTF-8?q?2=EC=A3=BC=EC=B0=A8=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/uiDesigner.xml | 124 +++++++++++++++++++++ src/main/java/ExceptionMessage.java | 16 +++ src/main/java/Game.java | 48 -------- src/main/java/Ladder.java | 91 +++++++-------- src/main/java/LadderCreator.java | 3 + src/main/java/LadderGame.java | 28 +++++ src/main/java/LadderGameFactory.java | 7 ++ src/main/java/LadderPrinter.java | 16 +++ src/main/java/LadderRunner.java | 54 +++++++++ src/main/java/Line.java | 58 +++++++--- src/main/java/Player.java | 35 +++++- src/main/java/RandomLadderCreator.java | 46 ++++++++ src/test/java/LadderRunnerTest.java | 57 ++++++++++ src/test/java/LadderTest.java | 54 --------- src/test/java/RandomLadderCreatorTest.java | 98 ++++++++++++++++ 15 files changed, 564 insertions(+), 171 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 src/main/java/ExceptionMessage.java delete mode 100644 src/main/java/Game.java create mode 100644 src/main/java/LadderCreator.java create mode 100644 src/main/java/LadderGame.java create mode 100644 src/main/java/LadderGameFactory.java create mode 100644 src/main/java/LadderPrinter.java create mode 100644 src/main/java/LadderRunner.java create mode 100644 src/main/java/RandomLadderCreator.java create mode 100644 src/test/java/LadderRunnerTest.java delete mode 100644 src/test/java/LadderTest.java create mode 100644 src/test/java/RandomLadderCreatorTest.java diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/ExceptionMessage.java b/src/main/java/ExceptionMessage.java new file mode 100644 index 0000000..c237610 --- /dev/null +++ b/src/main/java/ExceptionMessage.java @@ -0,0 +1,16 @@ +public enum ExceptionMessage { + + INVALID_LADDER_SIZE("사다리의 열과 행은 2이상의 자연수입니다."), + INVALID_LINE_POSITION("선의 위치가 사다리를 벗어납니다."), + INVALID_START_POSITION("출발 위치는 1이상의 자연수입니다."); + + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/Game.java b/src/main/java/Game.java deleted file mode 100644 index 20f7b31..0000000 --- a/src/main/java/Game.java +++ /dev/null @@ -1,48 +0,0 @@ -import java.util.Scanner; - -public class Game { - private final Ladder ladder; - private final Player player; - - public Game(int row, int numberOfPerson, int playerStartPosition) { - this.ladder = new Ladder(row, numberOfPerson); - this.player = new Player(playerStartPosition); - } - - public void play(int numberOfLine) { - try { - ladder.drawLine(numberOfLine); - - // 사다리는 0부터 시작하기 때문에 - int result = ladder.run(player.getStartPosition())+1; - System.out.println(result); - } catch (Exception e) { - System.out.println("Program terminated due to an error: " + e.getMessage()); - } - - - } - - public static void main(String[] args) { - int row, numberOfPerson, numberOfLine; - Scanner scanner = new Scanner(System.in); - - /*System.out.println("Enter the number of rows in the game: "); - row=scanner.nextInt(); - - System.out.println("Enter the number of persons in the game: "); - numberOfPerson=scanner.nextInt();*/ - - System.out.print("Input your start position (MAX 3): "); - int startPosition = scanner.nextInt(); - - System.out.print("Input your Number of Line (Max 5): "); - numberOfLine = scanner.nextInt(); - - // 사다리의 크기는 가로로 3, 세로로 5로 설정했습니다. - Game game = new Game(5, 3, startPosition); - game.play(numberOfLine); - - scanner.close(); - } -} \ No newline at end of file diff --git a/src/main/java/Ladder.java b/src/main/java/Ladder.java index 601f48d..a90c0ea 100644 --- a/src/main/java/Ladder.java +++ b/src/main/java/Ladder.java @@ -1,63 +1,56 @@ -import java.util.Random; -import java.util.Scanner; +import java.util.ArrayList; +import java.util.List; -public class Ladder { +class Ladder { +private final int[][] rows; +private final List lines; - Scanner scanner = new Scanner(System.in); - - private final int[][] rows; - private final int row; - private final int column; +public Ladder(int row, int column) { + validateLadderDimensions(row, column); + this.rows = new int[row][column]; + lines = new ArrayList<>(); +} - public Ladder(int row, int numberOfPerson) { - this.row = row; - this.column = numberOfPerson; - this.rows = new int[row][numberOfPerson]; +private void validateLadderDimensions(int row, int column) { + if(row < 2 || column < 2) { + throw new IllegalArgumentException(ExceptionMessage.INVALID_LADDER_SIZE.getMessage()); } +} - public void drawLine(int numberOfLine) throws IllegalArgumentException { - int x, y; - for (int i = 0; i < numberOfLine; i++) { - System.out.print("Input your line (MAX 3), (Rule is 1 2, ExitCode is -1): "); - x = scanner.nextInt(); - y = scanner.nextInt(); +public void addLine(int fromLine, int toLine, int currentRow) { + Line line = new Line(fromLine, toLine, currentRow, this.rows); + lines.add(line); +} - if (x == -1 || y == -1) { - throw new IllegalArgumentException("Exit code entered."); - } +public boolean isLine(int row, int col) { + return rows[row][col] == 1 || rows[row][col] == -1; +} - if (x < 1 || x > rows.length || y < 1 || y > rows.length || Math.abs(x - y) != 1) { - throw new IllegalArgumentException("Invalid input. x and y must be between 1"); - } +public boolean isLineAtLeft(int row, int col) { + return col > 0 && rows[row][col - 1] == - 1; +} - new Line(x, y, i, rows); - } - } +public boolean isLineAtRight(int row, int col) { + return col + 1 < rows[row].length && rows[row][col + 1] == 1; +} +public int getHeight() { + return rows.length; +} - int run(int start) { - - int currentRow=0; - int currentCol=start; - while(true) { - if (rows[currentRow][currentCol]==1&¤tCol + 1 < rows[currentRow].length && rows[currentRow][currentCol + 1] == 1) { - // j+1이 배열의 범위를 벗어나지 않을 때만 실행 - currentCol++; - } - else if (rows[currentRow][currentCol]==1&¤tCol - 1 >= 0 && rows[currentRow][currentCol- 1] == 1) { - // j-1이 음수가 아닐 때만 실행 - currentCol--; - } - else if(currentRow==this.row-1) { - break; - } - currentRow++; - } - return currentCol; - } +public int getWidth() { + return rows[0].length; +} - public int[][] getRows() { - return rows; +public int getRows(int row, int col) { + return rows[row][col]; +} + + public boolean isLeftLine(int currentRow, int currentCol) { + return rows[currentRow][currentCol] == 1; } + public boolean isRightLine(int currentRow, int currentCol) { + return rows[currentRow][currentCol] == - 1; + } } diff --git a/src/main/java/LadderCreator.java b/src/main/java/LadderCreator.java new file mode 100644 index 0000000..ca0d035 --- /dev/null +++ b/src/main/java/LadderCreator.java @@ -0,0 +1,3 @@ +public interface LadderCreator { + Ladder createLine(int rows, int columns); +} diff --git a/src/main/java/LadderGame.java b/src/main/java/LadderGame.java new file mode 100644 index 0000000..eafd256 --- /dev/null +++ b/src/main/java/LadderGame.java @@ -0,0 +1,28 @@ +import java.util.Scanner; + +public class LadderGame { + private Ladder ladder; + private static Scanner scanner; + private int startPosition; + private LadderRunner ladderRunner; + + public LadderGame(Ladder ladder) { + this.ladder = ladder; + } + + public void play() { + System.out.print("Enter the start position: "); + startPosition = scanner.nextInt(); + + ladderRunner = new LadderRunner(ladder, startPosition); + int result = ladderRunner.run()+1; + System.out.println("Final position: " + result); + } + + public static void main(String[] args) { + scanner = new Scanner(System.in); + LadderGame game = LadderGameFactory.createRandomLadderGame(5, 5); + game.play(); + scanner.close(); + } +} diff --git a/src/main/java/LadderGameFactory.java b/src/main/java/LadderGameFactory.java new file mode 100644 index 0000000..63f1268 --- /dev/null +++ b/src/main/java/LadderGameFactory.java @@ -0,0 +1,7 @@ +public class LadderGameFactory { + public static LadderGame createRandomLadderGame(int rows, int columns) { + LadderCreator creator = new RandomLadderCreator(); + Ladder ladder = creator.createLine(rows, columns); + return new LadderGame(ladder); + } +} diff --git a/src/main/java/LadderPrinter.java b/src/main/java/LadderPrinter.java new file mode 100644 index 0000000..63adb15 --- /dev/null +++ b/src/main/java/LadderPrinter.java @@ -0,0 +1,16 @@ +public class LadderPrinter { + + // 정적메소드 적용 + public static void print(Ladder ladder, Player player) { + for (int i = 0; i < ladder.getHeight(); i++) { + for (int j = 0; j < ladder.getWidth(); j++) { + System.out.print(ladder.getRows(i, j)); + if (player.getxPosition() == j && player.getyPosition() == i) { + System.out.print("*"); + } + System.out.print(" "); + } + System.out.println(); + } + } +} \ No newline at end of file diff --git a/src/main/java/LadderRunner.java b/src/main/java/LadderRunner.java new file mode 100644 index 0000000..b5e23df --- /dev/null +++ b/src/main/java/LadderRunner.java @@ -0,0 +1,54 @@ +public class LadderRunner { + + private final Ladder ladder; + private Player player; + + public LadderRunner(Ladder ladder, int startPosition) { + this.ladder = ladder; + this.player = new Player(startPosition); + } + + int run() { + while (true) { + printLadderState("Before"); + + // 오른쪽으로 가기 + if (ladder.isLeftLine(player.getyPosition(), player.getxPosition())) { + player.right(); + printLadderState("After"); + player.down(); + } + // 왼쪽으로 가기 + else if (ladder.isRightLine(player.getyPosition(), player.getxPosition())) { + player.left(); + printLadderState("After"); + player.down(); + } + // 그냥 아래로 가기 + else { + player.down(); + if (isGameOver()) { + printLadderState("Final"); + break; + } + printLadderState("After"); + } + + if (isGameOver()) { + printLadderState("Final"); + break; + } + } + return player.getxPosition(); + } + + private boolean isGameOver() { + return player.getyPosition() == ladder.getHeight() - 1; + } + + private void printLadderState(String state) { + System.out.println(state); + LadderPrinter.print(ladder, player); + } +} + diff --git a/src/main/java/Line.java b/src/main/java/Line.java index 8f62a40..588e942 100644 --- a/src/main/java/Line.java +++ b/src/main/java/Line.java @@ -1,33 +1,57 @@ public class Line { - - private int x; - private int y; + private int fromLine; + private int toLine; private int t; private int[][] rows; - public Line(int x, int y, int i, int[][] rows) { + public Line(int fromLine, int toLine, int currentRow, int[][] rows) { + sort(fromLine, toLine); + this.rows = rows; - sort(x, y); - this.rows=rows; + if (validateFromLine(rows) && currentRow >= 0 && validateCurrentRow(currentRow, rows)) { + this.rows[currentRow][this.fromLine] = 1; + } + if (validateToLine(rows) && currentRow >= 0 && validateCurrentRow(currentRow, rows)) { + this.rows[currentRow][this.toLine] = - 1; + } + } - if (this.x >= 0 && this.x <= rows.length && i >= 0 && i < rows[0].length) { - this.rows[i][this.x - 1] = 1; + private static boolean validateCurrentRow(int currentRow, int[][] rows) { + if(currentRow < rows.length){ + return true; } - if (this.y >= 0 && this.y <= rows.length && i >= 0 && i < rows[0].length) { - this.rows[i][this.y -1] = 1; + else{ + throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage()); } + } + private boolean validateToLine(int[][] rows) { + if(this.toLine >= 0 && this.toLine <= rows[0].length){ + return true; + } + else{ + throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage()); + } } - public void sort(int x, int y) { + private boolean validateFromLine(int[][] rows) { + if(this.fromLine >= 0 && this.fromLine <= rows[0].length){ + return true; + } + else{ + throw new IllegalArgumentException(ExceptionMessage.INVALID_LINE_POSITION.getMessage()); + } + } - this.x=x; - this.y=y; + public void sort(int x, int y) { + this.fromLine = x; + this.toLine = y; - if (this.x > this.y) { + if (this.fromLine > this.toLine) { this.t = y; - this.y = x; - this.x = t; + this.toLine = x; + this.fromLine = t; } } -} + +} \ No newline at end of file diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 57b170f..2880539 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,12 +1,41 @@ public class Player { - private final int startPosition; + private int xPosition; + private int yPosition; public Player(int startPosition) { // 사다리는 0부터 시작하기 때문에 - this.startPosition = startPosition-1; + this.xPosition = startPosition-1; + this.yPosition = 0; + validatePosition(); + } + + private void validatePosition(){ + if(this.xPosition<0){ + throw new IllegalArgumentException(ExceptionMessage.INVALID_START_POSITION.getMessage()); + } + } + + public void right(){ + this.xPosition += 1; + } + + public void left(){ + this.xPosition -= 1; + } + + public void down(){ + this.yPosition += 1; } public int getStartPosition() { - return startPosition; + return xPosition; + } + + public int getxPosition(){ + return xPosition; + } + + public int getyPosition(){ + return yPosition; } } diff --git a/src/main/java/RandomLadderCreator.java b/src/main/java/RandomLadderCreator.java new file mode 100644 index 0000000..0632982 --- /dev/null +++ b/src/main/java/RandomLadderCreator.java @@ -0,0 +1,46 @@ +import java.util.Random; + +public class RandomLadderCreator implements LadderCreator { + private Random random = new Random(); + + @Override + public Ladder createLine(int rows, int columns) { + Ladder ladder = new Ladder(rows, columns); + int totalLines = (int) (rows * (columns - 1) * 0.3); + int createdLines = 0; + + while (createdLines < totalLines) { + int row = random.nextInt(rows); + int col = random.nextInt(columns - 1); + + if (canAddLine(ladder, row, col)) { + ladder.addLine(col, col + 1, row); + createdLines++; + } + } + + return ladder; + } + + boolean canAddLine(Ladder ladder, int row, int col) { + // 현재 선택된 위치에 이미 가로선이 있는지 확인 + if (ladder.isLine(row, col)) { + return false; + } + // 현재 위치의 왼쪽에 가로선이 있는지를 확인 + if (col > 0 && ladder.isLineAtLeft(row, col)) { + return false; + } + // 현재 위치의 오른쪽에 가로선이 있는지를 확인 + if (col < ladder.getWidth() - 1 && ladder.isLineAtRight(row, col)) { + return false; + } + // 마지막 열에는 선이 생성되지 않습니다 + if (row >= ladder.getHeight() - 1){ + return false; + } + return true; + } + + +} \ No newline at end of file diff --git a/src/test/java/LadderRunnerTest.java b/src/test/java/LadderRunnerTest.java new file mode 100644 index 0000000..cefdb7e --- /dev/null +++ b/src/test/java/LadderRunnerTest.java @@ -0,0 +1,57 @@ +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LadderRunnerTest { + + @Test + @DisplayName("오른쪽 이동") + void testMoveRight() { + + // Given + Ladder ladder = new Ladder(5, 3); + ladder.addLine(0, 1, 0); + ladder.addLine(1, 2, 1); + + // When + LadderRunner runner = new LadderRunner(ladder, 1); + int finalPosition = runner.run()+1; + + //Then + Assertions.assertEquals(3, finalPosition); + } + + @Test + @DisplayName("왼쪽 이동") + void testMoveLeft() { + // Given + Ladder ladder = new Ladder(5, 3); + ladder.addLine(1, 2, 0); + ladder.addLine(0, 1, 1); + LadderRunner runner = new LadderRunner(ladder, 3); + + // When + int finalPosition = runner.run()+1; + + // Then + Assertions.assertEquals(1, finalPosition); + } + + @Test + @DisplayName("사다리가 연달아 있는 경우") + void testMoveBetween() { + // Given + Ladder ladder = new Ladder(5, 4); + ladder.addLine(0, 1, 1); + ladder.addLine(2, 3, 1); + LadderRunner runner = new LadderRunner(ladder, 3); + + // When + int finalPosition = runner.run() + 1; + + // Then + Assertions.assertEquals(4, finalPosition); + } + + +} \ No newline at end of file diff --git a/src/test/java/LadderTest.java b/src/test/java/LadderTest.java deleted file mode 100644 index de3c7de..0000000 --- a/src/test/java/LadderTest.java +++ /dev/null @@ -1,54 +0,0 @@ -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.RepeatedTest; -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - - -class LadderTest { - - @Test - @DisplayName("사다리 생성 테스트") - void testLadderCreation() { - Ladder ladder = new Ladder(5, 3); - assertThat(ladder).isNotNull(); - } - - @Test - @DisplayName("사다리 라인 생성 테스트") - public void testDrawLine() { - - Ladder ladder = new Ladder(5, 3); - int[][] rows = ladder.getRows(); - - Line line = new Line(1, 2, 0, rows); - - assertThat(rows[0][0]).isEqualTo(1); - assertThat(rows[0][1]).isEqualTo(1); - - } - - @Test - @DisplayName("사다리 게임 테스트") - void testRun() { - Ladder ladder = new Ladder(5, 3); - int[][] rows = ladder.getRows(); - - rows[1][0] = 1; - rows[1][1] = 1; - rows[2][1] = 1; - rows[2][2] = 1; - rows[3][1] = 1; - rows[3][2] = 1; - - assertThat(ladder.run(0)).isEqualTo(1); - assertThat(ladder.run(1)).isEqualTo(0); - assertThat(ladder.run(2)).isEqualTo(2); - } - -} \ No newline at end of file diff --git a/src/test/java/RandomLadderCreatorTest.java b/src/test/java/RandomLadderCreatorTest.java new file mode 100644 index 0000000..4fe3c2f --- /dev/null +++ b/src/test/java/RandomLadderCreatorTest.java @@ -0,0 +1,98 @@ +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class RandomLadderCreatorTest { + + @Test + @DisplayName("사다리의 크기가 올바르게 생성되는지 확인") + void testCreateLineWithCorrectSize() { + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = creator.createLine(5, 3); + + Assertions.assertEquals(5, ladder.getHeight()); + Assertions.assertEquals(3, ladder.getWidth()); + } + + @Test + @DisplayName("라인이 위치에 추가되는지 확인") + void testCanAddLineAtValidPosition() { + + // Given + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = new Ladder(5, 3); + + // When + boolean canAddLineAt00 = creator.canAddLine(ladder, 0, 0); + boolean canAddLineAt21 = creator.canAddLine(ladder, 2, 1); + + // Then + Assertions.assertTrue(canAddLineAt00); + Assertions.assertTrue(canAddLineAt21); + + } + + @Test + @DisplayName("이미 라인이 있는 위치에는 라인을 추가할 수 없는지 확인") + void testCannotAddLineAtOccupiedPosition() { + + // Given + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = new Ladder(5, 3); + ladder.addLine(0, 1, 0); + + // When + boolean canAddLineAt00 = creator.canAddLine(ladder, 0, 0); + + // Then + Assertions.assertFalse(canAddLineAt00); + } + + @Test + @DisplayName("마지막 행에는 라인을 추가할 수 없는지 확인") + void testCannotAddLineAtLastRow() { + + // Given + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = new Ladder(5, 3); + + // When + boolean canAddLineAt41 = creator.canAddLine(ladder, 4, 1); + + // Then + Assertions.assertFalse(canAddLineAt41); + } + + @Test + @DisplayName("이미 오른쪽에 라인이 있는 위치에는 라인을 추가할 수 없는지 확인") + void testCannotAddLineAtAlreadyRight() { + + //Given + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = new Ladder(5, 3); + ladder.addLine(1, 2, 0); + + // When + boolean canAddLineAt00 = creator.canAddLine(ladder, 0, 0); + + // Then + Assertions.assertFalse(canAddLineAt00); + } + + @Test + @DisplayName("이미 왼쪽에 라인이 있는 위치에는 라인을 추가할 수 없는지 확인") + void testCannotAddLineAtAlreadyLeft() { + + //Given + RandomLadderCreator creator = new RandomLadderCreator(); + Ladder ladder = new Ladder(5, 3); + ladder.addLine(0, 1, 0); + + // When + boolean canAddLineAt00 = creator.canAddLine(ladder, 0, 1); + + // Then + Assertions.assertFalse(canAddLineAt00); + } + +} \ No newline at end of file