diff --git a/.idea/misc.xml b/.idea/misc.xml index 8f86b33..bfd8e61 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file 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/ladder/LadderGame.java b/src/main/java/ladder/LadderGame.java index 717458e..cd44712 100644 --- a/src/main/java/ladder/LadderGame.java +++ b/src/main/java/ladder/LadderGame.java @@ -2,6 +2,7 @@ import ladder.creator.LadderCreator; + public class LadderGame { private final LadderCreator ladderCreator; diff --git a/src/main/java/ladder/LadderGameFactory.java b/src/main/java/ladder/LadderGameFactory.java new file mode 100644 index 0000000..3f1aa53 --- /dev/null +++ b/src/main/java/ladder/LadderGameFactory.java @@ -0,0 +1,22 @@ +package ladder; + +import ladder.creator.DefaultLadderCreator; +import ladder.creator.LadderCreator; +import ladder.creator.RandomLadderCreator; + +public class LadderGameFactory { + + private LadderSize ladderSize; + // 정적 팩토리 메서드 + public static LadderGame createRandomLadderGame(LadderSize ladderSize) { + // 복잡한 생성 로직을 여기서 처리 + RandomLadderCreator randomLadderCreator = new RandomLadderCreator(ladderSize.getNumberOfRow(), ladderSize.getNumberOfPerson()); + return new LadderGame(randomLadderCreator); // 의존성 주입도 여기서 처리 + } + + // 다른 방식의 사다리 생성 메서드도 가능 + public static LadderGame createDefaultLadderGame(LadderSize ladderSize) { + DefaultLadderCreator defaultLadderCreator = new DefaultLadderCreator(ladderSize.getNumberOfRow(), ladderSize.getNumberOfPerson()); + return new LadderGame(defaultLadderCreator); + } +} \ No newline at end of file diff --git a/src/main/java/ladder/LadderPosition.java b/src/main/java/ladder/LadderPosition.java new file mode 100644 index 0000000..aad838e --- /dev/null +++ b/src/main/java/ladder/LadderPosition.java @@ -0,0 +1,22 @@ +package ladder; + +public class LadderPosition { + private Position row; + private Position col; + + public LadderPosition(Position row, Position col) { + this.row = row; + this.col = col; + } + + public Position getCol() { + return col; + } + public Position getRow() { + return row; + } + + public void moveDown() { + row.next(); + } +} diff --git a/src/main/java/ladder/LadderRunner.java b/src/main/java/ladder/LadderRunner.java index dc1e121..13713d4 100644 --- a/src/main/java/ladder/LadderRunner.java +++ b/src/main/java/ladder/LadderRunner.java @@ -9,9 +9,34 @@ public LadderRunner(Row[] rows) { } public int run(Position position) { - for (int i = 0; i < rows.length; i++) { - rows[i].nextPosition(position); + LadderPosition currentPosition = new LadderPosition(Position.from(0), position); + for (Row row : rows) { + printBeforeLadder(currentPosition); + row.nextPosition(currentPosition.getCol()); + printAfterLadder(currentPosition); + currentPosition.moveDown(); } return position.getValue(); } + private void printBeforeLadder(LadderPosition currentPosition){ + System.out.println("Before"); + printLadder(currentPosition); + + } + private void printAfterLadder(LadderPosition currentPosition){ + System.out.println("After"); + printLadder(currentPosition); + } + + private void printLadder(LadderPosition currentPosition){ + for (int i = 0; i < rows.length; i++) { + if (currentPosition.getRow().getValue() == i) { + System.out.println(rows[i].toString(currentPosition)); + } + else { + System.out.println(rows[i].toString()); + } + } + System.out.println(); + } } diff --git a/src/main/java/ladder/LadderSize.java b/src/main/java/ladder/LadderSize.java new file mode 100644 index 0000000..94e1d24 --- /dev/null +++ b/src/main/java/ladder/LadderSize.java @@ -0,0 +1,19 @@ +package ladder; + +public class LadderSize { + private GreaterThanOne numberOfRow; + private GreaterThanOne numberOfPerson; + + public LadderSize(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { + this.numberOfRow = numberOfRow; + this.numberOfPerson = numberOfPerson; + } + + public GreaterThanOne getNumberOfRow() { + return numberOfRow; + } + + public GreaterThanOne getNumberOfPerson() { + return numberOfPerson; + } +} diff --git a/src/main/java/ladder/Main.java b/src/main/java/ladder/Main.java new file mode 100644 index 0000000..f73d920 --- /dev/null +++ b/src/main/java/ladder/Main.java @@ -0,0 +1,35 @@ +package ladder; + +import ladder.creator.DefaultLadderCreator; +import ladder.creator.RandomLadderCreator; + +public class Main { + public static void main(String[] args) { + // row and col + GreaterThanOne numberOfPerson = GreaterThanOne.from(4); + GreaterThanOne row = GreaterThanOne.from(3); + + + // 기본 사다리 게임 + System.out.println("기본 사다리게임 시작 : "); + DefaultLadderCreator defaultLadderCreator = new DefaultLadderCreator(row, numberOfPerson); + LadderGame defaultLadderGame = new LadderGame(defaultLadderCreator); + + defaultLadderCreator.drawLine(Position.from(0),Position.from(0)); + defaultLadderCreator.drawLine(Position.from(1),Position.from(1)); + defaultLadderCreator.drawLine(Position.from(2),Position.from(0)); + + defaultLadderGame.run(Position.from(0)); + System.out.println(); + // 기본 사다리 게임 출력 끝 + + // 랜덤 사다리 게임 시작 + System.out.println("랜덤 사다리 게임 시작 : "); + RandomLadderCreator randomLadderCreator = new RandomLadderCreator(row, numberOfPerson); + LadderGame randomLadderGame = new LadderGame(randomLadderCreator); + randomLadderCreator.drawRandomLines(); + randomLadderGame.run(Position.from(0)); + System.out.println("왜이러지.."); + + } +} diff --git a/src/main/java/ladder/Node.java b/src/main/java/ladder/Node.java index 3291e62..8b87211 100644 --- a/src/main/java/ladder/Node.java +++ b/src/main/java/ladder/Node.java @@ -24,6 +24,9 @@ public void move(Position position) { return; } } + public Direction getDirection() { + return direction; + } public void setRightNode() { direction = RIGHT; diff --git a/src/main/java/ladder/Row.java b/src/main/java/ladder/Row.java index 1be0477..dae77a2 100644 --- a/src/main/java/ladder/Row.java +++ b/src/main/java/ladder/Row.java @@ -18,6 +18,26 @@ public void drawLine(Position startPosition) { setDirectionBetweenNextPosition(startPosition); } + public String toString(LadderPosition currentPosition){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < nodes.length; i++) { + sb.append(nodes[i].getDirection().getValue()); + if (i == currentPosition.getCol().getValue()){ + sb.append("*"); + } + sb.append(" "); + } + return sb.toString(); + } + public String toString(){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < nodes.length; i++) { + sb.append(nodes[i].getDirection().getValue()); + sb.append(" "); + } + return sb.toString(); + } + public void nextPosition(Position position) { validatePosition(position); diff --git a/src/main/java/ladder/creator/DefaultLadderCreator.java b/src/main/java/ladder/creator/DefaultLadderCreator.java new file mode 100644 index 0000000..79264b7 --- /dev/null +++ b/src/main/java/ladder/creator/DefaultLadderCreator.java @@ -0,0 +1,27 @@ +package ladder.creator; + +import ladder.GreaterThanOne; +import ladder.Position; +import ladder.Row; + +public class DefaultLadderCreator implements LadderCreator { + + private final Row[] rows; + + public DefaultLadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { + rows = new Row[numberOfRow.getNumber()]; + for (int i = 0; i < numberOfRow.getNumber(); i++) { + rows[i] = new Row(numberOfPerson); + } + } + + @Override + public void drawLine(Position row, Position col) { + rows[row.getValue()].drawLine(col); + } + + @Override + public Row[] getRows() { + return rows; + } +} diff --git a/src/main/java/ladder/creator/LadderCreator.java b/src/main/java/ladder/creator/LadderCreator.java index 0145e29..5af30ed 100644 --- a/src/main/java/ladder/creator/LadderCreator.java +++ b/src/main/java/ladder/creator/LadderCreator.java @@ -1,25 +1,11 @@ package ladder.creator; -import ladder.GreaterThanOne; import ladder.Position; import ladder.Row; -public class LadderCreator { +public interface LadderCreator { - private final Row[] rows; + public void drawLine(Position row, Position col); - public LadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { - rows = new Row[numberOfRow.getNumber()]; - for (int i = 0; i < numberOfRow.getNumber(); i++) { - rows[i] = new Row(numberOfPerson); - } - } - - public void drawLine(Position row, Position col) { - rows[row.getValue()].drawLine(col); - } - - public Row[] getRows() { - return rows; - } + public Row[] getRows(); } diff --git a/src/main/java/ladder/creator/RandomLadderCreator.java b/src/main/java/ladder/creator/RandomLadderCreator.java new file mode 100644 index 0000000..ebf970e --- /dev/null +++ b/src/main/java/ladder/creator/RandomLadderCreator.java @@ -0,0 +1,52 @@ +package ladder.creator; + +import ladder.GreaterThanOne; +import ladder.LadderPosition; +import ladder.Position; +import ladder.Row; + +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +public class RandomLadderCreator implements LadderCreator { + private final Row[] rows; + private int numberOfLines; + private int numberOfPerson; + + public RandomLadderCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { + rows = new Row[numberOfRow.getNumber()]; + for (int i = 0; i < numberOfRow.getNumber(); i++) { + rows[i] = new Row(numberOfPerson); + } + this.numberOfPerson = numberOfPerson.getNumber(); + numberOfLines = numberOfRow.getNumber() * numberOfPerson.getNumber() * 3 / 10; + } + + public void drawRandomLines(){ + Set drawnLines = new HashSet(); + while (drawnLines.size() < numberOfLines) { + Random random = new Random(); + int randomRow = random.nextInt(rows.length); + int randomCol = random.nextInt(numberOfPerson); + LadderPosition ladderPosition = new LadderPosition(Position.from(randomRow),Position.from(randomCol)); + try { + drawLine(ladderPosition.getRow(), ladderPosition.getCol()); + } catch (Exception e){ + continue; + } + drawnLines.add(ladderPosition); + } + } + + + @Override + public void drawLine(Position row, Position col) { + rows[row.getValue()].drawLine(col); + } + + @Override + public Row[] getRows() { + return rows; + } +} diff --git a/src/test/java/ladder/LadderGameTest.java b/src/test/java/ladder/LadderGameTest.java index aa93e5f..319021e 100644 --- a/src/test/java/ladder/LadderGameTest.java +++ b/src/test/java/ladder/LadderGameTest.java @@ -1,6 +1,6 @@ package ladder; -import ladder.creator.LadderCreator; +import ladder.creator.DefaultLadderCreator; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; @@ -14,18 +14,18 @@ class LadderGameTest { GreaterThanOne numberOfPerson = GreaterThanOne.from(5); //when - LadderCreator ladderCreator = new LadderCreator(numberOfRow, numberOfPerson); + DefaultLadderCreator defaultLadderCreator = new DefaultLadderCreator(numberOfRow, numberOfPerson); //then - assertThat(ladderCreator).isNotNull(); + assertThat(defaultLadderCreator).isNotNull(); } @Test void 사다리_사람_예외_처리_확인() { //when GreaterThanOne numberOfPerson = GreaterThanOne.from(3); - LadderCreator ladderCreator = new LadderCreator(GreaterThanOne.from(2), numberOfPerson); - LadderGame ladderGame = new LadderGame(ladderCreator); + DefaultLadderCreator defaultLadderCreator = new DefaultLadderCreator(GreaterThanOne.from(2), numberOfPerson); + LadderGame ladderGame = new LadderGame(defaultLadderCreator); //given Position position = Position.from(4); @@ -40,12 +40,12 @@ class LadderGameTest { //when GreaterThanOne numberOfPerson = GreaterThanOne.from(4); GreaterThanOne row = GreaterThanOne.from(3); - LadderCreator ladderCreator = new LadderCreator(row, numberOfPerson); - LadderGame ladderGame = new LadderGame(ladderCreator); + DefaultLadderCreator defaultLadderCreator = new DefaultLadderCreator(row, numberOfPerson); + LadderGame ladderGame = new LadderGame(defaultLadderCreator); - ladderCreator.drawLine(Position.from(0),Position.from(0)); - ladderCreator.drawLine(Position.from(1),Position.from(1)); - ladderCreator.drawLine(Position.from(2),Position.from(0)); + defaultLadderCreator.drawLine(Position.from(0),Position.from(0)); + defaultLadderCreator.drawLine(Position.from(1),Position.from(1)); + defaultLadderCreator.drawLine(Position.from(2),Position.from(0)); //given Position position = Position.from(0);