diff --git a/.idea/.gitignore b/.idea/.gitignore index 13566b8..e7a282e 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -6,3 +6,4 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml +/uiDesigner.xml \ No newline at end of file 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/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..5815a4a --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ 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/build.gradle b/build.gradle index d4824b8..1aef661 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'org.jetbrains.kotlin.jvm' } group = 'kuit.com' @@ -15,8 +16,12 @@ dependencies { // Assertj 라이브러리 추가 testImplementation("org.assertj:assertj-core:3.26.3") + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } test { useJUnitPlatform() +} +kotlin { + jvmToolchain(17) } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 2e03fdf..990e017 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,10 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.0.10' + } +} +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} rootProject.name = 'kuit-ladder' diff --git a/src/main/java/ladder/LadderRunner.java b/src/main/java/ladder/LadderRunner.java deleted file mode 100644 index dc1e121..0000000 --- a/src/main/java/ladder/LadderRunner.java +++ /dev/null @@ -1,17 +0,0 @@ -package ladder; - -public class LadderRunner { - - private final Row[] rows; - - public LadderRunner(Row[] rows) { - this.rows = rows; - } - - public int run(Position position) { - for (int i = 0; i < rows.length; i++) { - rows[i].nextPosition(position); - } - return position.getValue(); - } -} diff --git a/src/main/java/ladder/LadderSize.java b/src/main/java/ladder/LadderSize.java new file mode 100644 index 0000000..544d180 --- /dev/null +++ b/src/main/java/ladder/LadderSize.java @@ -0,0 +1,23 @@ +package ladder; + +public class LadderSize { + private final GreaterThanOne numberOfPerson; + private final GreaterThanOne numberOfRow; + + public LadderSize(GreaterThanOne numberOfRow, GreaterThanOne numberOfPerson) { + this.numberOfPerson = numberOfPerson; + this.numberOfRow = numberOfRow; + } + + public int calLineSize() { + return (int)(numberOfPerson.getNumber()*numberOfRow.getNumber()*0.3); + } + + public GreaterThanOne getNumberOfPerson() { + return numberOfPerson; + } + + public GreaterThanOne getNumberOfRow() { + return numberOfRow; + } +} diff --git a/src/main/java/ladder/Node.java b/src/main/java/ladder/Node.java index 3291e62..85e3fe8 100644 --- a/src/main/java/ladder/Node.java +++ b/src/main/java/ladder/Node.java @@ -25,6 +25,10 @@ public void move(Position position) { } } + public void printNode(StringBuilder sb) { + sb.append(direction.getValue()); + } + public void setRightNode() { direction = RIGHT; } diff --git a/src/main/java/ladder/Position.java b/src/main/java/ladder/Position.java index fdaa2dd..43fdbb7 100644 --- a/src/main/java/ladder/Position.java +++ b/src/main/java/ladder/Position.java @@ -43,4 +43,8 @@ private static void validatePosition(int position) { private static boolean isPosition(int position) { return position >= 0; } + + public boolean isSamePosition(int i) { + return this.position == i; + } } diff --git a/src/main/java/ladder/PositionPair.java b/src/main/java/ladder/PositionPair.java new file mode 100644 index 0000000..e95ec73 --- /dev/null +++ b/src/main/java/ladder/PositionPair.java @@ -0,0 +1,11 @@ +package ladder; + +public class PositionPair { + private final int col; + private final int row; + + public PositionPair(int row, int col) { + this.col = col; + this.row = row; + } +} diff --git a/src/main/java/ladder/Row.java b/src/main/java/ladder/Row.java index 1be0477..9383183 100644 --- a/src/main/java/ladder/Row.java +++ b/src/main/java/ladder/Row.java @@ -58,4 +58,25 @@ private boolean isLineAtNextPosition(Position position) { return lineAtPosition; } + public void printRow(StringBuilder sb) { + for (int i = 0; i < nodes.length; i++) { + nodes[i].printNode(sb); + sb.append(" "); + } + sb.append("\n"); + } + + public void printStarRow(Position position, StringBuilder sb) { + for (int i = 0; i < nodes.length; i++) { + nodes[i].printNode(sb); + + if (position.isSamePosition(i)) { + sb.append("*"); + } + + sb.append(" "); + } + sb.append("\n"); + } + } \ No newline at end of file diff --git a/src/main/java/ladder/TimePeriod.java b/src/main/java/ladder/TimePeriod.java new file mode 100644 index 0000000..906e46f --- /dev/null +++ b/src/main/java/ladder/TimePeriod.java @@ -0,0 +1,15 @@ +package ladder; + +public enum TimePeriod { + BEFORE("Before"), AFTER("After"); + + private final String timePeriod; + + TimePeriod(String timePeriod) { + this.timePeriod = timePeriod; + } + + public String getTimePeriod() { + return timePeriod; + } +} diff --git a/src/main/java/ladder/creator/AutoLadderCreator.java b/src/main/java/ladder/creator/AutoLadderCreator.java new file mode 100644 index 0000000..245ec42 --- /dev/null +++ b/src/main/java/ladder/creator/AutoLadderCreator.java @@ -0,0 +1,68 @@ +package ladder.creator; + +import ladder.*; + +import java.util.HashSet; +import java.util.Random; + +public class AutoLadderCreator implements LadderCreator { + + private final Row[] rows; + + public AutoLadderCreator(LadderSize ladderSize) { + GreaterThanOne numberOfRow = ladderSize.getNumberOfRow(); + GreaterThanOne numberOfPerson = ladderSize.getNumberOfPerson(); + + rows = new Row[numberOfRow.getNumber()]; + for (int i = 0; i < numberOfRow.getNumber(); i++) { + rows[i] = new Row(numberOfPerson); + } + + drawAutoRandomLine(ladderSize, numberOfPerson, numberOfRow); + } + + private void drawAutoRandomLine(LadderSize ladderSize, GreaterThanOne numberOfPerson, GreaterThanOne numberOfRow) { + //생성해야 하는 line 개수 + int lineSize = ladderSize.calLineSize(); + + HashSet set = new HashSet<>(); + Random random = new Random(); + + int count = 0; + + while (count < lineSize) { + //0~numberOfPerson-2 사이의 난수 생성 => 왼쪽에만 생성되기 때문에 2를 뺌! + int col = random.nextInt(numberOfPerson.getNumber()-1); + + //0~numberOfRow-1 사이의 난수 생성 + int row = random.nextInt(numberOfRow.getNumber()); + PositionPair pair = new PositionPair(row, col); + + //중복 확인 + if(set.contains(pair)) { + continue; + } + + try{ + this.drawLine(Position.from(row), Position.from(col)); + set.add(pair); + count++; + } catch (IllegalArgumentException e) { + continue; + } + + + } + } + + @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..75f9d94 100644 --- a/src/main/java/ladder/creator/LadderCreator.java +++ b/src/main/java/ladder/creator/LadderCreator.java @@ -4,22 +4,9 @@ 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); - } - } - - public void drawLine(Position row, Position col) { - rows[row.getValue()].drawLine(col); - } - - public Row[] getRows() { - return rows; - } + Row[] getRows(); } diff --git a/src/main/java/ladder/creator/ManualLadderCreator.java b/src/main/java/ladder/creator/ManualLadderCreator.java new file mode 100644 index 0000000..e4815a4 --- /dev/null +++ b/src/main/java/ladder/creator/ManualLadderCreator.java @@ -0,0 +1,33 @@ +package ladder.creator; + +import ladder.GreaterThanOne; +import ladder.LadderSize; +import ladder.Position; +import ladder.Row; + +public class ManualLadderCreator implements LadderCreator { + + private final Row[] rows; + + public ManualLadderCreator(LadderSize ladderSize) { + GreaterThanOne numberOfPerson = ladderSize.getNumberOfPerson(); + GreaterThanOne numberOfRow = ladderSize.getNumberOfRow(); + + 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/LadderGame.java b/src/main/java/ladder/game/LadderGame.java similarity index 76% rename from src/main/java/ladder/LadderGame.java rename to src/main/java/ladder/game/LadderGame.java index 717458e..f240d19 100644 --- a/src/main/java/ladder/LadderGame.java +++ b/src/main/java/ladder/game/LadderGame.java @@ -1,5 +1,6 @@ -package ladder; +package ladder.game; +import ladder.Position; import ladder.creator.LadderCreator; public class LadderGame { @@ -15,4 +16,8 @@ public int run(Position position) { ladderRunner.run(position); return position.getValue(); } + + public LadderCreator getLadderCreator() { + return ladderCreator; + } } diff --git a/src/main/java/ladder/game/LadderGameFactory.java b/src/main/java/ladder/game/LadderGameFactory.java new file mode 100644 index 0000000..b8248cb --- /dev/null +++ b/src/main/java/ladder/game/LadderGameFactory.java @@ -0,0 +1,23 @@ +package ladder.game; + +import ladder.LadderSize; +import ladder.creator.AutoLadderCreator; +import ladder.creator.LadderCreator; +import ladder.creator.ManualLadderCreator; + +public class LadderGameFactory { + + private static LadderCreator ladderCreator; + + public static LadderGame createRandomLadderGame(LadderSize ladderSize) { + ladderCreator = new AutoLadderCreator(ladderSize); + return new LadderGame(ladderCreator); + } + + public static LadderGame createLadderGame(LadderSize ladderSize) { + ladderCreator = new ManualLadderCreator(ladderSize); + return new LadderGame(ladderCreator); + } + + +} diff --git a/src/main/java/ladder/game/LadderRunner.java b/src/main/java/ladder/game/LadderRunner.java new file mode 100644 index 0000000..1e7d6a8 --- /dev/null +++ b/src/main/java/ladder/game/LadderRunner.java @@ -0,0 +1,46 @@ +package ladder.game; + +import ladder.Position; +import ladder.Row; + +import static ladder.TimePeriod.*; + +public class LadderRunner { + + private final Row[] rows; + + public LadderRunner(Row[] rows) { + this.rows = rows; + } + + public int run(Position position) { + StringBuilder sb = new StringBuilder(); + for (int running_row = 0; running_row < rows.length; running_row++) { + //Before + sb.append(BEFORE.getTimePeriod() + "\n"); + printLadder(position, running_row, sb); + + rows[running_row].nextPosition(position); + + //After + sb.append(AFTER.getTimePeriod() + "\n"); + printLadder(position, running_row, sb); + } + System.out.println(sb); + return position.getValue(); + } + + private void printLadder(Position position, int running_row, StringBuilder sb) { + for (int i = 0; i < rows.length; i++) { + if (isSameRow(running_row, i)) { + rows[i].printStarRow(position, sb); + continue; + } + rows[i].printRow(sb); + } + } + + private static boolean isSameRow(int running_row, int i) { + return running_row == i; + } +} diff --git a/src/test/java/ladder/LadderGameFactoryTest.java b/src/test/java/ladder/LadderGameFactoryTest.java new file mode 100644 index 0000000..303edd9 --- /dev/null +++ b/src/test/java/ladder/LadderGameFactoryTest.java @@ -0,0 +1,35 @@ +package ladder; + +import ladder.game.LadderGame; +import ladder.game.LadderGameFactory; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class LadderGameFactoryTest { + + + @Test + public void 랜덤사다리_생성() throws Exception { + //given + LadderSize ladderSize = new LadderSize(GreaterThanOne.from(3), GreaterThanOne.from(3)); + LadderGame ladderGame = LadderGameFactory.createRandomLadderGame(ladderSize); + + //when + + //then + Assertions.assertThat(ladderGame).isNotNull(); + } + + @Test + public void 랜덤사다리_게임_실행() throws Exception { + //given + LadderSize ladderSize = new LadderSize(GreaterThanOne.from(4), GreaterThanOne.from(4)); + LadderGame ladderGame = LadderGameFactory.createRandomLadderGame(ladderSize); + + //when + ladderGame.run(Position.from(0)); + + //then +// Assertions.assertThat(ladderGame.run(Position.from(0))).isEqualTo(0); + } +} \ No newline at end of file diff --git a/src/test/java/ladder/LadderGameTest.java b/src/test/java/ladder/LadderGameTest.java index aa93e5f..341a718 100644 --- a/src/test/java/ladder/LadderGameTest.java +++ b/src/test/java/ladder/LadderGameTest.java @@ -1,6 +1,9 @@ package ladder; import ladder.creator.LadderCreator; +import ladder.creator.ManualLadderCreator; +import ladder.game.LadderGame; +import ladder.game.LadderGameFactory; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; @@ -10,11 +13,10 @@ class LadderGameTest { @Test void 사다리_생성_확인() { //given - GreaterThanOne numberOfRow = GreaterThanOne.from(3); - GreaterThanOne numberOfPerson = GreaterThanOne.from(5); + LadderSize ladderSize = new LadderSize(GreaterThanOne.from(3), GreaterThanOne.from(5)); //when - LadderCreator ladderCreator = new LadderCreator(numberOfRow, numberOfPerson); + LadderCreator ladderCreator = new ManualLadderCreator(ladderSize); //then assertThat(ladderCreator).isNotNull(); @@ -23,9 +25,8 @@ class LadderGameTest { @Test void 사다리_사람_예외_처리_확인() { //when - GreaterThanOne numberOfPerson = GreaterThanOne.from(3); - LadderCreator ladderCreator = new LadderCreator(GreaterThanOne.from(2), numberOfPerson); - LadderGame ladderGame = new LadderGame(ladderCreator); + LadderSize ladderSize = new LadderSize(GreaterThanOne.from(2), GreaterThanOne.from(3)); + LadderGame ladderGame = LadderGameFactory.createLadderGame(ladderSize); //given Position position = Position.from(4); @@ -40,8 +41,10 @@ class LadderGameTest { //when GreaterThanOne numberOfPerson = GreaterThanOne.from(4); GreaterThanOne row = GreaterThanOne.from(3); - LadderCreator ladderCreator = new LadderCreator(row, numberOfPerson); - LadderGame ladderGame = new LadderGame(ladderCreator); + LadderSize ladderSize = new LadderSize(GreaterThanOne.from(3), GreaterThanOne.from(4)); + LadderGame ladderGame = LadderGameFactory.createLadderGame(ladderSize); + + LadderCreator ladderCreator = ladderGame.getLadderCreator(); ladderCreator.drawLine(Position.from(0),Position.from(0)); ladderCreator.drawLine(Position.from(1),Position.from(1));