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));