diff --git a/src/main/java/ladder/LadderGame.java b/src/main/java/ladder/LadderGame.java index 717458e..71b947e 100644 --- a/src/main/java/ladder/LadderGame.java +++ b/src/main/java/ladder/LadderGame.java @@ -1,11 +1,11 @@ package ladder; import ladder.creator.LadderCreator; +import ladder.creator.LadderCreatorImpl; public class LadderGame { private final LadderCreator ladderCreator; - public LadderGame(LadderCreator ladderCreator) { this.ladderCreator = ladderCreator; } @@ -15,4 +15,8 @@ public int run(Position position) { ladderRunner.run(position); return position.getValue(); } + + public LadderCreator getLadderCreator() { + return ladderCreator; + } } diff --git a/src/main/java/ladder/LadderGameFactory.java b/src/main/java/ladder/LadderGameFactory.java new file mode 100644 index 0000000..60de181 --- /dev/null +++ b/src/main/java/ladder/LadderGameFactory.java @@ -0,0 +1,16 @@ +package ladder; + +import ladder.creator.LadderAutoCreator; +import ladder.creator.LadderCreatorImpl; + + +public class LadderGameFactory { + + public static LadderGame createLadderGame(GreaterThanOne row, GreaterThanOne numberOfPerson) { + return new LadderGame(new LadderCreatorImpl(row, numberOfPerson)); + } + + public static LadderGame createRandomLadderGame(GreaterThanOne row, GreaterThanOne numberOfPerson) { + return new LadderGame(new LadderAutoCreator(row, numberOfPerson)); + } +} diff --git a/src/main/java/ladder/LadderPosition.java b/src/main/java/ladder/LadderPosition.java new file mode 100644 index 0000000..42cc78c --- /dev/null +++ b/src/main/java/ladder/LadderPosition.java @@ -0,0 +1,19 @@ +package ladder; + +public class LadderPosition { + Position x; + Position y; + + public LadderPosition(Position x, Position y) { + this.x = x; + this.y = y; + } + + public Position getX() { + return x; + } + + public Position getY() { + return y; + } +} diff --git a/src/main/java/ladder/LadderRunner.java b/src/main/java/ladder/LadderRunner.java index dc1e121..e823659 100644 --- a/src/main/java/ladder/LadderRunner.java +++ b/src/main/java/ladder/LadderRunner.java @@ -10,8 +10,29 @@ public LadderRunner(Row[] rows) { public int run(Position position) { for (int i = 0; i < rows.length; i++) { + LadderPosition ladderPosition = new LadderPosition(Position.from(i), position); + + System.out.println("Before"); + printLadder(ladderPosition); + rows[i].nextPosition(position); + + System.out.println("After"); + printLadder(ladderPosition); + } return position.getValue(); } + + private void printLadder(LadderPosition ladderPosition){ + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < rows.length; i++){ + if( i == ladderPosition.getX().getValue()){ + sb.append(rows[i].convertPositionRowToString(ladderPosition.getY())).append("\n"); + continue; + } + sb.append(rows[i].convertRowtoString()).append("\n"); + } + System.out.println(sb); + } } diff --git a/src/main/java/ladder/LadderSize.java b/src/main/java/ladder/LadderSize.java new file mode 100644 index 0000000..b94b4f1 --- /dev/null +++ b/src/main/java/ladder/LadderSize.java @@ -0,0 +1,19 @@ +package ladder; + +public class LadderSize { + GreaterThanOne numberOfRow; + 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/Node.java b/src/main/java/ladder/Node.java index 3291e62..358a8be 100644 --- a/src/main/java/ladder/Node.java +++ b/src/main/java/ladder/Node.java @@ -25,6 +25,8 @@ public void move(Position position) { } } + + public void setRightNode() { direction = RIGHT; } @@ -48,4 +50,8 @@ private boolean isLeft() { private boolean isNone() { return direction == NONE; } + + public Direction getDirection() { + return direction; + } } diff --git a/src/main/java/ladder/Position.java b/src/main/java/ladder/Position.java index fdaa2dd..7646890 100644 --- a/src/main/java/ladder/Position.java +++ b/src/main/java/ladder/Position.java @@ -34,7 +34,7 @@ public boolean isBiggerThan(int position) { return this.position > position; } - private static void validatePosition(int position) { + public static void validatePosition(int position) { if (!isPosition(position)) { throw new IllegalArgumentException(INVALID_LADDER_POSITION.getMessage()); } diff --git a/src/main/java/ladder/Row.java b/src/main/java/ladder/Row.java index 1be0477..c825f1f 100644 --- a/src/main/java/ladder/Row.java +++ b/src/main/java/ladder/Row.java @@ -12,9 +12,32 @@ public Row(GreaterThanOne numberOfPerson) { } } + public int getNodeLength(){ + return nodes.length; + } + public StringBuilder convertRowtoString(){ + StringBuilder sb = new StringBuilder(); + for(int i = 0 ; i < nodes.length ; i++){ + sb.append(nodes[i].getDirection().getValue()).append(" "); + } + return sb; + } + + public StringBuilder convertPositionRowToString(Position y){ + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < nodes.length; i++) { + if(i == y.getValue()) { + sb.append(nodes[i].getDirection().getValue()).append("* "); + continue; + } + sb.append(nodes[i].getDirection().getValue()).append(" "); + } + return sb; + } + public void drawLine(Position startPosition) { validateDrawLinePosition(startPosition); - setDirectionBetweenNextPosition(startPosition); } diff --git a/src/main/java/ladder/creator/LadderAutoCreator.java b/src/main/java/ladder/creator/LadderAutoCreator.java new file mode 100644 index 0000000..159d465 --- /dev/null +++ b/src/main/java/ladder/creator/LadderAutoCreator.java @@ -0,0 +1,63 @@ +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 LadderAutoCreator implements LadderCreator { + private Row[] rows; + + public LadderAutoCreator(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { + rows = new Row[numberOfRow.getNumber()]; + for (int i = 0; i < numberOfRow.getNumber(); i++) { + rows[i] = new Row(numberOfPerson); + } + } + public Row[] getRows() {return rows;} + + public void drawLine(Position row, Position col){ + Set lines = new HashSet<>(); + + int numberOfLines = (int)(rows.length * rows[0].getNodeLength() * 0.3) - 1; + + while(lines.size() < numberOfLines){ + row = getRandomRow(); + col = getRandomCol(); + LadderPosition ladderPosition = new LadderPosition(row, col); + if(!canDrawLine(row,col)){ + continue; + } + lines.add(ladderPosition); + + } + + } + + private Position getRandomCol() { + Random r = new Random(); + Position col; + col = Position.from(r.nextInt(rows[0].getNodeLength() - 1)); + return col; + } + + private Position getRandomRow() { + Random r = new Random(); + Position row; + row = Position.from(r.nextInt(rows.length - 1)); + return row; + } + + private boolean canDrawLine(Position row, Position col) { + try { + rows[row.getValue()].drawLine(col); + } catch (IllegalArgumentException e) { + return false; + } + return true; + } +} diff --git a/src/main/java/ladder/creator/LadderCreator.java b/src/main/java/ladder/creator/LadderCreator.java index 0145e29..21b8b73 100644 --- a/src/main/java/ladder/creator/LadderCreator.java +++ b/src/main/java/ladder/creator/LadderCreator.java @@ -1,25 +1,12 @@ package ladder.creator; -import ladder.GreaterThanOne; import ladder.Position; import ladder.Row; -public class LadderCreator { +public interface LadderCreator { - private final Row[] rows; + 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); - } - } + Row[] getRows(); - public void drawLine(Position row, Position col) { - rows[row.getValue()].drawLine(col); - } - - public Row[] getRows() { - return rows; - } } diff --git a/src/main/java/ladder/creator/LadderCreatorImpl.java b/src/main/java/ladder/creator/LadderCreatorImpl.java new file mode 100644 index 0000000..2e23b84 --- /dev/null +++ b/src/main/java/ladder/creator/LadderCreatorImpl.java @@ -0,0 +1,24 @@ +package ladder.creator; + +import ladder.GreaterThanOne; +import ladder.Position; +import ladder.Row; + +public class LadderCreatorImpl implements LadderCreator { + private Row[] rows; + + public LadderCreatorImpl(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; + } +} diff --git a/src/test/java/ladder/LadderGameTest.java b/src/test/java/ladder/LadderGameTest.java index aa93e5f..fe25f40 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.LadderCreatorImpl; 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); + LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(numberOfRow, numberOfPerson); //then - assertThat(ladderCreator).isNotNull(); + assertThat(ladderCreatorImpl).isNotNull(); } @Test void 사다리_사람_예외_처리_확인() { //when GreaterThanOne numberOfPerson = GreaterThanOne.from(3); - LadderCreator ladderCreator = new LadderCreator(GreaterThanOne.from(2), numberOfPerson); - LadderGame ladderGame = new LadderGame(ladderCreator); + LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(GreaterThanOne.from(2), numberOfPerson); + LadderGame ladderGame = new LadderGame(ladderCreatorImpl); //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); + LadderCreatorImpl ladderCreatorImpl = new LadderCreatorImpl(row, numberOfPerson); + LadderGame ladderGame = new LadderGame(ladderCreatorImpl); - ladderCreator.drawLine(Position.from(0),Position.from(0)); - ladderCreator.drawLine(Position.from(1),Position.from(1)); - ladderCreator.drawLine(Position.from(2),Position.from(0)); + ladderCreatorImpl.drawLine(Position.from(0),Position.from(0)); + ladderCreatorImpl.drawLine(Position.from(1),Position.from(1)); + ladderCreatorImpl.drawLine(Position.from(2),Position.from(0)); //given Position position = Position.from(0); diff --git a/src/test/java/ladder/RandomLadderTest.java b/src/test/java/ladder/RandomLadderTest.java new file mode 100644 index 0000000..d824992 --- /dev/null +++ b/src/test/java/ladder/RandomLadderTest.java @@ -0,0 +1,48 @@ +package ladder; + +import ladder.creator.LadderAutoCreator; +import ladder.creator.LadderCreator; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class RandomLadderTest { + GreaterThanOne numberOfPerson; + GreaterThanOne row; + + @BeforeEach + void setUp() { + numberOfPerson = GreaterThanOne.from(4); + row = GreaterThanOne.from(3); + } + + + @Test + void 사다리_자동_생성_결과_확인(){ + //given + + LadderGame ladderGame = LadderGameFactory.createRandomLadderGame(numberOfPerson,row); + LadderCreator ladderCreator = ladderGame.getLadderCreator(); + ladderCreator.drawLine(Position.from(0),Position.from(0)); + + + //when + ladderGame.run(Position.from(0)); + + } + + @Test + void 사다리_일반_생성_결과_확인(){ + //given + + LadderGame ladderGame = LadderGameFactory.createLadderGame(numberOfPerson,row); + LadderCreator ladderCreator = ladderGame.getLadderCreator(); + ladderCreator.drawLine(Position.from(0),Position.from(0)); + + //when + ladderGame.run(Position.from(0)); + } + +}