From 3487e3d6c8c50685187d7066fd9d796d66d58f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Wed, 17 May 2023 22:50:42 +0900 Subject: [PATCH 01/14] =?UTF-8?q?docs:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/README.md | 32 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/main/java/nextstep/ladder/README.md b/src/main/java/nextstep/ladder/README.md index 3abdd4cffe..c78e0a6597 100644 --- a/src/main/java/nextstep/ladder/README.md +++ b/src/main/java/nextstep/ladder/README.md @@ -1,12 +1,28 @@ -LadderGame -플레이어 추가 -사다이 추가 -라인 추가 +# 3단계 - 사다리(게임 실행) + +## 기능 요구사항 +- 사다리 실행 결과를 출력해야 한다. +- 개인별 이름을 입력하면 개인별 결과를 출력하고, "all"을 입력하면 전체 참여자의 실행 결과를 출력한다. + +## 프로그래밍 요구사항 +- 자바 8의 스트림과 람다를 적용해 프로그래밍한다. +- 규칙 6: 모든 엔티티를 작게 유지한다. +- 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. + +--- + +### LadderGame +-[X] 플레이어 추가 +-[X] 사다리 저장 +-[ ] 플레이어 결과 구하기 InputView -참여할 사람 이름 입력 -최대 사다리 높이 입력 +-[X] 참여할 사람 이름 입력 +-[X] 최대 사다리 높이 입력 +-[ ] 실행 결과 입력 ResultView -플레이어 이름 출력 -사다리 출력 +-[X] 플레이어 이름 출력 +-[X] 사다리 출력 +-[ ] 결과를 보고 싶은 사람 출력 +-[ ] 실행 결과 출력 From 790dd79c3e91b445e37dbf4634e517c4199710b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Wed, 17 May 2023 22:52:08 +0900 Subject: [PATCH 02/14] =?UTF-8?q?refactor:=20LadderGame=20=EC=BD=94?= =?UTF-8?q?=EB=A9=98=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index d54539c39f..6b708ac10f 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -13,8 +13,6 @@ public class LadderGame { private static final String NAME_REX_PATTERN = ","; - private final List players = new ArrayList<>(); - private Ladder ladder; public static void main(String[] args) { @@ -24,22 +22,24 @@ public static void main(String[] args) { public void run() { - inputPlayers(); + List players = new ArrayList<>(); + + inputPlayers(players); - saveLadder(new Ladder(inputLadderHeight(), this.players.size())); + saveLadder(new Ladder(inputLadderHeight(), players.size())); - ResultView.printResult(this.players, ladder.getLines()); + ResultView.printResult(players, ladder.getLines()); } - private void inputPlayers() { - addPlayers(InputView.inputPlayers()); + private void inputPlayers(List players) { + addPlayers(players, InputView.inputPlayers()); } - private void addPlayers(String players) { - Arrays.stream(players.split(NAME_REX_PATTERN)) + private void addPlayers(List players, String inputPlayers) { + Arrays.stream(inputPlayers.split(NAME_REX_PATTERN)) .map(Player::new) - .forEach(this.players::add); + .forEach(players::add); } private int inputLadderHeight() { From 620051ce5ddb8db06b5559667e52dd7346e05398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Thu, 18 May 2023 22:16:04 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=EC=8B=A4=ED=96=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 10 +++------ .../java/nextstep/ladder/domain/Result.java | 21 +++++++++++++++++++ .../java/nextstep/ladder/view/InputView.java | 6 ++++++ 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 src/main/java/nextstep/ladder/domain/Result.java diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 6b708ac10f..f19f84223c 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -24,7 +24,7 @@ public void run() { List players = new ArrayList<>(); - inputPlayers(players); + inputPlayers(players, InputView.inputPlayers()); saveLadder(new Ladder(inputLadderHeight(), players.size())); @@ -32,8 +32,8 @@ public void run() { } - private void inputPlayers(List players) { - addPlayers(players, InputView.inputPlayers()); + private void inputPlayers(List players, String inputPlayers) { + addPlayers(players, inputPlayers); } private void addPlayers(List players, String inputPlayers) { @@ -42,10 +42,6 @@ private void addPlayers(List players, String inputPlayers) { .forEach(players::add); } - private int inputLadderHeight() { - return InputView.inputLadderHeight(); - } - private void saveLadder(Ladder ladder) { this.ladder = ladder; } diff --git a/src/main/java/nextstep/ladder/domain/Result.java b/src/main/java/nextstep/ladder/domain/Result.java new file mode 100644 index 0000000000..9ada948a12 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Result.java @@ -0,0 +1,21 @@ +package nextstep.ladder.domain; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Result { + + private static final String RESULT_REX_PATTERN = ","; + + private final List values; + + public Result(String values) { + this.values = Arrays.asList(values.split(RESULT_REX_PATTERN)); + } + + public List getValues() { + return Collections.unmodifiableList(values); + } + +} diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java index af7bfb5c0b..2d05e74337 100644 --- a/src/main/java/nextstep/ladder/view/InputView.java +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -7,6 +7,7 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); private static final String INPUT_PLAYERS_NAME_TEXT = "참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"; private static final String INPUT_LADDER_HEIGHT_TEXT = "최대 사다리 높이는 몇 개인가요?"; + private static final String INPUT_RESULT_TEXT = "실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"; public static String inputPlayers() { System.out.println(INPUT_PLAYERS_NAME_TEXT); return scanner.nextLine(); @@ -17,4 +18,9 @@ public static int inputLadderHeight() { return Integer.parseInt(scanner.nextLine()); } + public static String inputResult() { + System.out.println(INPUT_RESULT_TEXT); + return scanner.nextLine(); + } + } From 7472f1124fb63aca15923f0130adbe864e28deb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Thu, 18 May 2023 22:16:18 +0900 Subject: [PATCH 04/14] =?UTF-8?q?docs:=20=EB=AC=B8=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/nextstep/ladder/README.md b/src/main/java/nextstep/ladder/README.md index c78e0a6597..6f868be1f4 100644 --- a/src/main/java/nextstep/ladder/README.md +++ b/src/main/java/nextstep/ladder/README.md @@ -19,10 +19,10 @@ InputView -[X] 참여할 사람 이름 입력 -[X] 최대 사다리 높이 입력 --[ ] 실행 결과 입력 +-[X] 실행 결과 입력 +-[ ] 결과를 보고 싶은 사람 입력 ResultView -[X] 플레이어 이름 출력 -[X] 사다리 출력 --[ ] 결과를 보고 싶은 사람 출력 -[ ] 실행 결과 출력 From 22cce2b7867fd4bcad3d25874581ebe6cb8e6b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Thu, 18 May 2023 22:17:05 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20=EC=8B=A4=ED=96=89=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 7 +++++-- src/main/java/nextstep/ladder/view/ResultView.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index f19f84223c..763ce0e2e3 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -2,6 +2,7 @@ import nextstep.ladder.domain.Ladder; import nextstep.ladder.domain.Player; +import nextstep.ladder.domain.Result; import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; @@ -26,9 +27,11 @@ public void run() { inputPlayers(players, InputView.inputPlayers()); - saveLadder(new Ladder(inputLadderHeight(), players.size())); + Result result = new Result(InputView.inputResult()); - ResultView.printResult(players, ladder.getLines()); + saveLadder(new Ladder(InputView.inputLadderHeight(), players.size())); + + ResultView.printResult(players, ladder.getLines(), result); } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index a592e13004..75dd8198d8 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -2,6 +2,7 @@ import nextstep.ladder.domain.Line; import nextstep.ladder.domain.Player; +import nextstep.ladder.domain.Result; import java.util.List; @@ -14,7 +15,7 @@ public class ResultView { private static final String NAME_LENGTH_FIVE_FORMAT_PATTERN = "%-5s"; private static final String RESULT_TEXT = "실행결과"; - public static void printResult(List players, List lines) { + public static void printResult(List players, List lines, Result result) { printResultText(); printPlayerName(players); printLadderLine(lines); From 32bf73299929204ed4dc680009a5853ca95bad6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sun, 21 May 2023 15:00:22 +0900 Subject: [PATCH 06/14] =?UTF-8?q?refactor:=20=EC=BD=94=EB=A9=98=ED=8A=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 21 +++++++++++++--- .../java/nextstep/ladder/domain/Ladder.java | 20 ++++++++------- .../java/nextstep/ladder/domain/Line.java | 25 ++++++++++--------- .../java/nextstep/ladder/util/RandomUtil.java | 19 ++++++++++++-- .../java/nextstep/ladder/view/ResultView.java | 2 +- .../nextstep/ladder/domain/LadderTest.java | 4 +-- .../java/nextstep/ladder/domain/LineTest.java | 5 ++-- 7 files changed, 64 insertions(+), 32 deletions(-) diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 763ce0e2e3..226dc1d170 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -1,14 +1,17 @@ package nextstep.ladder; import nextstep.ladder.domain.Ladder; +import nextstep.ladder.domain.Line; import nextstep.ladder.domain.Player; import nextstep.ladder.domain.Result; +import nextstep.ladder.util.RandomUtil; import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.IntStream; public class LadderGame { @@ -27,11 +30,11 @@ public void run() { inputPlayers(players, InputView.inputPlayers()); - Result result = new Result(InputView.inputResult()); +// Result result = new Result(InputView.inputResult()); - saveLadder(new Ladder(InputView.inputLadderHeight(), players.size())); - - ResultView.printResult(players, ladder.getLines(), result); + saveLadder(new Ladder(InputView.inputLadderHeight())); + addLines(ladder.getHeight(), players.size()); + ResultView.printResult(players, ladder.getLines()); } @@ -49,4 +52,14 @@ private void saveLadder(Ladder ladder) { this.ladder = ladder; } + private void addLines(int height, int width) { + IntStream.range(0, height) + .mapToObj(i -> new Line(() -> RandomUtil.generatorPoints(width - 1))) + .forEach(this::addLine); + } + + private void addLine(Line line) { + this.ladder.addLine(line); + } + } diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index 3327d3aa1f..b989d5d6ae 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -9,18 +9,20 @@ public class Ladder { - private List lines; + private List lines = new ArrayList<>(); - public Ladder(int height, int width) { - addLine(height, width); + private int height; + + public Ladder(int height) { + this.height = height; + } + + public void addLine(Line line) { + lines.add(line); } - private void addLine(int height, int width) { - List lines = new ArrayList<>(); - IntStream.range(0, height) - .mapToObj(i -> new Line(width)) - .forEach(lines::add); - this.lines = lines; + public int getHeight() { + return height; } public List getLines() { diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index e753896511..9d67901de8 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -4,26 +4,27 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; import java.util.stream.IntStream; public class Line { private final List points; - public Line(int countOfPerson) { - List points = new ArrayList<>(); - IntStream.range(0, countOfPerson - 1) - .forEach(index -> addPoint(points, index)); - this.points = points; + public Line(Supplier> supplierPoints) { +// List points = new ArrayList<>(); +// IntStream.range(0, countOfPerson - 1) +// .forEach(index -> addPoint(points, index)); + this.points = supplierPoints.get(); } - private void addPoint(List points, int index) { - if (index == 0 || !points.get(index - 1)) { - points.add(RandomUtil.generator()); - return; - } - points.add(false); - } +// private void addPoint(List points, int index) { +// if (index == 0 || !points.get(index - 1)) { +// points.add(RandomUtil.generator()); +// return; +// } +// points.add(false); +// } public List getPoints() { return points; diff --git a/src/main/java/nextstep/ladder/util/RandomUtil.java b/src/main/java/nextstep/ladder/util/RandomUtil.java index ffd07246a3..052cebd810 100644 --- a/src/main/java/nextstep/ladder/util/RandomUtil.java +++ b/src/main/java/nextstep/ladder/util/RandomUtil.java @@ -1,12 +1,27 @@ package nextstep.ladder.util; +import java.util.ArrayList; +import java.util.List; import java.util.Random; +import java.util.stream.IntStream; public class RandomUtil { private static final Random random = new Random(); - public static boolean generator() { - return random.nextBoolean(); + + public static List generatorPoints(int count) { + List points = new ArrayList<>(); + IntStream.range(0, count) + .forEach(index -> addPoint(points, index, random.nextBoolean())); + return points; + } + + private static void addPoint(List points, int index, boolean point) { + if (index == 0 || !points.get(index - 1)) { + points.add(point); + return; + } + points.add(false); } } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index 75dd8198d8..a53fcb36e4 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -15,7 +15,7 @@ public class ResultView { private static final String NAME_LENGTH_FIVE_FORMAT_PATTERN = "%-5s"; private static final String RESULT_TEXT = "실행결과"; - public static void printResult(List players, List lines, Result result) { + public static void printResult(List players, List lines) { printResultText(); printPlayerName(players); printLadderLine(lines); diff --git a/src/test/java/nextstep/ladder/domain/LadderTest.java b/src/test/java/nextstep/ladder/domain/LadderTest.java index 303a26e5df..85c5940b90 100644 --- a/src/test/java/nextstep/ladder/domain/LadderTest.java +++ b/src/test/java/nextstep/ladder/domain/LadderTest.java @@ -8,12 +8,12 @@ public class LadderTest { @Test void create() { - Ladder ladder = new Ladder(5, 4); + Ladder ladder = new Ladder(5); assertThat(ladder.getLines()).hasSize(5); ladder.getLines().forEach(line -> { assertThat(line.getPoints()).hasSize(3); }); - Ladder ladder2 = new Ladder(8, 6); + Ladder ladder2 = new Ladder(8); assertThat(ladder2.getLines()).hasSize(8); ladder2.getLines().forEach(line -> { assertThat(line.getPoints()).hasSize(5); diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java index 328d662f11..070f4e7933 100644 --- a/src/test/java/nextstep/ladder/domain/LineTest.java +++ b/src/test/java/nextstep/ladder/domain/LineTest.java @@ -1,5 +1,6 @@ package nextstep.ladder.domain; +import nextstep.ladder.util.RandomUtil; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -8,9 +9,9 @@ public class LineTest { @Test void createLine() { - Line line1 = new Line(3); + Line line1 = new Line(() -> RandomUtil.generatorPoints(2)); assertThat(line1.getPoints()).hasSize(2); - Line line2 = new Line(5); + Line line2 = new Line(() -> RandomUtil.generatorPoints(4)); assertThat(line2.getPoints()).hasSize(4); } From fb362d042189b166bb869dd6463a37e0a2803d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sun, 21 May 2023 19:32:39 +0900 Subject: [PATCH 07/14] =?UTF-8?q?refactor:=20=EB=86=92=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/domain/Ladder.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index b989d5d6ae..7214293452 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -1,19 +1,22 @@ package nextstep.ladder.domain; -import nextstep.ladder.util.RandomUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.IntStream; public class Ladder { + private static final String HEIGHT_ERROR_MESSAGE = "높이는 0보다 커야 합니다."; + private List lines = new ArrayList<>(); private int height; public Ladder(int height) { + if (1 > height) { + throw new IllegalArgumentException(HEIGHT_ERROR_MESSAGE); + } this.height = height; } From de3f109ef9900d8f695d1d028ccd41ed234e4cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sun, 21 May 2023 19:34:37 +0900 Subject: [PATCH 08/14] =?UTF-8?q?test:=20=EB=86=92=EC=9D=B4=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/nextstep/ladder/domain/LadderTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/nextstep/ladder/domain/LadderTest.java b/src/test/java/nextstep/ladder/domain/LadderTest.java index 85c5940b90..521938e6b8 100644 --- a/src/test/java/nextstep/ladder/domain/LadderTest.java +++ b/src/test/java/nextstep/ladder/domain/LadderTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LadderTest { @@ -20,4 +21,11 @@ void create() { }); } + @Test + void height() { + assertThatThrownBy(() -> { + Ladder ladder = new Ladder(0); + }).hasMessageContaining("높이는 0보다 커야 합니다."); + } + } From d4acc2bc2da88d27956daff0d56e59e548c9a500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sun, 21 May 2023 19:36:45 +0900 Subject: [PATCH 09/14] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 38 +++++++++++++++---- src/main/java/nextstep/ladder/README.md | 6 +-- .../java/nextstep/ladder/domain/Line.java | 23 ++++++----- .../java/nextstep/ladder/domain/Player.java | 36 ++++++++++++++++++ .../java/nextstep/ladder/domain/Result.java | 4 ++ .../java/nextstep/ladder/view/InputView.java | 5 +++ .../java/nextstep/ladder/view/ResultView.java | 29 ++++++++++---- 7 files changed, 114 insertions(+), 27 deletions(-) diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 226dc1d170..08d8c400f2 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -8,17 +8,19 @@ import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import java.util.stream.IntStream; public class LadderGame { private static final String NAME_REX_PATTERN = ","; + private static final String ALL_PLAYER = "all"; + private Ladder ladder; + private Result result; + public static void main(String[] args) { LadderGame game = new LadderGame(); game.run(); @@ -30,11 +32,15 @@ public void run() { inputPlayers(players, InputView.inputPlayers()); -// Result result = new Result(InputView.inputResult()); + result = new Result(InputView.inputResult()); saveLadder(new Ladder(InputView.inputLadderHeight())); - addLines(ladder.getHeight(), players.size()); - ResultView.printResult(players, ladder.getLines()); + addLadderLines(ladder.getHeight(), players.size()); + + ResultView.printLadderResult(players, ladder.getLines(), result); + + String inputPlayer = InputView.inputPlayer(); + printPlayerResult(inputPlayer, players); } @@ -52,7 +58,7 @@ private void saveLadder(Ladder ladder) { this.ladder = ladder; } - private void addLines(int height, int width) { + private void addLadderLines(int height, int width) { IntStream.range(0, height) .mapToObj(i -> new Line(() -> RandomUtil.generatorPoints(width - 1))) .forEach(this::addLine); @@ -62,4 +68,22 @@ private void addLine(Line line) { this.ladder.addLine(line); } + private void printPlayerResult(String inputPlayer, List players) { + + ResultView.printResultText(); + + if (ALL_PLAYER.equals(inputPlayer)) { + IntStream.range(0, players.size()).forEach(index -> printPlayerResultWithName(index, players.get(index))); + return; + } + + int point = players.indexOf(new Player(inputPlayer)); + ResultView.printPlayerResult(result.getValue(players.get(point).getPlayerResultIndex(point, ladder))); + + } + + private void printPlayerResultWithName(int index, Player player) { + ResultView.printPlayerResultWithName(player.getName(), result.getValue(player.getPlayerResultIndex(index, ladder))); + } + } diff --git a/src/main/java/nextstep/ladder/README.md b/src/main/java/nextstep/ladder/README.md index 6f868be1f4..709876c688 100644 --- a/src/main/java/nextstep/ladder/README.md +++ b/src/main/java/nextstep/ladder/README.md @@ -14,15 +14,15 @@ ### LadderGame -[X] 플레이어 추가 -[X] 사다리 저장 --[ ] 플레이어 결과 구하기 +-[X] 플레이어 결과 구하기 InputView -[X] 참여할 사람 이름 입력 -[X] 최대 사다리 높이 입력 -[X] 실행 결과 입력 --[ ] 결과를 보고 싶은 사람 입력 +-[X] 결과를 보고 싶은 사람 입력 ResultView -[X] 플레이어 이름 출력 -[X] 사다리 출력 --[ ] 실행 결과 출력 +-[X] 실행 결과 출력 diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index 9d67901de8..659eda6c5c 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -12,19 +12,22 @@ public class Line { private final List points; public Line(Supplier> supplierPoints) { -// List points = new ArrayList<>(); -// IntStream.range(0, countOfPerson - 1) -// .forEach(index -> addPoint(points, index)); this.points = supplierPoints.get(); } -// private void addPoint(List points, int index) { -// if (index == 0 || !points.get(index - 1)) { -// points.add(RandomUtil.generator()); -// return; -// } -// points.add(false); -// } + public boolean hasLeftPoint(int currentPlayerPoint) { + if (currentPlayerPoint == 0) { + return false; + } + return points.get(currentPlayerPoint - 1); + } + + public boolean hasRightPoint(int currentPlayerPoint) { + if (points.size() == currentPlayerPoint || points.size() < currentPlayerPoint) { + return false; + } + return points.get(currentPlayerPoint); + } public List getPoints() { return points; diff --git a/src/main/java/nextstep/ladder/domain/Player.java b/src/main/java/nextstep/ladder/domain/Player.java index 3698c0bbcb..ad6a174636 100644 --- a/src/main/java/nextstep/ladder/domain/Player.java +++ b/src/main/java/nextstep/ladder/domain/Player.java @@ -1,5 +1,7 @@ package nextstep.ladder.domain; +import java.util.Objects; + public class Player { private static final String NAME_OVER_LENGTH_ERROR_TEXT = "사람에 이름을 최대5글자까지 가능합니다."; @@ -17,4 +19,38 @@ public String getName() { return name; } + public int getPlayerResultIndex(int currentPoint, Ladder ladder) { + int point = currentPoint; + for (int index = 0; index < ladder.getHeight(); index++) { + point = calculationPoint(index, point, ladder); + } + return point; + } + + private int calculationPoint(int lineIndex, int point, Ladder ladder) { + Line line = ladder.getLines().get(lineIndex); + if (line.hasLeftPoint(point)) { + return point - 1; + } + if (line.hasRightPoint(point)) { + return point + 1; + } + return point; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Player player = (Player) o; + + return Objects.equals(name, player.name); + } + + @Override + public int hashCode() { + return name != null ? name.hashCode() : 0; + } + } diff --git a/src/main/java/nextstep/ladder/domain/Result.java b/src/main/java/nextstep/ladder/domain/Result.java index 9ada948a12..645f550a85 100644 --- a/src/main/java/nextstep/ladder/domain/Result.java +++ b/src/main/java/nextstep/ladder/domain/Result.java @@ -14,6 +14,10 @@ public Result(String values) { this.values = Arrays.asList(values.split(RESULT_REX_PATTERN)); } + public String getValue(int index) { + return values.get(index); + } + public List getValues() { return Collections.unmodifiableList(values); } diff --git a/src/main/java/nextstep/ladder/view/InputView.java b/src/main/java/nextstep/ladder/view/InputView.java index 2d05e74337..970ac1d589 100644 --- a/src/main/java/nextstep/ladder/view/InputView.java +++ b/src/main/java/nextstep/ladder/view/InputView.java @@ -8,6 +8,7 @@ public class InputView { private static final String INPUT_PLAYERS_NAME_TEXT = "참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요)"; private static final String INPUT_LADDER_HEIGHT_TEXT = "최대 사다리 높이는 몇 개인가요?"; private static final String INPUT_RESULT_TEXT = "실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요)"; + private static final String INPUT_PLAYER_TEXT = "결과를 보고 싶은 사람은?"; public static String inputPlayers() { System.out.println(INPUT_PLAYERS_NAME_TEXT); return scanner.nextLine(); @@ -23,4 +24,8 @@ public static String inputResult() { return scanner.nextLine(); } + public static String inputPlayer() { + System.out.println(INPUT_PLAYER_TEXT); + return scanner.nextLine(); + } } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index a53fcb36e4..4ce8cb619b 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -14,20 +14,21 @@ public class ResultView { private static final String VERTICAL_LINE = "|"; private static final String NAME_LENGTH_FIVE_FORMAT_PATTERN = "%-5s"; private static final String RESULT_TEXT = "실행결과"; + private static final String PLAYER_NAME_AND_RESULT_TEXT = "%s : %s"; - public static void printResult(List players, List lines) { - printResultText(); + public static void printLadderResult(List players, List lines, Result result) { printPlayerName(players); printLadderLine(lines); + printResultValues(result.getValues()); } - private static void printResultText() { + public static void printResultText() { System.out.println(RESULT_TEXT); } - private static void printPlayerName(List playerList) { + private static void printPlayerName(List players) { StringBuilder sb = new StringBuilder(); - playerList.stream().map(Player::getName).forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); + players.stream().map(Player::getName).forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); System.out.println(sb.toString()); } @@ -35,10 +36,10 @@ private static void printLadderLine(List lines) { lines.forEach(line -> System.out.println(getLineText(line.getPoints()))); } - private static String getLineText(List pointList) { + private static String getLineText(List points) { StringBuilder sb = new StringBuilder(); sb.append(SPACE_START_HORIZONTAL_LINE); - pointList.forEach(hasHorizontalLine -> getHorizontalLine(sb, hasHorizontalLine)); + points.forEach(hasHorizontalLine -> getHorizontalLine(sb, hasHorizontalLine)); sb.append(VERTICAL_LINE); return sb.toString(); } @@ -53,4 +54,18 @@ private static void getHorizontalLine(StringBuilder sb, boolean hasHorizontalLin } } + private static void printResultValues(List values) { + StringBuilder sb = new StringBuilder(); + values.stream().forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); + System.out.println(sb.toString()); + } + + public static void printPlayerResult(String result) { + System.out.println(result); + } + + public static void printPlayerResultWithName(String playerName, String result) { + System.out.println(String.format(PLAYER_NAME_AND_RESULT_TEXT, playerName, result)); + } + } From 7084fb4dd213a332fd1a5c1d1f76d1ad6a7492a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sun, 21 May 2023 19:42:37 +0900 Subject: [PATCH 10/14] =?UTF-8?q?test:=20=EA=B2=B0=EA=B3=BC=20=EA=B0=92=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/ladder/domain/PlayerTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/nextstep/ladder/domain/PlayerTest.java b/src/test/java/nextstep/ladder/domain/PlayerTest.java index 84dcfb0d3d..ed52876eb4 100644 --- a/src/test/java/nextstep/ladder/domain/PlayerTest.java +++ b/src/test/java/nextstep/ladder/domain/PlayerTest.java @@ -1,7 +1,11 @@ package nextstep.ladder.domain; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -16,4 +20,26 @@ void create() { }).withMessageMatching("사람에 이름을 최대5글자까지 가능합니다."); } + @DisplayName("결과 테스트") + @Test + void getResult() { + Ladder ladder = new Ladder(5); + ladder.addLine(new Line(() -> Arrays.asList(true, false, true))); + ladder.addLine(new Line(() -> Arrays.asList(false, true, false))); + ladder.addLine(new Line(() -> Arrays.asList(true, false, false))); + ladder.addLine(new Line(() -> Arrays.asList(false, true, false))); + ladder.addLine(new Line(() -> Arrays.asList(true, false, true))); + List players = Arrays.asList( + new Player("pobi"), + new Player("honux"), + new Player("crong"), + new Player("jk") + ); + List results = Arrays.asList("꽝", "5000", "꽝", "3000"); + assertThat(results.get(players.get(0).getPlayerResultIndex(0, ladder))).isEqualTo("꽝"); + assertThat(results.get(players.get(1).getPlayerResultIndex(1, ladder))).isEqualTo("3000"); + assertThat(results.get(players.get(2).getPlayerResultIndex(2, ladder))).isEqualTo("꽝"); + assertThat(results.get(players.get(3).getPlayerResultIndex(3, ladder))).isEqualTo("5000"); + } + } From 606681e4033cc7c1ed50a03c6cb62f0dc32d11a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Thu, 25 May 2023 21:02:51 +0900 Subject: [PATCH 11/14] =?UTF-8?q?refactor:=20=EC=BD=94=EB=A9=98=ED=8A=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 43 ++++--------------- .../java/nextstep/ladder/domain/Ladder.java | 39 +++++++++++++---- .../java/nextstep/ladder/domain/Line.java | 20 ++++++++- .../java/nextstep/ladder/domain/Player.java | 19 -------- .../java/nextstep/ladder/util/RandomUtil.java | 15 +------ .../java/nextstep/ladder/view/ResultView.java | 2 + 6 files changed, 62 insertions(+), 76 deletions(-) diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 08d8c400f2..51d826dfc4 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -1,10 +1,8 @@ package nextstep.ladder; import nextstep.ladder.domain.Ladder; -import nextstep.ladder.domain.Line; import nextstep.ladder.domain.Player; import nextstep.ladder.domain.Result; -import nextstep.ladder.util.RandomUtil; import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; @@ -17,10 +15,6 @@ public class LadderGame { private static final String ALL_PLAYER = "all"; - private Ladder ladder; - - private Result result; - public static void main(String[] args) { LadderGame game = new LadderGame(); game.run(); @@ -32,15 +26,14 @@ public void run() { inputPlayers(players, InputView.inputPlayers()); - result = new Result(InputView.inputResult()); - - saveLadder(new Ladder(InputView.inputLadderHeight())); - addLadderLines(ladder.getHeight(), players.size()); + Result result = new Result(InputView.inputResult()); + Ladder ladder = new Ladder(InputView.inputLadderHeight(), players.size()); +// addLadderLines(ladder.getHeight(), players.size()); ResultView.printLadderResult(players, ladder.getLines(), result); String inputPlayer = InputView.inputPlayer(); - printPlayerResult(inputPlayer, players); + printPlayerResult(result, inputPlayer, players, ladder); } @@ -53,37 +46,19 @@ private void addPlayers(List players, String inputPlayers) { .map(Player::new) .forEach(players::add); } - - private void saveLadder(Ladder ladder) { - this.ladder = ladder; - } - - private void addLadderLines(int height, int width) { - IntStream.range(0, height) - .mapToObj(i -> new Line(() -> RandomUtil.generatorPoints(width - 1))) - .forEach(this::addLine); - } - - private void addLine(Line line) { - this.ladder.addLine(line); - } - - private void printPlayerResult(String inputPlayer, List players) { - - ResultView.printResultText(); - + private void printPlayerResult(Result result, String inputPlayer, List players, Ladder ladder) { if (ALL_PLAYER.equals(inputPlayer)) { - IntStream.range(0, players.size()).forEach(index -> printPlayerResultWithName(index, players.get(index))); + IntStream.range(0, players.size()).forEach(index -> printPlayerResultWithName(result, index, players.get(index), ladder)); return; } int point = players.indexOf(new Player(inputPlayer)); - ResultView.printPlayerResult(result.getValue(players.get(point).getPlayerResultIndex(point, ladder))); + ResultView.printPlayerResult(result.getValue(ladder.getPlayerResultIndex(point))); } - private void printPlayerResultWithName(int index, Player player) { - ResultView.printPlayerResultWithName(player.getName(), result.getValue(player.getPlayerResultIndex(index, ladder))); + private void printPlayerResultWithName(Result result, int index, Player player, Ladder ladder) { + ResultView.printPlayerResultWithName(player.getName(), result.getValue(ladder.getPlayerResultIndex(index))); } } diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index 7214293452..f77cb59dcf 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -1,35 +1,58 @@ package nextstep.ladder.domain; +import nextstep.ladder.util.RandomUtil; + import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.IntStream; public class Ladder { private static final String HEIGHT_ERROR_MESSAGE = "높이는 0보다 커야 합니다."; - private List lines = new ArrayList<>(); + private List lines; private int height; - public Ladder(int height) { + public Ladder(int height, int width) { if (1 > height) { throw new IllegalArgumentException(HEIGHT_ERROR_MESSAGE); } this.height = height; + lines = createLines(width); } - public void addLine(Line line) { - lines.add(line); + public List getLines() { + return Collections.unmodifiableList(this.lines); } - public int getHeight() { - return height; + public int getPlayerResultIndex(int currentPoint) { + int point = currentPoint; + for (int index = 0; index < this.height; index++) { + point = calculationPoint(index, point, this); + } + return point; } - public List getLines() { - return Collections.unmodifiableList(this.lines); + private int calculationPoint(int lineIndex, int point, Ladder ladder) { + Line line = ladder.getLines().get(lineIndex); + if (line.hasLeftPoint(point)) { + return point - 1; + } + if (line.hasRightPoint(point)) { + return point + 1; + } + return point; + } + + private List createLines(int width) { + List lines = new ArrayList<>(); + for (int heightNumber = 0; heightNumber < height; heightNumber++) { + lines.add(new Line(Line.generatePoints(RandomUtil::generator, width - 1))); + } + return lines; } } diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index 659eda6c5c..d9185fb485 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -11,8 +11,8 @@ public class Line { private final List points; - public Line(Supplier> supplierPoints) { - this.points = supplierPoints.get(); + public Line(List points) { + this.points = points; } public boolean hasLeftPoint(int currentPlayerPoint) { @@ -33,4 +33,20 @@ public List getPoints() { return points; } + public static List generatePoints(Supplier pointSupplier, int count) { + List points = new ArrayList<>(); + for (int index = 0; index < count; index++) { + addPoint(points, index, pointSupplier.get()); + } + return points; + } + + private static void addPoint(List points, int index, boolean point) { + if (index == 0 || !points.get(index - 1)) { + points.add(point); + return; + } + points.add(false); + } + } diff --git a/src/main/java/nextstep/ladder/domain/Player.java b/src/main/java/nextstep/ladder/domain/Player.java index ad6a174636..9014483ae0 100644 --- a/src/main/java/nextstep/ladder/domain/Player.java +++ b/src/main/java/nextstep/ladder/domain/Player.java @@ -19,25 +19,6 @@ public String getName() { return name; } - public int getPlayerResultIndex(int currentPoint, Ladder ladder) { - int point = currentPoint; - for (int index = 0; index < ladder.getHeight(); index++) { - point = calculationPoint(index, point, ladder); - } - return point; - } - - private int calculationPoint(int lineIndex, int point, Ladder ladder) { - Line line = ladder.getLines().get(lineIndex); - if (line.hasLeftPoint(point)) { - return point - 1; - } - if (line.hasRightPoint(point)) { - return point + 1; - } - return point; - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/nextstep/ladder/util/RandomUtil.java b/src/main/java/nextstep/ladder/util/RandomUtil.java index 052cebd810..853d46be1d 100644 --- a/src/main/java/nextstep/ladder/util/RandomUtil.java +++ b/src/main/java/nextstep/ladder/util/RandomUtil.java @@ -9,19 +9,8 @@ public class RandomUtil { private static final Random random = new Random(); - public static List generatorPoints(int count) { - List points = new ArrayList<>(); - IntStream.range(0, count) - .forEach(index -> addPoint(points, index, random.nextBoolean())); - return points; - } - - private static void addPoint(List points, int index, boolean point) { - if (index == 0 || !points.get(index - 1)) { - points.add(point); - return; - } - points.add(false); + public static boolean generator() { + return random.nextBoolean(); } } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index 4ce8cb619b..82c18163ad 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -61,10 +61,12 @@ private static void printResultValues(List values) { } public static void printPlayerResult(String result) { + printResultText(); System.out.println(result); } public static void printPlayerResultWithName(String playerName, String result) { + printResultText(); System.out.println(String.format(PLAYER_NAME_AND_RESULT_TEXT, playerName, result)); } From c67345957eb0c47042e480d6bf29a924c85cb2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Fri, 26 May 2023 00:43:04 +0900 Subject: [PATCH 12/14] =?UTF-8?q?refactor:=20point=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/ladder/domain/Ladder.java | 7 +++- .../java/nextstep/ladder/domain/Line.java | 40 +++++-------------- .../java/nextstep/ladder/domain/Point.java | 15 +++++++ .../nextstep/ladder/domain/PointStatus.java | 16 ++++++++ .../java/nextstep/ladder/util/RandomUtil.java | 7 +--- 5 files changed, 50 insertions(+), 35 deletions(-) create mode 100644 src/main/java/nextstep/ladder/domain/Point.java create mode 100644 src/main/java/nextstep/ladder/domain/PointStatus.java diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index f77cb59dcf..8e0ab9c83d 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -36,6 +36,7 @@ public int getPlayerResultIndex(int currentPoint) { return point; } + // TODO 해야함 졸려서잠 private int calculationPoint(int lineIndex, int point, Ladder ladder) { Line line = ladder.getLines().get(lineIndex); if (line.hasLeftPoint(point)) { @@ -50,7 +51,11 @@ private int calculationPoint(int lineIndex, int point, Ladder ladder) { private List createLines(int width) { List lines = new ArrayList<>(); for (int heightNumber = 0; heightNumber < height; heightNumber++) { - lines.add(new Line(Line.generatePoints(RandomUtil::generator, width - 1))); + lines.add( + new Line( + Line.generatePoints(() -> new Point(PointStatus.getRandomStatus(PointStatus.values().length)), width) + ) + ); } return lines; } diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index d9185fb485..2e8d82a1de 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -9,44 +9,26 @@ public class Line { - private final List points; + private final List points; - public Line(List points) { + public Line(List points) { this.points = points; } - public boolean hasLeftPoint(int currentPlayerPoint) { - if (currentPlayerPoint == 0) { - return false; + public static List generatePoints(Supplier pointSupplier, int width) { + List points = new ArrayList<>(); + for (int index = 0; index < width; index++) { + addPoint(points, pointSupplier.get()); } - return points.get(currentPlayerPoint - 1); - } - - public boolean hasRightPoint(int currentPlayerPoint) { - if (points.size() == currentPlayerPoint || points.size() < currentPlayerPoint) { - return false; - } - return points.get(currentPlayerPoint); - } - - public List getPoints() { return points; } - public static List generatePoints(Supplier pointSupplier, int count) { - List points = new ArrayList<>(); - for (int index = 0; index < count; index++) { - addPoint(points, index, pointSupplier.get()); - } - return points; + private static void addPoint(List points, Point point) { + points.add(point); } - private static void addPoint(List points, int index, boolean point) { - if (index == 0 || !points.get(index - 1)) { - points.add(point); - return; - } - points.add(false); + public List getPoints() { + return points; } - + } diff --git a/src/main/java/nextstep/ladder/domain/Point.java b/src/main/java/nextstep/ladder/domain/Point.java new file mode 100644 index 0000000000..cf35f1f553 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/Point.java @@ -0,0 +1,15 @@ +package nextstep.ladder.domain; + +public class Point { + + private PointStatus status; + + public Point(PointStatus status) { + this.status = status; + } + + public PointStatus getStatus() { + return status; + } + +} diff --git a/src/main/java/nextstep/ladder/domain/PointStatus.java b/src/main/java/nextstep/ladder/domain/PointStatus.java new file mode 100644 index 0000000000..3f72f7b266 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/PointStatus.java @@ -0,0 +1,16 @@ +package nextstep.ladder.domain; + +import java.util.function.Supplier; + +public enum PointStatus { + LEFT, + RIGHT, + NONE, + + ; + + public static PointStatus getRandomStatus(int number) { + return values()[number]; + } + +} diff --git a/src/main/java/nextstep/ladder/util/RandomUtil.java b/src/main/java/nextstep/ladder/util/RandomUtil.java index 853d46be1d..14f407facf 100644 --- a/src/main/java/nextstep/ladder/util/RandomUtil.java +++ b/src/main/java/nextstep/ladder/util/RandomUtil.java @@ -1,16 +1,13 @@ package nextstep.ladder.util; -import java.util.ArrayList; -import java.util.List; import java.util.Random; -import java.util.stream.IntStream; public class RandomUtil { private static final Random random = new Random(); - public static boolean generator() { - return random.nextBoolean(); + public static int generator(int number) { + return random.nextInt(number); } } From d79de56be9187f6b99dd3443335d4693e640cd54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Sat, 27 May 2023 20:05:38 +0900 Subject: [PATCH 13/14] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EB=8B=A4=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 17 ------- .../java/nextstep/ladder/domain/Ladder.java | 39 ---------------- .../java/nextstep/ladder/domain/Line.java | 23 +--------- .../java/nextstep/ladder/domain/Point.java | 4 ++ .../nextstep/ladder/domain/PointStatus.java | 12 +++++ .../java/nextstep/ladder/view/ResultView.java | 34 +------------- .../nextstep/ladder/domain/LadderTest.java | 31 ------------- .../java/nextstep/ladder/domain/LineTest.java | 18 -------- .../nextstep/ladder/domain/PlayerTest.java | 45 ------------------- 9 files changed, 19 insertions(+), 204 deletions(-) delete mode 100644 src/test/java/nextstep/ladder/domain/LadderTest.java delete mode 100644 src/test/java/nextstep/ladder/domain/LineTest.java delete mode 100644 src/test/java/nextstep/ladder/domain/PlayerTest.java diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 51d826dfc4..0cd6ce5fc7 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -7,7 +7,6 @@ import nextstep.ladder.view.ResultView; import java.util.*; -import java.util.stream.IntStream; public class LadderGame { @@ -28,12 +27,10 @@ public void run() { Result result = new Result(InputView.inputResult()); Ladder ladder = new Ladder(InputView.inputLadderHeight(), players.size()); -// addLadderLines(ladder.getHeight(), players.size()); ResultView.printLadderResult(players, ladder.getLines(), result); String inputPlayer = InputView.inputPlayer(); - printPlayerResult(result, inputPlayer, players, ladder); } @@ -46,19 +43,5 @@ private void addPlayers(List players, String inputPlayers) { .map(Player::new) .forEach(players::add); } - private void printPlayerResult(Result result, String inputPlayer, List players, Ladder ladder) { - if (ALL_PLAYER.equals(inputPlayer)) { - IntStream.range(0, players.size()).forEach(index -> printPlayerResultWithName(result, index, players.get(index), ladder)); - return; - } - - int point = players.indexOf(new Player(inputPlayer)); - ResultView.printPlayerResult(result.getValue(ladder.getPlayerResultIndex(point))); - - } - - private void printPlayerResultWithName(Result result, int index, Player player, Ladder ladder) { - ResultView.printPlayerResultWithName(player.getName(), result.getValue(ladder.getPlayerResultIndex(index))); - } } diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index 8e0ab9c83d..91e99f2d24 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -1,12 +1,8 @@ package nextstep.ladder.domain; -import nextstep.ladder.util.RandomUtil; - -import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.IntStream; public class Ladder { @@ -14,50 +10,15 @@ public class Ladder { private List lines; - private int height; - public Ladder(int height, int width) { if (1 > height) { throw new IllegalArgumentException(HEIGHT_ERROR_MESSAGE); } - this.height = height; - lines = createLines(width); } public List getLines() { return Collections.unmodifiableList(this.lines); } - public int getPlayerResultIndex(int currentPoint) { - int point = currentPoint; - for (int index = 0; index < this.height; index++) { - point = calculationPoint(index, point, this); - } - return point; - } - - // TODO 해야함 졸려서잠 - private int calculationPoint(int lineIndex, int point, Ladder ladder) { - Line line = ladder.getLines().get(lineIndex); - if (line.hasLeftPoint(point)) { - return point - 1; - } - if (line.hasRightPoint(point)) { - return point + 1; - } - return point; - } - - private List createLines(int width) { - List lines = new ArrayList<>(); - for (int heightNumber = 0; heightNumber < height; heightNumber++) { - lines.add( - new Line( - Line.generatePoints(() -> new Point(PointStatus.getRandomStatus(PointStatus.values().length)), width) - ) - ); - } - return lines; - } } diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index 2e8d82a1de..d08d463379 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -3,32 +3,13 @@ import nextstep.ladder.util.RandomUtil; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.Supplier; import java.util.stream.IntStream; public class Line { - private final List points; - - public Line(List points) { - this.points = points; - } - - public static List generatePoints(Supplier pointSupplier, int width) { - List points = new ArrayList<>(); - for (int index = 0; index < width; index++) { - addPoint(points, pointSupplier.get()); - } - return points; - } - - private static void addPoint(List points, Point point) { - points.add(point); - } - - public List getPoints() { - return points; - } + private List points; } diff --git a/src/main/java/nextstep/ladder/domain/Point.java b/src/main/java/nextstep/ladder/domain/Point.java index cf35f1f553..9c473cb9ac 100644 --- a/src/main/java/nextstep/ladder/domain/Point.java +++ b/src/main/java/nextstep/ladder/domain/Point.java @@ -1,5 +1,9 @@ package nextstep.ladder.domain; +import nextstep.ladder.util.RandomUtil; + +import java.util.function.Supplier; + public class Point { private PointStatus status; diff --git a/src/main/java/nextstep/ladder/domain/PointStatus.java b/src/main/java/nextstep/ladder/domain/PointStatus.java index 3f72f7b266..c15c913c90 100644 --- a/src/main/java/nextstep/ladder/domain/PointStatus.java +++ b/src/main/java/nextstep/ladder/domain/PointStatus.java @@ -9,6 +9,18 @@ public enum PointStatus { ; + public boolean hasLeft() { + return LEFT == this; + } + + public boolean hasRight() { + return RIGHT == this; + } + + public boolean hasNone() { + return NONE == this; + } + public static PointStatus getRandomStatus(int number) { return values()[number]; } diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index 82c18163ad..444043b5a7 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -2,6 +2,7 @@ import nextstep.ladder.domain.Line; import nextstep.ladder.domain.Player; +import nextstep.ladder.domain.Point; import nextstep.ladder.domain.Result; import java.util.List; @@ -18,7 +19,6 @@ public class ResultView { public static void printLadderResult(List players, List lines, Result result) { printPlayerName(players); - printLadderLine(lines); printResultValues(result.getValues()); } @@ -32,42 +32,10 @@ private static void printPlayerName(List players) { System.out.println(sb.toString()); } - private static void printLadderLine(List lines) { - lines.forEach(line -> System.out.println(getLineText(line.getPoints()))); - } - - private static String getLineText(List points) { - StringBuilder sb = new StringBuilder(); - sb.append(SPACE_START_HORIZONTAL_LINE); - points.forEach(hasHorizontalLine -> getHorizontalLine(sb, hasHorizontalLine)); - sb.append(VERTICAL_LINE); - return sb.toString(); - } - - private static void getHorizontalLine(StringBuilder sb, boolean hasHorizontalLine) { - sb.append(VERTICAL_LINE); - if (hasHorizontalLine) { - sb.append(HORIZONTAL_LINE); - } - if (!hasHorizontalLine) { - sb.append(SPACE_HORIZONTAL_LINE); - } - } - private static void printResultValues(List values) { StringBuilder sb = new StringBuilder(); values.stream().forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); System.out.println(sb.toString()); } - public static void printPlayerResult(String result) { - printResultText(); - System.out.println(result); - } - - public static void printPlayerResultWithName(String playerName, String result) { - printResultText(); - System.out.println(String.format(PLAYER_NAME_AND_RESULT_TEXT, playerName, result)); - } - } diff --git a/src/test/java/nextstep/ladder/domain/LadderTest.java b/src/test/java/nextstep/ladder/domain/LadderTest.java deleted file mode 100644 index 521938e6b8..0000000000 --- a/src/test/java/nextstep/ladder/domain/LadderTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package nextstep.ladder.domain; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class LadderTest { - - @Test - void create() { - Ladder ladder = new Ladder(5); - assertThat(ladder.getLines()).hasSize(5); - ladder.getLines().forEach(line -> { - assertThat(line.getPoints()).hasSize(3); - }); - Ladder ladder2 = new Ladder(8); - assertThat(ladder2.getLines()).hasSize(8); - ladder2.getLines().forEach(line -> { - assertThat(line.getPoints()).hasSize(5); - }); - } - - @Test - void height() { - assertThatThrownBy(() -> { - Ladder ladder = new Ladder(0); - }).hasMessageContaining("높이는 0보다 커야 합니다."); - } - -} diff --git a/src/test/java/nextstep/ladder/domain/LineTest.java b/src/test/java/nextstep/ladder/domain/LineTest.java deleted file mode 100644 index 070f4e7933..0000000000 --- a/src/test/java/nextstep/ladder/domain/LineTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package nextstep.ladder.domain; - -import nextstep.ladder.util.RandomUtil; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LineTest { - - @Test - void createLine() { - Line line1 = new Line(() -> RandomUtil.generatorPoints(2)); - assertThat(line1.getPoints()).hasSize(2); - Line line2 = new Line(() -> RandomUtil.generatorPoints(4)); - assertThat(line2.getPoints()).hasSize(4); - } - -} diff --git a/src/test/java/nextstep/ladder/domain/PlayerTest.java b/src/test/java/nextstep/ladder/domain/PlayerTest.java deleted file mode 100644 index ed52876eb4..0000000000 --- a/src/test/java/nextstep/ladder/domain/PlayerTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package nextstep.ladder.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; - -public class PlayerTest { - - @Test - void create() { - Player player1 = new Player("HI"); - assertThat(player1.getName()).isEqualTo("HI"); - assertThatIllegalArgumentException().isThrownBy(() -> { - Player player2 = new Player("HEELLO"); - }).withMessageMatching("사람에 이름을 최대5글자까지 가능합니다."); - } - - @DisplayName("결과 테스트") - @Test - void getResult() { - Ladder ladder = new Ladder(5); - ladder.addLine(new Line(() -> Arrays.asList(true, false, true))); - ladder.addLine(new Line(() -> Arrays.asList(false, true, false))); - ladder.addLine(new Line(() -> Arrays.asList(true, false, false))); - ladder.addLine(new Line(() -> Arrays.asList(false, true, false))); - ladder.addLine(new Line(() -> Arrays.asList(true, false, true))); - List players = Arrays.asList( - new Player("pobi"), - new Player("honux"), - new Player("crong"), - new Player("jk") - ); - List results = Arrays.asList("꽝", "5000", "꽝", "3000"); - assertThat(results.get(players.get(0).getPlayerResultIndex(0, ladder))).isEqualTo("꽝"); - assertThat(results.get(players.get(1).getPlayerResultIndex(1, ladder))).isEqualTo("3000"); - assertThat(results.get(players.get(2).getPlayerResultIndex(2, ladder))).isEqualTo("꽝"); - assertThat(results.get(players.get(3).getPlayerResultIndex(3, ladder))).isEqualTo("5000"); - } - -} From 6356d9f22c6fb8cf32b47f04cc4382c6e99e611a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=9A=B0?= Date: Mon, 29 May 2023 08:06:14 +0900 Subject: [PATCH 14/14] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/ladder/LadderGame.java | 79 +++++++++++++++---- .../java/nextstep/ladder/domain/Ladder.java | 10 +++ .../java/nextstep/ladder/domain/Line.java | 36 ++++++++- .../java/nextstep/ladder/domain/Player.java | 27 +++++-- .../nextstep/ladder/domain/PlayerName.java | 38 +++++++++ .../java/nextstep/ladder/domain/Point.java | 42 +++++++++- .../nextstep/ladder/domain/PointStatus.java | 18 +++++ .../java/nextstep/ladder/domain/Result.java | 21 +++-- .../java/nextstep/ladder/domain/ResultId.java | 28 +++++++ .../java/nextstep/ladder/view/ResultView.java | 56 +++++++++---- 10 files changed, 300 insertions(+), 55 deletions(-) create mode 100644 src/main/java/nextstep/ladder/domain/PlayerName.java create mode 100644 src/main/java/nextstep/ladder/domain/ResultId.java diff --git a/src/main/java/nextstep/ladder/LadderGame.java b/src/main/java/nextstep/ladder/LadderGame.java index 0cd6ce5fc7..0d513ab708 100644 --- a/src/main/java/nextstep/ladder/LadderGame.java +++ b/src/main/java/nextstep/ladder/LadderGame.java @@ -1,17 +1,16 @@ package nextstep.ladder; -import nextstep.ladder.domain.Ladder; -import nextstep.ladder.domain.Player; -import nextstep.ladder.domain.Result; +import nextstep.ladder.domain.*; import nextstep.ladder.view.InputView; import nextstep.ladder.view.ResultView; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; public class LadderGame { - private static final String NAME_REX_PATTERN = ","; - private static final String ALL_PLAYER = "all"; public static void main(String[] args) { @@ -21,27 +20,73 @@ public static void main(String[] args) { public void run() { - List players = new ArrayList<>(); - - inputPlayers(players, InputView.inputPlayers()); + Map players = addPlayers(InputView.inputPlayers()); + Map results = addResults(InputView.inputResult()); - Result result = new Result(InputView.inputResult()); Ladder ladder = new Ladder(InputView.inputLadderHeight(), players.size()); - ResultView.printLadderResult(players, ladder.getLines(), result); + ResultView.printLadderResult(players, ladder.getLines(), results); + + players = getPlayerResult(players, results, ladder); - String inputPlayer = InputView.inputPlayer(); + + printPlayerResult(players); } - private void inputPlayers(List players, String inputPlayers) { - addPlayers(players, inputPlayers); + private Map addPlayers(String inputPlayers) { + AtomicInteger index = new AtomicInteger(0); + return Arrays.stream(inputPlayers.split(",")) + .map(name -> new Player(new PlayerName(name), index.getAndIncrement())) + .collect(Collectors.toMap(Player::getName, player -> player, (x, y) -> y, LinkedHashMap::new)); } - private void addPlayers(List players, String inputPlayers) { - Arrays.stream(inputPlayers.split(NAME_REX_PATTERN)) - .map(Player::new) - .forEach(players::add); + private Map addResults(String inputResults) { + AtomicLong index = new AtomicLong(0); + return Arrays.stream(inputResults.split(",")) + .map(value -> new Result(new ResultId(index.getAndIncrement()), value)) + .collect(Collectors.toMap(Result::getId, result -> result)); + } + + private Map getPlayerResult(Map players, Map results, Ladder ladder) { + Map newResults = new LinkedHashMap<>(); + for (PlayerName playerName : players.keySet()) { + Player player = players.get(playerName); + player.saveResult(results.get(calculateResultId(players.get(player.getName()), ladder))); + newResults.put(playerName, player); + } + return newResults; + } + + private ResultId calculateResultId(Player player, Ladder ladder) { + int playerPosition = player.getStartPosition(); + for (Line line : ladder.getLines()) { + playerPosition = calculatePosition(line.getPoints(), playerPosition); + } + return new ResultId((long) playerPosition); + } + + private int calculatePosition(List points, int playerPosition) { + if (points.get(playerPosition).getStatus().hasRight()) { + return playerPosition + 1; + } + if (points.get(playerPosition).getStatus().hasLeft()) { + return playerPosition - 1; + } + return playerPosition; + } + + private void printPlayerResult(Map players) { + + String inputPlayer = ""; + + while (!ALL_PLAYER.equals(inputPlayer)) { + + inputPlayer = InputView.inputPlayer(); + + ResultView.printPlayerResult(inputPlayer, players); + + } } } diff --git a/src/main/java/nextstep/ladder/domain/Ladder.java b/src/main/java/nextstep/ladder/domain/Ladder.java index 91e99f2d24..ed7183e680 100644 --- a/src/main/java/nextstep/ladder/domain/Ladder.java +++ b/src/main/java/nextstep/ladder/domain/Ladder.java @@ -1,6 +1,7 @@ package nextstep.ladder.domain; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -14,11 +15,20 @@ public Ladder(int height, int width) { if (1 > height) { throw new IllegalArgumentException(HEIGHT_ERROR_MESSAGE); } + this.lines = createLines(height, width); } public List getLines() { return Collections.unmodifiableList(this.lines); } + private List createLines(int height, int width) { + List lines = new ArrayList<>(); + for (int i = 0; i < height; i++) { + lines.add(new Line(width)); + } + return lines; + } + } diff --git a/src/main/java/nextstep/ladder/domain/Line.java b/src/main/java/nextstep/ladder/domain/Line.java index d08d463379..7b7db27083 100644 --- a/src/main/java/nextstep/ladder/domain/Line.java +++ b/src/main/java/nextstep/ladder/domain/Line.java @@ -5,11 +5,41 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.Supplier; -import java.util.stream.IntStream; public class Line { private List points; - + + public Line(int pointSize) { + this.points = createPoints(pointSize); + } + + public List getPoints() { + return Collections.unmodifiableList(points); + } + + private List createPoints(int pointSize) { + List points = new ArrayList<>(); + for (int index = 0; index < pointSize; index++) { + addPoint(points, index, pointSize); + } + return points; + } + + private void addPoint(List points, int index, int pointSize) { + int totalSizeBound = PointStatus.TOTAL_INDEX_SIZE; + int twoResultSizeBound = PointStatus.TWO_RESULT_SIZE; + if (index == 0) { + points.add(Point.createFirst(() -> RandomUtil.generator(twoResultSizeBound))); + return; + } + if (pointSize - 1 == index) { + points.add(Point.createLast(() -> RandomUtil.generator(twoResultSizeBound), points.get(index - 1))); + return; + } + Point point = Point.create(() -> RandomUtil.generator(totalSizeBound), points.get(index - 1)); + // LEFT 일때 points list 값 바꾸기 + points.add(point); + } + } diff --git a/src/main/java/nextstep/ladder/domain/Player.java b/src/main/java/nextstep/ladder/domain/Player.java index 9014483ae0..432a89ce7e 100644 --- a/src/main/java/nextstep/ladder/domain/Player.java +++ b/src/main/java/nextstep/ladder/domain/Player.java @@ -3,22 +3,33 @@ import java.util.Objects; public class Player { + private final PlayerName name; - private static final String NAME_OVER_LENGTH_ERROR_TEXT = "사람에 이름을 최대5글자까지 가능합니다."; - private static final int NAME_MAX_LENGTH = 5; - private final String name; + private Result result; - public Player(String name) { - if (name.length() > NAME_MAX_LENGTH) { - throw new IllegalArgumentException(NAME_OVER_LENGTH_ERROR_TEXT); - } + private final int startPosition; + + public Player(PlayerName name, int startPosition) { this.name = name; + this.startPosition = startPosition; } - public String getName() { + public PlayerName getName() { return name; } + public int getStartPosition() { + return startPosition; + } + + public void saveResult(Result result) { + this.result = result; + } + + public Result getResult() { + return result; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/nextstep/ladder/domain/PlayerName.java b/src/main/java/nextstep/ladder/domain/PlayerName.java new file mode 100644 index 0000000000..949a61242d --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/PlayerName.java @@ -0,0 +1,38 @@ +package nextstep.ladder.domain; + +import java.util.Objects; + +public class PlayerName { + + private static final String NAME_OVER_LENGTH_ERROR_TEXT = "사람에 이름을 최대5글자까지 가능합니다."; + private static final int NAME_MAX_LENGTH = 5; + + private final String value; + + public PlayerName(String value) { + if (value.length() > NAME_MAX_LENGTH) { + throw new IllegalArgumentException(NAME_OVER_LENGTH_ERROR_TEXT); + } + this.value = value; + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PlayerName that = (PlayerName) o; + + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return value != null ? value.hashCode() : 0; + } + +} diff --git a/src/main/java/nextstep/ladder/domain/Point.java b/src/main/java/nextstep/ladder/domain/Point.java index 9c473cb9ac..436803bd21 100644 --- a/src/main/java/nextstep/ladder/domain/Point.java +++ b/src/main/java/nextstep/ladder/domain/Point.java @@ -1,19 +1,59 @@ package nextstep.ladder.domain; -import nextstep.ladder.util.RandomUtil; +import java.util.List; +import java.util.Optional; import java.util.function.Supplier; public class Point { private PointStatus status; + private final PointStatus beforeStatus; public Point(PointStatus status) { this.status = status; + this.beforeStatus = PointStatus.NONE; + } + + private Point(PointStatus status, PointStatus beforeStatus) { + this.status = status; + this.beforeStatus = beforeStatus; } public PointStatus getStatus() { return status; } + public void saveStatus(PointStatus status) { + this.status = status; + } + + public static Point create(Supplier randomNumber, Point beforeStatus) { + if (beforeStatus.getStatus() == PointStatus.RIGHT) { + return new Point(PointStatus.LEFT, beforeStatus.getStatus()); + } + if (beforeStatus.getStatus() == PointStatus.LEFT) { + return new Point(PointStatus.NONE, beforeStatus.getStatus()); + } + PointStatus status = PointStatus.getRandomStatus(randomNumber.get()); + if (PointStatus.LEFT == status) { + beforeStatus.saveStatus(PointStatus.RIGHT); + } + return new Point(status, beforeStatus.getStatus()); + } + + public static Point createFirst(Supplier randomNumber) { + return new Point(PointStatus.getRandomStatusExceptLeft(randomNumber.get())); + } + + public static Point createLast(Supplier randomNumber, Point beforeStatus) { + if (beforeStatus.getStatus() == PointStatus.RIGHT) { + return new Point(PointStatus.LEFT, beforeStatus.getStatus()); + } + if (beforeStatus.getStatus() == PointStatus.LEFT) { + return new Point(PointStatus.NONE, beforeStatus.getStatus()); + } + return new Point(PointStatus.getRandomStatusExceptRight(randomNumber.get()), beforeStatus.getStatus()); + } + } diff --git a/src/main/java/nextstep/ladder/domain/PointStatus.java b/src/main/java/nextstep/ladder/domain/PointStatus.java index c15c913c90..d6e819258b 100644 --- a/src/main/java/nextstep/ladder/domain/PointStatus.java +++ b/src/main/java/nextstep/ladder/domain/PointStatus.java @@ -3,12 +3,16 @@ import java.util.function.Supplier; public enum PointStatus { + LEFT, RIGHT, NONE, ; + public static final int TOTAL_INDEX_SIZE = values().length; + public static final int TWO_RESULT_SIZE = 2; + public boolean hasLeft() { return LEFT == this; } @@ -25,4 +29,18 @@ public static PointStatus getRandomStatus(int number) { return values()[number]; } + public static PointStatus getRandomStatusExceptRight(int number) { + if (number == 0) { + return NONE; + } + return LEFT; + } + + public static PointStatus getRandomStatusExceptLeft(int number) { + if (number == 0) { + return NONE; + } + return RIGHT; + } + } diff --git a/src/main/java/nextstep/ladder/domain/Result.java b/src/main/java/nextstep/ladder/domain/Result.java index 645f550a85..4ce4049df3 100644 --- a/src/main/java/nextstep/ladder/domain/Result.java +++ b/src/main/java/nextstep/ladder/domain/Result.java @@ -1,25 +1,22 @@ package nextstep.ladder.domain; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - public class Result { - private static final String RESULT_REX_PATTERN = ","; + private final ResultId id; - private final List values; + private String value; - public Result(String values) { - this.values = Arrays.asList(values.split(RESULT_REX_PATTERN)); + public Result(ResultId id, String value) { + this.id = id; + this.value = value; } - public String getValue(int index) { - return values.get(index); + public ResultId getId() { + return id; } - public List getValues() { - return Collections.unmodifiableList(values); + public String getValue() { + return value; } } diff --git a/src/main/java/nextstep/ladder/domain/ResultId.java b/src/main/java/nextstep/ladder/domain/ResultId.java new file mode 100644 index 0000000000..ad18176f16 --- /dev/null +++ b/src/main/java/nextstep/ladder/domain/ResultId.java @@ -0,0 +1,28 @@ +package nextstep.ladder.domain; + +import java.util.Objects; + +public class ResultId { + + private Long id; + + public ResultId(Long id) { + this.id = id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ResultId resultId = (ResultId) o; + + return Objects.equals(id, resultId.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + +} diff --git a/src/main/java/nextstep/ladder/view/ResultView.java b/src/main/java/nextstep/ladder/view/ResultView.java index 444043b5a7..10690da375 100644 --- a/src/main/java/nextstep/ladder/view/ResultView.java +++ b/src/main/java/nextstep/ladder/view/ResultView.java @@ -1,11 +1,11 @@ package nextstep.ladder.view; -import nextstep.ladder.domain.Line; -import nextstep.ladder.domain.Player; -import nextstep.ladder.domain.Point; -import nextstep.ladder.domain.Result; +import nextstep.ladder.domain.*; import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.toList; public class ResultView { @@ -13,29 +13,57 @@ public class ResultView { private static final String SPACE_HORIZONTAL_LINE = " "; private static final String SPACE_START_HORIZONTAL_LINE = " "; private static final String VERTICAL_LINE = "|"; - private static final String NAME_LENGTH_FIVE_FORMAT_PATTERN = "%-5s"; + private static final String EMPTY = ""; + private static final String NAME_LENGTH_FIVE_FORMAT_PATTERN = "%-6s"; private static final String RESULT_TEXT = "실행결과"; + private static final String LADDER_RESULT_TEXT = "사다리 결과"; private static final String PLAYER_NAME_AND_RESULT_TEXT = "%s : %s"; + private static final String ALL_PLAYER = "all"; - public static void printLadderResult(List players, List lines, Result result) { + public static void printLadderResult(Map players, List lines, Map result) { + System.out.println(LADDER_RESULT_TEXT); printPlayerName(players); - printResultValues(result.getValues()); + printLadderResult(lines); + printResultValues(result); } - public static void printResultText() { - System.out.println(RESULT_TEXT); + private static void printPlayerName(Map players) { + StringBuilder sb = new StringBuilder(); + players.keySet().forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name.getValue()))); + System.out.println(sb.toString()); } - private static void printPlayerName(List players) { + private static void printLadderResult(List lines) { StringBuilder sb = new StringBuilder(); - players.stream().map(Player::getName).forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); - System.out.println(sb.toString()); + for (int index = 0; index < lines.size(); index++) { + sb.setLength(0); + sb.append(VERTICAL_LINE); + sb.append(getLinePointsResult(lines.get(index).getPoints())); + System.out.println(sb.toString()); + } } - private static void printResultValues(List values) { + private static String getLinePointsResult(List points) { StringBuilder sb = new StringBuilder(); - values.stream().forEach(name -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, name)).append(" ")); + for (int index = 1; index < points.size(); index++) { + sb.append(PointStatus.LEFT == points.get(index).getStatus() ? HORIZONTAL_LINE : SPACE_HORIZONTAL_LINE).append(VERTICAL_LINE);; + } + return sb.toString(); + } + + private static void printResultValues(Map results) { + StringBuilder sb = new StringBuilder(); + results.keySet().forEach(resultId -> sb.append(String.format(NAME_LENGTH_FIVE_FORMAT_PATTERN, results.get(resultId).getValue())).append(" ")); System.out.println(sb.toString()); } + public static void printPlayerResult(String inputPlayer, Map players) { + System.out.println(RESULT_TEXT); + if (ALL_PLAYER.equals(inputPlayer)) { + players.keySet().forEach(name -> System.out.println(String.format(PLAYER_NAME_AND_RESULT_TEXT, name.getValue(), players.get(name).getResult().getValue()))); + return; + } + Player player = players.get(new PlayerName(inputPlayer)); + System.out.println(player.getResult().getValue()); + } }