From 955e49dd5209821d76b169e36f8fc77b4933db3a Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 16:08:41 +0900 Subject: [PATCH 01/26] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..77689ad --- /dev/null +++ b/docs/README.md @@ -0,0 +1,22 @@ +## 기능 요구 사항 + +**버전** +- [ ] 숫자 버전은 1번이다. +- [ ] 영어 버전은 2번이다. + +**난수** +- [ ] 숫자 버전은 1 ~ 100 사이의 정답을 가진다. +- [ ] 영어 버전은 A ~ z 사이의 정답을 가진다. + +**게임기** +- [ ] 추측값과 정답을 비교한다. +- [ ] 게임 상태를 반환한다. + +**게임 상태** + - [ ] 추측값이 정답보다 작은 경우 UP 상태이다. + - [ ] 추측값이 정답보다 큰 경우 DOWN 상태이다. + - [ ] 추측값이 정답과 일치하는 경우 CORRECT 상태이다. + +**시도 횟수** +- [ ] 사용자가 정답을 맞출 때까지 시도한 횟수를 출력한다 + - 잘못된 값 입력 역시 시도한 횟수에 포함 되어야 한다. From f56e7e11afad6bdc215dbaf4c6c1b205dbbbe6e5 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 16:09:23 +0900 Subject: [PATCH 02/26] =?UTF-8?q?feat(GuessNumber):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=20=EB=8F=84=EB=A9=94=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/domain/GuessNumber.java | 21 +++++++++++++++++++ .../leets/land/domain/GuessNumberTest.java | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/leets/land/domain/GuessNumber.java create mode 100644 src/test/java/leets/land/domain/GuessNumberTest.java diff --git a/src/main/java/leets/land/domain/GuessNumber.java b/src/main/java/leets/land/domain/GuessNumber.java new file mode 100644 index 0000000..0860246 --- /dev/null +++ b/src/main/java/leets/land/domain/GuessNumber.java @@ -0,0 +1,21 @@ +package leets.land.domain; + +public class GuessNumber { + + private static final int MIN_RANGE = 1; + private static final int MAX_RANGE = 100; + private static final String ERROR_FORMAT = "[ERROR] %s"; + + private final int value; + + public GuessNumber(int value) { + validate(value); + this.value = value; + } + + private void validate(int value) { + if (value < MIN_RANGE || value > MAX_RANGE) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "추측값의 범위는 1 이상 100 이하입니다")); + } + } +} diff --git a/src/test/java/leets/land/domain/GuessNumberTest.java b/src/test/java/leets/land/domain/GuessNumberTest.java new file mode 100644 index 0000000..7d10a42 --- /dev/null +++ b/src/test/java/leets/land/domain/GuessNumberTest.java @@ -0,0 +1,18 @@ +package leets.land.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class GuessNumberTest { + + @ParameterizedTest + @ValueSource(ints = {0, 101}) + @DisplayName("범위 외 추측값인 경우 예외가 발생한다.") + void guessNumber_OutOfRange_ExceptionThrown(int outOfRange) { + assertThatIllegalArgumentException(). + isThrownBy(() -> new GuessNumber(outOfRange)); + } +} From 95beeeadb80f2894dff11d259e7d6a9addc1d5c5 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 17:09:20 +0900 Subject: [PATCH 03/26] =?UTF-8?q?feat(AnswerNumber):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=EA=B3=BC=20=EC=A0=95=EB=8B=B5=EC=9D=84=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/domain/AnswerNumber.java | 21 +++++++++ .../java/leets/land/domain/GuessNumber.java | 4 ++ .../java/leets/land/domain/GuessStatus.java | 6 +++ .../leets/land/domain/AnswerNumberTest.java | 43 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/main/java/leets/land/domain/AnswerNumber.java create mode 100644 src/main/java/leets/land/domain/GuessStatus.java create mode 100644 src/test/java/leets/land/domain/AnswerNumberTest.java diff --git a/src/main/java/leets/land/domain/AnswerNumber.java b/src/main/java/leets/land/domain/AnswerNumber.java new file mode 100644 index 0000000..faa5531 --- /dev/null +++ b/src/main/java/leets/land/domain/AnswerNumber.java @@ -0,0 +1,21 @@ +package leets.land.domain; + +public class AnswerNumber { + + private final int value; + + public AnswerNumber(int value) { + this.value = value; + } + + public GuessStatus compare(GuessNumber guessNumber) { + int compared = guessNumber.compare(value); + if (compared > 0) { + return GuessStatus.UP; + } + if (compared < 0) { + return GuessStatus.DOWN; + } + return GuessStatus.CORRECT; + } +} diff --git a/src/main/java/leets/land/domain/GuessNumber.java b/src/main/java/leets/land/domain/GuessNumber.java index 0860246..6384d89 100644 --- a/src/main/java/leets/land/domain/GuessNumber.java +++ b/src/main/java/leets/land/domain/GuessNumber.java @@ -18,4 +18,8 @@ private void validate(int value) { throw new IllegalArgumentException(String.format(ERROR_FORMAT, "추측값의 범위는 1 이상 100 이하입니다")); } } + + public int compare(int other) { + return other - value; + } } diff --git a/src/main/java/leets/land/domain/GuessStatus.java b/src/main/java/leets/land/domain/GuessStatus.java new file mode 100644 index 0000000..6fd17f5 --- /dev/null +++ b/src/main/java/leets/land/domain/GuessStatus.java @@ -0,0 +1,6 @@ +package leets.land.domain; + +public enum GuessStatus { + + UP, DOWN, CORRECT; +} diff --git a/src/test/java/leets/land/domain/AnswerNumberTest.java b/src/test/java/leets/land/domain/AnswerNumberTest.java new file mode 100644 index 0000000..49af7ba --- /dev/null +++ b/src/test/java/leets/land/domain/AnswerNumberTest.java @@ -0,0 +1,43 @@ +package leets.land.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static leets.land.domain.GuessStatus.*; +import static org.assertj.core.api.Assertions.assertThat; + +public class AnswerNumberTest { + + @Test + @DisplayName("추측값이 정답과 일치하면 CORRECT를 반환한다.") + void answer_Grade_Correct() { + GuessNumber guessNumber = new GuessNumber(50); + AnswerNumber answerNumber = new AnswerNumber(50); + + GuessStatus guessStatus = answerNumber.compare(guessNumber); + + assertThat(guessStatus).isEqualTo(CORRECT); + } + + @Test + @DisplayName("추측값이 정답보다 크다면 DOWN을 반환한다.") + void answer_Grade_Down() { + GuessNumber guessNumber = new GuessNumber(51); + AnswerNumber answerNumber = new AnswerNumber(50); + + GuessStatus guessStatus = answerNumber.compare(guessNumber); + + assertThat(guessStatus).isEqualTo(DOWN); + } + + @Test + @DisplayName("추측값이 정답보다 작으면 UP을 반환한다.") + void answer_Grade_Up() { + GuessNumber guessNumber = new GuessNumber(49); + AnswerNumber answerNumber = new AnswerNumber(50); + + GuessStatus guessStatus = answerNumber.compare(guessNumber); + + assertThat(guessStatus).isEqualTo(UP); + } +} From 8fa5b88b4e0b6ff267bbef13da7b81fd8ce2cfe2 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:02:43 +0900 Subject: [PATCH 04/26] =?UTF-8?q?feat(Status):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EB=8A=94=20=EC=83=81=ED=83=9C=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/domain/AnswerNumber.java | 8 +-- .../java/leets/land/domain/GuessStatus.java | 32 ++++++++- .../leets/land/domain/status/Correct.java | 12 ++++ .../java/leets/land/domain/status/Down.java | 12 ++++ .../java/leets/land/domain/status/Status.java | 4 ++ .../java/leets/land/domain/status/Up.java | 12 ++++ .../leets/land/domain/GuessStatusTest.java | 68 +++++++++++++++++++ 7 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 src/main/java/leets/land/domain/status/Correct.java create mode 100644 src/main/java/leets/land/domain/status/Down.java create mode 100644 src/main/java/leets/land/domain/status/Status.java create mode 100644 src/main/java/leets/land/domain/status/Up.java create mode 100644 src/test/java/leets/land/domain/GuessStatusTest.java diff --git a/src/main/java/leets/land/domain/AnswerNumber.java b/src/main/java/leets/land/domain/AnswerNumber.java index faa5531..183e20b 100644 --- a/src/main/java/leets/land/domain/AnswerNumber.java +++ b/src/main/java/leets/land/domain/AnswerNumber.java @@ -10,12 +10,6 @@ public AnswerNumber(int value) { public GuessStatus compare(GuessNumber guessNumber) { int compared = guessNumber.compare(value); - if (compared > 0) { - return GuessStatus.UP; - } - if (compared < 0) { - return GuessStatus.DOWN; - } - return GuessStatus.CORRECT; + return GuessStatus.match(compared); } } diff --git a/src/main/java/leets/land/domain/GuessStatus.java b/src/main/java/leets/land/domain/GuessStatus.java index 6fd17f5..88a77a4 100644 --- a/src/main/java/leets/land/domain/GuessStatus.java +++ b/src/main/java/leets/land/domain/GuessStatus.java @@ -1,6 +1,36 @@ package leets.land.domain; +import leets.land.domain.status.Correct; +import leets.land.domain.status.Down; +import leets.land.domain.status.Status; +import leets.land.domain.status.Up; + +import java.util.Arrays; +import java.util.function.Function; +import java.util.function.Predicate; + public enum GuessStatus { - UP, DOWN, CORRECT; + UP(compared -> compared > 0, Up::new), + DOWN(compared -> compared < 0, Down::new), + CORRECT(compared -> compared == 0, Correct::new); + + private final Predicate compare; + private final Function status; + + GuessStatus(Predicate compare, Function status) { + this.compare = compare; + this.status = status; + } + + public static GuessStatus match(int gap) { + return Arrays.stream(values()) + .filter(status -> status.compare.test(gap)) + .findFirst() + .orElseThrow(); + } + + public Status match(GuessNumber guessNumber) { + return status.apply(guessNumber); + } } diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java new file mode 100644 index 0000000..ba75dfd --- /dev/null +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -0,0 +1,12 @@ +package leets.land.domain.status; + +import leets.land.domain.GuessNumber; + +public class Correct implements Status { + + private final GuessNumber max; + + public Correct(GuessNumber max) { + this.max = max; + } +} diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java new file mode 100644 index 0000000..8b276d9 --- /dev/null +++ b/src/main/java/leets/land/domain/status/Down.java @@ -0,0 +1,12 @@ +package leets.land.domain.status; + +import leets.land.domain.GuessNumber; + +public class Down implements Status { + + private final GuessNumber max; + + public Down(GuessNumber max) { + this.max = max; + } +} diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java new file mode 100644 index 0000000..760aa10 --- /dev/null +++ b/src/main/java/leets/land/domain/status/Status.java @@ -0,0 +1,4 @@ +package leets.land.domain.status; + +public interface Status { +} diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java new file mode 100644 index 0000000..04a718b --- /dev/null +++ b/src/main/java/leets/land/domain/status/Up.java @@ -0,0 +1,12 @@ +package leets.land.domain.status; + +import leets.land.domain.GuessNumber; + +public class Up implements Status { + + private final GuessNumber min; + + public Up(GuessNumber min) { + this.min = min; + } +} diff --git a/src/test/java/leets/land/domain/GuessStatusTest.java b/src/test/java/leets/land/domain/GuessStatusTest.java new file mode 100644 index 0000000..b4ff6df --- /dev/null +++ b/src/test/java/leets/land/domain/GuessStatusTest.java @@ -0,0 +1,68 @@ +package leets.land.domain; + +import leets.land.domain.status.Correct; +import leets.land.domain.status.Down; +import leets.land.domain.status.Status; +import leets.land.domain.status.Up; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static leets.land.domain.GuessStatus.*; +import static org.assertj.core.api.Assertions.assertThat; + +class GuessStatusTest { + + @Test + @DisplayName("차가 양수라면 Up을 반환한다.") + void match_Positive_Up() { + GuessStatus guessStatus = match(1); + + assertThat(guessStatus).isEqualTo(UP); + } + + @Test + @DisplayName("차가 음수라면 Down을 반환한다.") + void match_Negative_Up() { + GuessStatus guessStatus = match(-1); + + assertThat(guessStatus).isEqualTo(DOWN); + } + + @Test + @DisplayName("차가 0이라면 Correct을 반환한다.") + void match_Zero_Correct() { + GuessStatus guessStatus = match(0); + + assertThat(guessStatus).isEqualTo(CORRECT); + } + + @Test + @DisplayName("추측값을 하한값으로 가지는 Up을 생성한다.") + void match_Up() { + GuessNumber guessNumber = new GuessNumber(51); + + Status up = UP.match(guessNumber); + + assertThat(up).isInstanceOf(Up.class); + } + + @Test + @DisplayName("추측값을 상한값으로 가지는 Down을 생성한다.") + void match_Down() { + GuessNumber guessNumber = new GuessNumber(51); + + Status down = DOWN.match(guessNumber); + + assertThat(down).isInstanceOf(Down.class); + } + + @Test + @DisplayName("추측값을 정답으로 가지는 Correct을 생성한다.") + void match_Correct() { + GuessNumber guessNumber = new GuessNumber(50); + + Status correct = CORRECT.match(guessNumber); + + assertThat(correct).isInstanceOf(Correct.class); + } +} From 26c9ac844b9dba5338f8a89c4759573b082e0f93 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:03:45 +0900 Subject: [PATCH 05/26] =?UTF-8?q?refactor(GuessStatus):=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/domain/AnswerNumber.java | 2 ++ .../java/leets/land/domain/{ => status}/GuessStatus.java | 7 ++----- src/test/java/leets/land/domain/AnswerNumberTest.java | 3 ++- src/test/java/leets/land/domain/GuessStatusTest.java | 7 ++----- 4 files changed, 8 insertions(+), 11 deletions(-) rename src/main/java/leets/land/domain/{ => status}/GuessStatus.java (82%) diff --git a/src/main/java/leets/land/domain/AnswerNumber.java b/src/main/java/leets/land/domain/AnswerNumber.java index 183e20b..0b3a30d 100644 --- a/src/main/java/leets/land/domain/AnswerNumber.java +++ b/src/main/java/leets/land/domain/AnswerNumber.java @@ -1,5 +1,7 @@ package leets.land.domain; +import leets.land.domain.status.GuessStatus; + public class AnswerNumber { private final int value; diff --git a/src/main/java/leets/land/domain/GuessStatus.java b/src/main/java/leets/land/domain/status/GuessStatus.java similarity index 82% rename from src/main/java/leets/land/domain/GuessStatus.java rename to src/main/java/leets/land/domain/status/GuessStatus.java index 88a77a4..5d7e436 100644 --- a/src/main/java/leets/land/domain/GuessStatus.java +++ b/src/main/java/leets/land/domain/status/GuessStatus.java @@ -1,9 +1,6 @@ -package leets.land.domain; +package leets.land.domain.status; -import leets.land.domain.status.Correct; -import leets.land.domain.status.Down; -import leets.land.domain.status.Status; -import leets.land.domain.status.Up; +import leets.land.domain.GuessNumber; import java.util.Arrays; import java.util.function.Function; diff --git a/src/test/java/leets/land/domain/AnswerNumberTest.java b/src/test/java/leets/land/domain/AnswerNumberTest.java index 49af7ba..2f28a9b 100644 --- a/src/test/java/leets/land/domain/AnswerNumberTest.java +++ b/src/test/java/leets/land/domain/AnswerNumberTest.java @@ -1,9 +1,10 @@ package leets.land.domain; +import leets.land.domain.status.GuessStatus; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static leets.land.domain.GuessStatus.*; +import static leets.land.domain.status.GuessStatus.*; import static org.assertj.core.api.Assertions.assertThat; public class AnswerNumberTest { diff --git a/src/test/java/leets/land/domain/GuessStatusTest.java b/src/test/java/leets/land/domain/GuessStatusTest.java index b4ff6df..b6ccac2 100644 --- a/src/test/java/leets/land/domain/GuessStatusTest.java +++ b/src/test/java/leets/land/domain/GuessStatusTest.java @@ -1,13 +1,10 @@ package leets.land.domain; -import leets.land.domain.status.Correct; -import leets.land.domain.status.Down; -import leets.land.domain.status.Status; -import leets.land.domain.status.Up; +import leets.land.domain.status.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static leets.land.domain.GuessStatus.*; +import static leets.land.domain.status.GuessStatus.*; import static org.assertj.core.api.Assertions.assertThat; class GuessStatusTest { From fbb3e374b2a349a01bf0d4e316a90f76938f8c65 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:16:23 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat(Status):=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/domain/status/Correct.java | 5 +++++ src/main/java/leets/land/domain/status/Down.java | 5 +++++ src/main/java/leets/land/domain/status/Status.java | 2 ++ src/main/java/leets/land/domain/status/Up.java | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java index ba75dfd..4c8ac5c 100644 --- a/src/main/java/leets/land/domain/status/Correct.java +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -9,4 +9,9 @@ public class Correct implements Status { public Correct(GuessNumber max) { this.max = max; } + + @Override + public boolean isEnd() { + return true; + } } diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java index 8b276d9..10916ad 100644 --- a/src/main/java/leets/land/domain/status/Down.java +++ b/src/main/java/leets/land/domain/status/Down.java @@ -9,4 +9,9 @@ public class Down implements Status { public Down(GuessNumber max) { this.max = max; } + + @Override + public boolean isEnd() { + return false; + } } diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java index 760aa10..52e8268 100644 --- a/src/main/java/leets/land/domain/status/Status.java +++ b/src/main/java/leets/land/domain/status/Status.java @@ -1,4 +1,6 @@ package leets.land.domain.status; public interface Status { + + boolean isEnd(); } diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java index 04a718b..41abe70 100644 --- a/src/main/java/leets/land/domain/status/Up.java +++ b/src/main/java/leets/land/domain/status/Up.java @@ -9,4 +9,9 @@ public class Up implements Status { public Up(GuessNumber min) { this.min = min; } + + @Override + public boolean isEnd() { + return false; + } } From 19f2b1a72610b05feff73ea8ebb4b9b510165306 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:16:44 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat(RandomNumberGenerator):=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=20=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/domain/RandomNumberGenerator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/leets/land/domain/RandomNumberGenerator.java diff --git a/src/main/java/leets/land/domain/RandomNumberGenerator.java b/src/main/java/leets/land/domain/RandomNumberGenerator.java new file mode 100644 index 0000000..70f5da8 --- /dev/null +++ b/src/main/java/leets/land/domain/RandomNumberGenerator.java @@ -0,0 +1,16 @@ +package leets.land.domain; + +import java.util.Random; + +public class RandomNumberGenerator { + + private static final int ORIGIN_RANDOM = 1; + private static final int BOUND_RANDOM = 101; + + private final Random random = new Random(); + + public AnswerNumber generate() { + int randomNumber = random.nextInt(ORIGIN_RANDOM, BOUND_RANDOM); + return new AnswerNumber(randomNumber); + } +} From 3a75db931ebf680bb48d4c3e5d489d6885688eb9 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:16:58 +0900 Subject: [PATCH 08/26] =?UTF-8?q?feat(InputView):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/view/InputView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/leets/land/view/InputView.java diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java new file mode 100644 index 0000000..f8c6ba1 --- /dev/null +++ b/src/main/java/leets/land/view/InputView.java @@ -0,0 +1,12 @@ +package leets.land.view; + +import java.util.Scanner; + +public class InputView { + + private final Scanner scanner = new Scanner(System.in); + + public int readGuessNumber() { + return scanner.nextInt(); + } +} From 032f9e9a2cca598fe74bd14bb001e5ca43ce0451 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 18:17:24 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat(GameMachine):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/UpdownApplication.java | 9 +++-- .../leets/land/controller/GameMachine.java | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/main/java/leets/land/controller/GameMachine.java diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 09d7ae5..849b3c1 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,8 +1,11 @@ package leets.land; +import leets.land.controller.GameMachine; + public class UpdownApplication { - public static void main(String[] args) { - System.out.print("hihi :D"); - } + public static void main(String[] args) { + GameMachine gameMachine = new GameMachine(); + gameMachine.run(); + } } diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java new file mode 100644 index 0000000..e6fc5c3 --- /dev/null +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -0,0 +1,36 @@ +package leets.land.controller; + +import leets.land.domain.AnswerNumber; +import leets.land.domain.GuessNumber; +import leets.land.domain.RandomNumberGenerator; +import leets.land.domain.status.GuessStatus; +import leets.land.domain.status.Status; +import leets.land.view.InputView; + +public class GameMachine { + + private final InputView inputView = new InputView(); + + public void run() { + AnswerNumber answerNumber = new RandomNumberGenerator().generate(); + Status status = play(answerNumber); + while (status.isEnd()) { + status = play(answerNumber); + } + } + + private Status play(AnswerNumber answerNumber) { + GuessNumber guessNumber = readGuessNumber(); + GuessStatus guessStatus = answerNumber.compare(guessNumber); + return guessStatus.match(guessNumber); + } + + private GuessNumber readGuessNumber() { + try { + int guessNumber = inputView.readGuessNumber(); + return new GuessNumber(guessNumber); + } catch (IllegalArgumentException e) { + return readGuessNumber(); + } + } +} From 919196cfeec8a467591aa5b136cc0ee47f670181 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 22:31:10 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat(GuessRange):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=20=EB=B2=94=EC=9C=84=20=EB=8F=84=EB=A9=94=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/domain/GuessNumber.java | 19 ++++++++ .../java/leets/land/domain/GuessRange.java | 47 +++++++++++++++++++ .../leets/land/domain/GuessRangeTest.java | 31 ++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 src/main/java/leets/land/domain/GuessRange.java create mode 100644 src/test/java/leets/land/domain/GuessRangeTest.java diff --git a/src/main/java/leets/land/domain/GuessNumber.java b/src/main/java/leets/land/domain/GuessNumber.java index 6384d89..817adba 100644 --- a/src/main/java/leets/land/domain/GuessNumber.java +++ b/src/main/java/leets/land/domain/GuessNumber.java @@ -1,5 +1,7 @@ package leets.land.domain; +import java.util.Objects; + public class GuessNumber { private static final int MIN_RANGE = 1; @@ -22,4 +24,21 @@ private void validate(int value) { public int compare(int other) { return other - value; } + + public int value() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GuessNumber that = (GuessNumber) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/src/main/java/leets/land/domain/GuessRange.java b/src/main/java/leets/land/domain/GuessRange.java new file mode 100644 index 0000000..546ed2e --- /dev/null +++ b/src/main/java/leets/land/domain/GuessRange.java @@ -0,0 +1,47 @@ +package leets.land.domain; + +import java.util.Objects; + +public class GuessRange { + + private final GuessNumber min; + private final GuessNumber max; + + public GuessRange(GuessNumber min, GuessNumber max) { + this.min = min; + this.max = max; + } + + public GuessRange() { + this(new GuessNumber(1), new GuessNumber(100)); + } + + public GuessRange downMax(GuessNumber max) { + return new GuessRange(min, max); + } + + public GuessRange upMin(GuessNumber min) { + return new GuessRange(min, max); + } + + public int min() { + return min.value(); + } + + public int max() { + return max.value(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GuessRange that = (GuessRange) o; + return Objects.equals(min, that.min) && Objects.equals(max, that.max); + } + + @Override + public int hashCode() { + return Objects.hash(min, max); + } +} diff --git a/src/test/java/leets/land/domain/GuessRangeTest.java b/src/test/java/leets/land/domain/GuessRangeTest.java new file mode 100644 index 0000000..8a70d66 --- /dev/null +++ b/src/test/java/leets/land/domain/GuessRangeTest.java @@ -0,0 +1,31 @@ +package leets.land.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class GuessRangeTest { + + @Test + @DisplayName("상한값을 낮춘다") + void downMax() { + GuessRange guessRange = new GuessRange(); + GuessNumber max = new GuessNumber(50); + + GuessRange downedMax = guessRange.downMax(max); + + assertThat(downedMax).isEqualTo(new GuessRange(new GuessNumber(1), max)); + } + + @Test + @DisplayName("하한값을 높인다") + void upMin() { + GuessRange guessRange = new GuessRange(); + GuessNumber min = new GuessNumber(50); + + GuessRange downedMax = guessRange.upMin(min); + + assertThat(downedMax).isEqualTo(new GuessRange(min, new GuessNumber(100))); + } +} From 193e48cf27639a4be3c9ade9447b699124bc87f7 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 22:32:31 +0900 Subject: [PATCH 11/26] =?UTF-8?q?feat(OutputView):=20=EC=B6=94=EC=B8=A1?= =?UTF-8?q?=EA=B0=92=20=ED=8C=90=EC=A0=95=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/view/OutputView.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/leets/land/view/OutputView.java diff --git a/src/main/java/leets/land/view/OutputView.java b/src/main/java/leets/land/view/OutputView.java new file mode 100644 index 0000000..c47995a --- /dev/null +++ b/src/main/java/leets/land/view/OutputView.java @@ -0,0 +1,10 @@ +package leets.land.view; + +import leets.land.domain.status.GuessStatus; + +public class OutputView { + + public void printGuessStatus(GuessStatus guessStatus) { + System.out.println(guessStatus); + } +} From 101d5ae21a1fe09afe961622077e66785517a804 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 22:34:50 +0900 Subject: [PATCH 12/26] =?UTF-8?q?refactor(Status):=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EB=B0=8F=20=EB=B2=94=EC=9C=84=20=EC=9E=AC?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EC=97=AD=ED=95=A0=20Status=EC=97=90=20?= =?UTF-8?q?=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/controller/GameMachine.java | 34 ++++++++++++----- .../leets/land/domain/status/Correct.java | 16 +++++--- .../java/leets/land/domain/status/Down.java | 15 +++++--- .../leets/land/domain/status/GuessStatus.java | 31 +++++++++------ .../java/leets/land/domain/status/Status.java | 9 ++++- .../java/leets/land/domain/status/Up.java | 15 +++++--- src/main/java/leets/land/view/InputView.java | 9 ++++- .../leets/land/domain/GuessStatusTest.java | 38 ++----------------- 8 files changed, 94 insertions(+), 73 deletions(-) diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index e6fc5c3..1bdcab0 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -2,35 +2,49 @@ import leets.land.domain.AnswerNumber; import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; import leets.land.domain.RandomNumberGenerator; import leets.land.domain.status.GuessStatus; -import leets.land.domain.status.Status; import leets.land.view.InputView; +import leets.land.view.OutputView; public class GameMachine { private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); public void run() { AnswerNumber answerNumber = new RandomNumberGenerator().generate(); - Status status = play(answerNumber); - while (status.isEnd()) { - status = play(answerNumber); + GuessNumber guessNumber = readFirstGuessNumber(); + GuessStatus guessStatus = play(answerNumber, guessNumber); + while (guessStatus.isContinue()) { + guessNumber = readGuessNumberInRange(guessStatus.guessRange()); + guessStatus = play(answerNumber, guessNumber); } } - private Status play(AnswerNumber answerNumber) { - GuessNumber guessNumber = readGuessNumber(); + private GuessStatus play(AnswerNumber answerNumber, GuessNumber guessNumber) { GuessStatus guessStatus = answerNumber.compare(guessNumber); - return guessStatus.match(guessNumber); + outputView.printGuessStatus(guessStatus); + guessStatus.narrowRange(guessNumber); + return guessStatus; } - private GuessNumber readGuessNumber() { + private GuessNumber readFirstGuessNumber() { try { - int guessNumber = inputView.readGuessNumber(); + int guessNumber = inputView.readFirstGuessNumber(); return new GuessNumber(guessNumber); } catch (IllegalArgumentException e) { - return readGuessNumber(); + return readFirstGuessNumber(); + } + } + + private GuessNumber readGuessNumberInRange(GuessRange guessRange) { + try { + int guessNumber = inputView.readGuessNumberInRange(guessRange.min(), guessRange.max()); + return new GuessNumber(guessNumber); + } catch (IllegalArgumentException e) { + return readFirstGuessNumber(); } } } diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java index 4c8ac5c..cfec512 100644 --- a/src/main/java/leets/land/domain/status/Correct.java +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -1,17 +1,23 @@ package leets.land.domain.status; import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; public class Correct implements Status { - private final GuessNumber max; + @Override + public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + guessRange.downMax(guessNumber); + guessRange.upMin(guessNumber); + } - public Correct(GuessNumber max) { - this.max = max; + @Override + public boolean isValid(int gap) { + return gap == 0; } @Override - public boolean isEnd() { - return true; + public boolean isContinue() { + return false; } } diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java index 10916ad..849ac02 100644 --- a/src/main/java/leets/land/domain/status/Down.java +++ b/src/main/java/leets/land/domain/status/Down.java @@ -1,17 +1,22 @@ package leets.land.domain.status; import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; public class Down implements Status { - private final GuessNumber max; + @Override + public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + guessRange.downMax(guessNumber); + } - public Down(GuessNumber max) { - this.max = max; + @Override + public boolean isValid(int gap) { + return gap < 0; } @Override - public boolean isEnd() { - return false; + public boolean isContinue() { + return true; } } diff --git a/src/main/java/leets/land/domain/status/GuessStatus.java b/src/main/java/leets/land/domain/status/GuessStatus.java index 5d7e436..b1e16a2 100644 --- a/src/main/java/leets/land/domain/status/GuessStatus.java +++ b/src/main/java/leets/land/domain/status/GuessStatus.java @@ -1,33 +1,40 @@ package leets.land.domain.status; import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; import java.util.Arrays; -import java.util.function.Function; -import java.util.function.Predicate; public enum GuessStatus { - UP(compared -> compared > 0, Up::new), - DOWN(compared -> compared < 0, Down::new), - CORRECT(compared -> compared == 0, Correct::new); + UP(new Up()), + DOWN(new Down()), + CORRECT(new Correct()); - private final Predicate compare; - private final Function status; + private final Status status; + private final GuessRange guessRange; - GuessStatus(Predicate compare, Function status) { - this.compare = compare; + GuessStatus(Status status) { this.status = status; + this.guessRange = new GuessRange(); } public static GuessStatus match(int gap) { return Arrays.stream(values()) - .filter(status -> status.compare.test(gap)) + .filter(status -> status.status.isValid(gap)) .findFirst() .orElseThrow(); } - public Status match(GuessNumber guessNumber) { - return status.apply(guessNumber); + public void narrowRange(GuessNumber guessNumber) { + status.narrowRange(guessRange, guessNumber); + } + + public boolean isContinue() { + return status.isContinue(); + } + + public GuessRange guessRange() { + return guessRange; } } diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java index 52e8268..b794281 100644 --- a/src/main/java/leets/land/domain/status/Status.java +++ b/src/main/java/leets/land/domain/status/Status.java @@ -1,6 +1,13 @@ package leets.land.domain.status; +import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; + public interface Status { - boolean isEnd(); + void narrowRange(GuessRange guessRange, GuessNumber guessNumber); + + boolean isValid(int gap); + + boolean isContinue(); } diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java index 41abe70..f27468e 100644 --- a/src/main/java/leets/land/domain/status/Up.java +++ b/src/main/java/leets/land/domain/status/Up.java @@ -1,17 +1,22 @@ package leets.land.domain.status; import leets.land.domain.GuessNumber; +import leets.land.domain.GuessRange; public class Up implements Status { - private final GuessNumber min; + @Override + public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + guessRange.upMin(guessNumber); + } - public Up(GuessNumber min) { - this.min = min; + @Override + public boolean isValid(int gap) { + return gap > 0; } @Override - public boolean isEnd() { - return false; + public boolean isContinue() { + return true; } } diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java index f8c6ba1..fc45c72 100644 --- a/src/main/java/leets/land/view/InputView.java +++ b/src/main/java/leets/land/view/InputView.java @@ -4,9 +4,16 @@ public class InputView { + private static final String GUESS_NUMBER_FORMAT = "숫자를 입력해주세요(%d ~ %d)"; + private final Scanner scanner = new Scanner(System.in); - public int readGuessNumber() { + public int readFirstGuessNumber() { + return readGuessNumberInRange(1, 100); + } + + public int readGuessNumberInRange(int start, int end) { + System.out.println(String.format(GUESS_NUMBER_FORMAT, start, end)); return scanner.nextInt(); } } diff --git a/src/test/java/leets/land/domain/GuessStatusTest.java b/src/test/java/leets/land/domain/GuessStatusTest.java index b6ccac2..9766be0 100644 --- a/src/test/java/leets/land/domain/GuessStatusTest.java +++ b/src/test/java/leets/land/domain/GuessStatusTest.java @@ -1,6 +1,6 @@ package leets.land.domain; -import leets.land.domain.status.*; +import leets.land.domain.status.GuessStatus; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -12,7 +12,7 @@ class GuessStatusTest { @Test @DisplayName("차가 양수라면 Up을 반환한다.") void match_Positive_Up() { - GuessStatus guessStatus = match(1); + GuessStatus guessStatus = GuessStatus.match(1); assertThat(guessStatus).isEqualTo(UP); } @@ -20,7 +20,7 @@ void match_Positive_Up() { @Test @DisplayName("차가 음수라면 Down을 반환한다.") void match_Negative_Up() { - GuessStatus guessStatus = match(-1); + GuessStatus guessStatus = GuessStatus.match(-1); assertThat(guessStatus).isEqualTo(DOWN); } @@ -28,38 +28,8 @@ void match_Negative_Up() { @Test @DisplayName("차가 0이라면 Correct을 반환한다.") void match_Zero_Correct() { - GuessStatus guessStatus = match(0); + GuessStatus guessStatus = GuessStatus.match(0); assertThat(guessStatus).isEqualTo(CORRECT); } - - @Test - @DisplayName("추측값을 하한값으로 가지는 Up을 생성한다.") - void match_Up() { - GuessNumber guessNumber = new GuessNumber(51); - - Status up = UP.match(guessNumber); - - assertThat(up).isInstanceOf(Up.class); - } - - @Test - @DisplayName("추측값을 상한값으로 가지는 Down을 생성한다.") - void match_Down() { - GuessNumber guessNumber = new GuessNumber(51); - - Status down = DOWN.match(guessNumber); - - assertThat(down).isInstanceOf(Down.class); - } - - @Test - @DisplayName("추측값을 정답으로 가지는 Correct을 생성한다.") - void match_Correct() { - GuessNumber guessNumber = new GuessNumber(50); - - Status correct = CORRECT.match(guessNumber); - - assertThat(correct).isInstanceOf(Correct.class); - } } From e66ff5fc5b1de3502845e9e50160f6d7f6e5e2ca Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 22:59:04 +0900 Subject: [PATCH 13/26] =?UTF-8?q?fix(GameMachine):=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EB=90=98=EB=8F=84=EB=A1=9D=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/leets/land/controller/GameMachine.java | 8 +++++--- src/main/java/leets/land/domain/status/Correct.java | 6 +++--- src/main/java/leets/land/domain/status/Down.java | 4 ++-- .../java/leets/land/domain/status/GuessStatus.java | 10 ++-------- src/main/java/leets/land/domain/status/Status.java | 2 +- src/main/java/leets/land/domain/status/Up.java | 4 ++-- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index 1bdcab0..9bb0dc0 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -15,18 +15,20 @@ public class GameMachine { public void run() { AnswerNumber answerNumber = new RandomNumberGenerator().generate(); + GuessRange guessRange = new GuessRange(); GuessNumber guessNumber = readFirstGuessNumber(); GuessStatus guessStatus = play(answerNumber, guessNumber); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); while (guessStatus.isContinue()) { - guessNumber = readGuessNumberInRange(guessStatus.guessRange()); + guessNumber = readGuessNumberInRange(guessRange); guessStatus = play(answerNumber, guessNumber); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); } } private GuessStatus play(AnswerNumber answerNumber, GuessNumber guessNumber) { GuessStatus guessStatus = answerNumber.compare(guessNumber); outputView.printGuessStatus(guessStatus); - guessStatus.narrowRange(guessNumber); return guessStatus; } @@ -44,7 +46,7 @@ private GuessNumber readGuessNumberInRange(GuessRange guessRange) { int guessNumber = inputView.readGuessNumberInRange(guessRange.min(), guessRange.max()); return new GuessNumber(guessNumber); } catch (IllegalArgumentException e) { - return readFirstGuessNumber(); + return readGuessNumberInRange(guessRange); } } } diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java index cfec512..38f41db 100644 --- a/src/main/java/leets/land/domain/status/Correct.java +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -6,9 +6,9 @@ public class Correct implements Status { @Override - public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - guessRange.downMax(guessNumber); - guessRange.upMin(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + GuessRange downMaxed = guessRange.downMax(guessNumber); + return downMaxed.upMin(guessNumber); } @Override diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java index 849ac02..1ae084b 100644 --- a/src/main/java/leets/land/domain/status/Down.java +++ b/src/main/java/leets/land/domain/status/Down.java @@ -6,8 +6,8 @@ public class Down implements Status { @Override - public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - guessRange.downMax(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + return guessRange.downMax(guessNumber); } @Override diff --git a/src/main/java/leets/land/domain/status/GuessStatus.java b/src/main/java/leets/land/domain/status/GuessStatus.java index b1e16a2..8821282 100644 --- a/src/main/java/leets/land/domain/status/GuessStatus.java +++ b/src/main/java/leets/land/domain/status/GuessStatus.java @@ -12,11 +12,9 @@ public enum GuessStatus { CORRECT(new Correct()); private final Status status; - private final GuessRange guessRange; GuessStatus(Status status) { this.status = status; - this.guessRange = new GuessRange(); } public static GuessStatus match(int gap) { @@ -26,15 +24,11 @@ public static GuessStatus match(int gap) { .orElseThrow(); } - public void narrowRange(GuessNumber guessNumber) { - status.narrowRange(guessRange, guessNumber); + public GuessRange narrowRange(GuessNumber guessNumber, GuessRange guessRange) { + return status.narrowRange(guessRange, guessNumber); } public boolean isContinue() { return status.isContinue(); } - - public GuessRange guessRange() { - return guessRange; - } } diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java index b794281..39dd51b 100644 --- a/src/main/java/leets/land/domain/status/Status.java +++ b/src/main/java/leets/land/domain/status/Status.java @@ -5,7 +5,7 @@ public interface Status { - void narrowRange(GuessRange guessRange, GuessNumber guessNumber); + GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber); boolean isValid(int gap); diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java index f27468e..f4e181c 100644 --- a/src/main/java/leets/land/domain/status/Up.java +++ b/src/main/java/leets/land/domain/status/Up.java @@ -6,8 +6,8 @@ public class Up implements Status { @Override - public void narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - guessRange.upMin(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { + return guessRange.upMin(guessNumber); } @Override From 45eed1f30af668fb91baaf928873f9376f520d24 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 23:12:38 +0900 Subject: [PATCH 14/26] =?UTF-8?q?refactor(GameMachine):=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=20=EC=9E=AC=EA=B7=80=EB=A1=9C=20=ED=98=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/controller/GameMachine.java | 24 +++++-------------- src/main/java/leets/land/view/InputView.java | 4 ---- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index 9bb0dc0..6254956 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -16,28 +16,16 @@ public class GameMachine { public void run() { AnswerNumber answerNumber = new RandomNumberGenerator().generate(); GuessRange guessRange = new GuessRange(); - GuessNumber guessNumber = readFirstGuessNumber(); - GuessStatus guessStatus = play(answerNumber, guessNumber); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); - while (guessStatus.isContinue()) { - guessNumber = readGuessNumberInRange(guessRange); - guessStatus = play(answerNumber, guessNumber); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); - } + play(answerNumber, guessRange); } - private GuessStatus play(AnswerNumber answerNumber, GuessNumber guessNumber) { + private void play(AnswerNumber answerNumber, GuessRange guessRange) { + GuessNumber guessNumber = readGuessNumberInRange(guessRange); GuessStatus guessStatus = answerNumber.compare(guessNumber); outputView.printGuessStatus(guessStatus); - return guessStatus; - } - - private GuessNumber readFirstGuessNumber() { - try { - int guessNumber = inputView.readFirstGuessNumber(); - return new GuessNumber(guessNumber); - } catch (IllegalArgumentException e) { - return readFirstGuessNumber(); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); + if (guessStatus.isContinue()) { + play(answerNumber, guessRange); } } diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java index fc45c72..fa24591 100644 --- a/src/main/java/leets/land/view/InputView.java +++ b/src/main/java/leets/land/view/InputView.java @@ -8,10 +8,6 @@ public class InputView { private final Scanner scanner = new Scanner(System.in); - public int readFirstGuessNumber() { - return readGuessNumberInRange(1, 100); - } - public int readGuessNumberInRange(int start, int end) { System.out.println(String.format(GUESS_NUMBER_FORMAT, start, end)); return scanner.nextInt(); From de95d7b3143cd6aeca17142d8d32c792628e241c Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 23:46:47 +0900 Subject: [PATCH 15/26] =?UTF-8?q?fix(InputView):=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/view/InputView.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java index fa24591..07cc9d0 100644 --- a/src/main/java/leets/land/view/InputView.java +++ b/src/main/java/leets/land/view/InputView.java @@ -4,12 +4,17 @@ public class InputView { - private static final String GUESS_NUMBER_FORMAT = "숫자를 입력해주세요(%d ~ %d)"; + private static final String GUESS_NUMBER_FORMAT = "숫자를 입력해주세요(%d ~ %d) : "; private final Scanner scanner = new Scanner(System.in); public int readGuessNumberInRange(int start, int end) { - System.out.println(String.format(GUESS_NUMBER_FORMAT, start, end)); - return scanner.nextInt(); + System.out.print(String.format(GUESS_NUMBER_FORMAT, start, end)); + try { + return Integer.parseInt(scanner.nextLine()); + } catch (NumberFormatException e) { + System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); + return readGuessNumberInRange(start, end); + } } } From 4aeee304aea0481a40df920ef0f14bd81e552d79 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 23:47:24 +0900 Subject: [PATCH 16/26] =?UTF-8?q?feat(UpDownGame):=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/controller/GameMachine.java | 18 +++++++++--------- .../java/leets/land/domain/GuessRange.java | 12 ++++++++++-- .../java/leets/land/domain/UpDownGame.java | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 src/main/java/leets/land/domain/UpDownGame.java diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index 6254956..8f78c3b 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -1,9 +1,8 @@ package leets.land.controller; -import leets.land.domain.AnswerNumber; import leets.land.domain.GuessNumber; import leets.land.domain.GuessRange; -import leets.land.domain.RandomNumberGenerator; +import leets.land.domain.UpDownGame; import leets.land.domain.status.GuessStatus; import leets.land.view.InputView; import leets.land.view.OutputView; @@ -14,26 +13,27 @@ public class GameMachine { private final OutputView outputView = new OutputView(); public void run() { - AnswerNumber answerNumber = new RandomNumberGenerator().generate(); - GuessRange guessRange = new GuessRange(); - play(answerNumber, guessRange); + UpDownGame upDownGame = new UpDownGame(); + play(upDownGame); } - private void play(AnswerNumber answerNumber, GuessRange guessRange) { + private void play(UpDownGame upDownGame) { + GuessRange guessRange = upDownGame.guessRange(); GuessNumber guessNumber = readGuessNumberInRange(guessRange); - GuessStatus guessStatus = answerNumber.compare(guessNumber); + GuessStatus guessStatus = upDownGame.play(guessNumber); outputView.printGuessStatus(guessStatus); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); if (guessStatus.isContinue()) { - play(answerNumber, guessRange); + play(upDownGame); } } private GuessNumber readGuessNumberInRange(GuessRange guessRange) { try { int guessNumber = inputView.readGuessNumberInRange(guessRange.min(), guessRange.max()); + guessRange.checkRange(guessNumber); return new GuessNumber(guessNumber); } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); return readGuessNumberInRange(guessRange); } } diff --git a/src/main/java/leets/land/domain/GuessRange.java b/src/main/java/leets/land/domain/GuessRange.java index 546ed2e..cd88a61 100644 --- a/src/main/java/leets/land/domain/GuessRange.java +++ b/src/main/java/leets/land/domain/GuessRange.java @@ -4,8 +4,10 @@ public class GuessRange { - private final GuessNumber min; - private final GuessNumber max; + private static final String ERROR_FORMAT = "[ERROR] %s"; + + private GuessNumber min; + private GuessNumber max; public GuessRange(GuessNumber min, GuessNumber max) { this.min = min; @@ -32,6 +34,12 @@ public int max() { return max.value(); } + public void checkRange(int guessNumber) { + if (guessNumber < min() || guessNumber > max()) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "범위를 벗어납니다.")); + } + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/leets/land/domain/UpDownGame.java b/src/main/java/leets/land/domain/UpDownGame.java new file mode 100644 index 0000000..0c5d26d --- /dev/null +++ b/src/main/java/leets/land/domain/UpDownGame.java @@ -0,0 +1,19 @@ +package leets.land.domain; + +import leets.land.domain.status.GuessStatus; + +public class UpDownGame { + + private final AnswerNumber answerNumber = new RandomNumberGenerator().generate(); + private GuessRange guessRange = new GuessRange(); + + public GuessStatus play(GuessNumber guessNumber) { + GuessStatus guessStatus = answerNumber.compare(guessNumber); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); + return guessStatus; + } + + public GuessRange guessRange() { + return guessRange; + } +} From 2ae19ba016e22aa7c1be1b1fbdb6a0b2e5415378 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 23:49:33 +0900 Subject: [PATCH 17/26] =?UTF-8?q?fix(UpDownGame):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/controller/GameMachine.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index 8f78c3b..ac0c66d 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -18,8 +18,7 @@ public void run() { } private void play(UpDownGame upDownGame) { - GuessRange guessRange = upDownGame.guessRange(); - GuessNumber guessNumber = readGuessNumberInRange(guessRange); + GuessNumber guessNumber = readGuessNumberInRange(upDownGame.guessRange()); GuessStatus guessStatus = upDownGame.play(guessNumber); outputView.printGuessStatus(guessStatus); if (guessStatus.isContinue()) { From 59258706bc6d32caadfc36a4b5d0e3f72e694064 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sat, 13 Apr 2024 23:54:00 +0900 Subject: [PATCH 18/26] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 77689ad..f2f8d5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,22 +1,27 @@ ## 기능 요구 사항 **버전** + - [ ] 숫자 버전은 1번이다. - [ ] 영어 버전은 2번이다. **난수** -- [ ] 숫자 버전은 1 ~ 100 사이의 정답을 가진다. + +- [x] 숫자 버전은 1 ~ 100 사이의 정답을 가진다. - [ ] 영어 버전은 A ~ z 사이의 정답을 가진다. -**게임기** -- [ ] 추측값과 정답을 비교한다. -- [ ] 게임 상태를 반환한다. +**정답** + +- [x] 추측값과 정답을 비교한다. +- [x] 게임 상태를 반환한다. **게임 상태** - - [ ] 추측값이 정답보다 작은 경우 UP 상태이다. - - [ ] 추측값이 정답보다 큰 경우 DOWN 상태이다. - - [ ] 추측값이 정답과 일치하는 경우 CORRECT 상태이다. + +- [x] 추측값이 정답보다 작은 경우 UP 상태이다. +- [x] 추측값이 정답보다 큰 경우 DOWN 상태이다. +- [x] 추측값이 정답과 일치하는 경우 CORRECT 상태이다. **시도 횟수** + - [ ] 사용자가 정답을 맞출 때까지 시도한 횟수를 출력한다 - - 잘못된 값 입력 역시 시도한 횟수에 포함 되어야 한다. + - 잘못된 값 입력 역시 시도한 횟수에 포함 되어야 한다. From 25502f8ec564175b26148d3c7c1324fd86d1a2d1 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 11:28:18 +0900 Subject: [PATCH 19/26] =?UTF-8?q?refactor(GuessRange):=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/domain/GuessRange.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/leets/land/domain/GuessRange.java b/src/main/java/leets/land/domain/GuessRange.java index cd88a61..c6fb24e 100644 --- a/src/main/java/leets/land/domain/GuessRange.java +++ b/src/main/java/leets/land/domain/GuessRange.java @@ -6,8 +6,8 @@ public class GuessRange { private static final String ERROR_FORMAT = "[ERROR] %s"; - private GuessNumber min; - private GuessNumber max; + private final GuessNumber min; + private final GuessNumber max; public GuessRange(GuessNumber min, GuessNumber max) { this.min = min; @@ -26,6 +26,12 @@ public GuessRange upMin(GuessNumber min) { return new GuessRange(min, max); } + public void checkRange(int guessNumber) { + if (guessNumber < min() || guessNumber > max()) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "범위를 벗어납니다.")); + } + } + public int min() { return min.value(); } @@ -34,12 +40,6 @@ public int max() { return max.value(); } - public void checkRange(int guessNumber) { - if (guessNumber < min() || guessNumber > max()) { - throw new IllegalArgumentException(String.format(ERROR_FORMAT, "범위를 벗어납니다.")); - } - } - @Override public boolean equals(Object o) { if (this == o) return true; From 0a0cc73751e1d449cd916a02cdd88822dfde41cf Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 20:58:01 +0900 Subject: [PATCH 20/26] =?UTF-8?q?feat(UpDownGame):=20UpDownGame=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=20AlphabetUpDownGame=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/controller/GameMachine.java | 3 ++- .../leets/land/domain/AlphabetUpDownGame.java | 21 +++++++++++++++++++ .../leets/land/domain/NumberUpDownGame.java | 21 +++++++++++++++++++ .../land/domain/RandomAlphabetGenerator.java | 21 +++++++++++++++++++ .../java/leets/land/domain/UpDownGame.java | 15 +++---------- 5 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 src/main/java/leets/land/domain/AlphabetUpDownGame.java create mode 100644 src/main/java/leets/land/domain/NumberUpDownGame.java create mode 100644 src/main/java/leets/land/domain/RandomAlphabetGenerator.java diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index ac0c66d..a387541 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -2,6 +2,7 @@ import leets.land.domain.GuessNumber; import leets.land.domain.GuessRange; +import leets.land.domain.NumberUpDownGame; import leets.land.domain.UpDownGame; import leets.land.domain.status.GuessStatus; import leets.land.view.InputView; @@ -13,7 +14,7 @@ public class GameMachine { private final OutputView outputView = new OutputView(); public void run() { - UpDownGame upDownGame = new UpDownGame(); + UpDownGame upDownGame = new NumberUpDownGame(); play(upDownGame); } diff --git a/src/main/java/leets/land/domain/AlphabetUpDownGame.java b/src/main/java/leets/land/domain/AlphabetUpDownGame.java new file mode 100644 index 0000000..0813548 --- /dev/null +++ b/src/main/java/leets/land/domain/AlphabetUpDownGame.java @@ -0,0 +1,21 @@ +package leets.land.domain; + +import leets.land.domain.status.GuessStatus; + +public class AlphabetUpDownGame implements UpDownGame { + + private final AnswerNumber answerNumber = new RandomAlphabetGenerator().generate(); + private GuessRange guessRange = new GuessRange(new GuessNumber('A'), new GuessNumber('z')); + + @Override + public GuessStatus play(GuessNumber guessNumber) { + GuessStatus guessStatus = answerNumber.compare(guessNumber); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); + return guessStatus; + } + + @Override + public GuessRange guessRange() { + return guessRange; + } +} diff --git a/src/main/java/leets/land/domain/NumberUpDownGame.java b/src/main/java/leets/land/domain/NumberUpDownGame.java new file mode 100644 index 0000000..a505534 --- /dev/null +++ b/src/main/java/leets/land/domain/NumberUpDownGame.java @@ -0,0 +1,21 @@ +package leets.land.domain; + +import leets.land.domain.status.GuessStatus; + +public class NumberUpDownGame implements UpDownGame { + + private final AnswerNumber answerNumber = new RandomNumberGenerator().generate(); + private GuessRange guessRange = new GuessRange(); + + @Override + public GuessStatus play(GuessNumber guessNumber) { + GuessStatus guessStatus = answerNumber.compare(guessNumber); + guessRange = guessStatus.narrowRange(guessNumber, guessRange); + return guessStatus; + } + + @Override + public GuessRange guessRange() { + return guessRange; + } +} diff --git a/src/main/java/leets/land/domain/RandomAlphabetGenerator.java b/src/main/java/leets/land/domain/RandomAlphabetGenerator.java new file mode 100644 index 0000000..0952701 --- /dev/null +++ b/src/main/java/leets/land/domain/RandomAlphabetGenerator.java @@ -0,0 +1,21 @@ +package leets.land.domain; + +import java.util.Random; + +public class RandomAlphabetGenerator { + + private static final int CAPITAL_ORIGIN_RANDOM = 'A'; + private static final int CAPITAL_BOUND_RANDOM = 'Z'; + private static final int TO_SMALL = 'a' - 'A'; + + private final Random random = new Random(); + + public AnswerNumber generate() { + int randomNumber = random.nextInt(CAPITAL_ORIGIN_RANDOM, CAPITAL_BOUND_RANDOM); + boolean isSmall = random.nextBoolean(); + if (isSmall) { + randomNumber += TO_SMALL; + } + return new AnswerNumber(randomNumber); + } +} diff --git a/src/main/java/leets/land/domain/UpDownGame.java b/src/main/java/leets/land/domain/UpDownGame.java index 0c5d26d..0fed6a0 100644 --- a/src/main/java/leets/land/domain/UpDownGame.java +++ b/src/main/java/leets/land/domain/UpDownGame.java @@ -2,18 +2,9 @@ import leets.land.domain.status.GuessStatus; -public class UpDownGame { +public interface UpDownGame { - private final AnswerNumber answerNumber = new RandomNumberGenerator().generate(); - private GuessRange guessRange = new GuessRange(); + GuessStatus play(GuessNumber guessNumber); - public GuessStatus play(GuessNumber guessNumber) { - GuessStatus guessStatus = answerNumber.compare(guessNumber); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); - return guessStatus; - } - - public GuessRange guessRange() { - return guessRange; - } + GuessRange guessRange(); } From 9fb43f271f21b28234345cb8a665036a15a3ecc1 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 21:24:47 +0900 Subject: [PATCH 21/26] =?UTF-8?q?feat(GuessValue):=20GuessValue=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=9C=20GuessAlphabet=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/domain/AlphabetUpDownGame.java | 2 +- .../java/leets/land/domain/GuessAlphabet.java | 44 +++++++++++++++++++ .../java/leets/land/domain/GuessNumber.java | 2 +- .../java/leets/land/domain/GuessRange.java | 18 +++----- .../java/leets/land/domain/GuessValue.java | 8 ++++ .../leets/land/domain/NumberUpDownGame.java | 2 +- .../leets/land/domain/GuessRangeTest.java | 4 +- 7 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 src/main/java/leets/land/domain/GuessAlphabet.java create mode 100644 src/main/java/leets/land/domain/GuessValue.java diff --git a/src/main/java/leets/land/domain/AlphabetUpDownGame.java b/src/main/java/leets/land/domain/AlphabetUpDownGame.java index 0813548..b8d692a 100644 --- a/src/main/java/leets/land/domain/AlphabetUpDownGame.java +++ b/src/main/java/leets/land/domain/AlphabetUpDownGame.java @@ -5,7 +5,7 @@ public class AlphabetUpDownGame implements UpDownGame { private final AnswerNumber answerNumber = new RandomAlphabetGenerator().generate(); - private GuessRange guessRange = new GuessRange(new GuessNumber('A'), new GuessNumber('z')); + private GuessRange guessRange = new GuessRange(new GuessAlphabet('A'), new GuessAlphabet('z')); @Override public GuessStatus play(GuessNumber guessNumber) { diff --git a/src/main/java/leets/land/domain/GuessAlphabet.java b/src/main/java/leets/land/domain/GuessAlphabet.java new file mode 100644 index 0000000..d8ea26f --- /dev/null +++ b/src/main/java/leets/land/domain/GuessAlphabet.java @@ -0,0 +1,44 @@ +package leets.land.domain; + +import java.util.Objects; + +public class GuessAlphabet implements GuessValue { + + private static final int MIN_RANGE = 'A'; + private static final int MAX_RANGE = 'z'; + private static final String ERROR_FORMAT = "[ERROR] %s"; + + private final int value; + + public GuessAlphabet(int value) { + validate(value); + this.value = value; + } + + private void validate(int value) { + if (value < MIN_RANGE || value > MAX_RANGE) { + throw new IllegalArgumentException(String.format(ERROR_FORMAT, "추측값의 범위는 A 이상 z 이하입니다")); + } + } + + public int compare(int other) { + return other - value; + } + + public int value() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GuessAlphabet that = (GuessAlphabet) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/leets/land/domain/GuessNumber.java b/src/main/java/leets/land/domain/GuessNumber.java index 817adba..0859db2 100644 --- a/src/main/java/leets/land/domain/GuessNumber.java +++ b/src/main/java/leets/land/domain/GuessNumber.java @@ -2,7 +2,7 @@ import java.util.Objects; -public class GuessNumber { +public class GuessNumber implements GuessValue { private static final int MIN_RANGE = 1; private static final int MAX_RANGE = 100; diff --git a/src/main/java/leets/land/domain/GuessRange.java b/src/main/java/leets/land/domain/GuessRange.java index c6fb24e..966a400 100644 --- a/src/main/java/leets/land/domain/GuessRange.java +++ b/src/main/java/leets/land/domain/GuessRange.java @@ -6,28 +6,24 @@ public class GuessRange { private static final String ERROR_FORMAT = "[ERROR] %s"; - private final GuessNumber min; - private final GuessNumber max; + private final GuessValue min; + private final GuessValue max; - public GuessRange(GuessNumber min, GuessNumber max) { + public GuessRange(GuessValue min, GuessValue max) { this.min = min; this.max = max; } - public GuessRange() { - this(new GuessNumber(1), new GuessNumber(100)); - } - - public GuessRange downMax(GuessNumber max) { + public GuessRange downMax(GuessValue max) { return new GuessRange(min, max); } - public GuessRange upMin(GuessNumber min) { + public GuessRange upMin(GuessValue min) { return new GuessRange(min, max); } - public void checkRange(int guessNumber) { - if (guessNumber < min() || guessNumber > max()) { + public void checkRange(int guessValue) { + if (guessValue < min() || guessValue > max()) { throw new IllegalArgumentException(String.format(ERROR_FORMAT, "범위를 벗어납니다.")); } } diff --git a/src/main/java/leets/land/domain/GuessValue.java b/src/main/java/leets/land/domain/GuessValue.java new file mode 100644 index 0000000..72fb0c7 --- /dev/null +++ b/src/main/java/leets/land/domain/GuessValue.java @@ -0,0 +1,8 @@ +package leets.land.domain; + +public interface GuessValue { + + int compare(int other); + + int value(); +} diff --git a/src/main/java/leets/land/domain/NumberUpDownGame.java b/src/main/java/leets/land/domain/NumberUpDownGame.java index a505534..d888cff 100644 --- a/src/main/java/leets/land/domain/NumberUpDownGame.java +++ b/src/main/java/leets/land/domain/NumberUpDownGame.java @@ -5,7 +5,7 @@ public class NumberUpDownGame implements UpDownGame { private final AnswerNumber answerNumber = new RandomNumberGenerator().generate(); - private GuessRange guessRange = new GuessRange(); + private GuessRange guessRange = new GuessRange(new GuessNumber(1), new GuessNumber(100)); @Override public GuessStatus play(GuessNumber guessNumber) { diff --git a/src/test/java/leets/land/domain/GuessRangeTest.java b/src/test/java/leets/land/domain/GuessRangeTest.java index 8a70d66..90914b3 100644 --- a/src/test/java/leets/land/domain/GuessRangeTest.java +++ b/src/test/java/leets/land/domain/GuessRangeTest.java @@ -10,7 +10,7 @@ class GuessRangeTest { @Test @DisplayName("상한값을 낮춘다") void downMax() { - GuessRange guessRange = new GuessRange(); + GuessRange guessRange = new GuessRange(new GuessNumber(1), new GuessNumber(100)); GuessNumber max = new GuessNumber(50); GuessRange downedMax = guessRange.downMax(max); @@ -21,7 +21,7 @@ void downMax() { @Test @DisplayName("하한값을 높인다") void upMin() { - GuessRange guessRange = new GuessRange(); + GuessRange guessRange = new GuessRange(new GuessNumber(1), new GuessNumber(100)); GuessNumber min = new GuessNumber(50); GuessRange downedMax = guessRange.upMin(min); From 148ae53379355eb227a6986b222c28bcada2907d Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 21:27:46 +0900 Subject: [PATCH 22/26] =?UTF-8?q?refactor(All):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=94=EC=B8=A1=EC=9C=BC=EB=A1=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/leets/land/controller/GameMachine.java | 8 ++++---- src/main/java/leets/land/domain/AnswerNumber.java | 1 + .../java/leets/land/domain/{ => guess}/GuessAlphabet.java | 2 +- .../java/leets/land/domain/{ => guess}/GuessNumber.java | 2 +- .../java/leets/land/domain/{ => guess}/GuessRange.java | 2 +- .../java/leets/land/domain/{ => guess}/GuessValue.java | 2 +- src/main/java/leets/land/domain/status/Correct.java | 4 ++-- src/main/java/leets/land/domain/status/Down.java | 4 ++-- src/main/java/leets/land/domain/status/GuessStatus.java | 4 ++-- src/main/java/leets/land/domain/status/Status.java | 4 ++-- src/main/java/leets/land/domain/status/Up.java | 4 ++-- .../land/domain/{ => updowngame}/AlphabetUpDownGame.java | 6 +++++- .../land/domain/{ => updowngame}/NumberUpDownGame.java | 5 ++++- .../domain/{ => updowngame}/RandomAlphabetGenerator.java | 4 +++- .../domain/{ => updowngame}/RandomNumberGenerator.java | 4 +++- .../leets/land/domain/{ => updowngame}/UpDownGame.java | 4 +++- src/test/java/leets/land/domain/AnswerNumberTest.java | 1 + src/test/java/leets/land/domain/GuessNumberTest.java | 1 + src/test/java/leets/land/domain/GuessRangeTest.java | 2 ++ 19 files changed, 41 insertions(+), 23 deletions(-) rename src/main/java/leets/land/domain/{ => guess}/GuessAlphabet.java (96%) rename src/main/java/leets/land/domain/{ => guess}/GuessNumber.java (96%) rename src/main/java/leets/land/domain/{ => guess}/GuessRange.java (97%) rename src/main/java/leets/land/domain/{ => guess}/GuessValue.java (70%) rename src/main/java/leets/land/domain/{ => updowngame}/AlphabetUpDownGame.java (74%) rename src/main/java/leets/land/domain/{ => updowngame}/NumberUpDownGame.java (78%) rename src/main/java/leets/land/domain/{ => updowngame}/RandomAlphabetGenerator.java (88%) rename src/main/java/leets/land/domain/{ => updowngame}/RandomNumberGenerator.java (82%) rename src/main/java/leets/land/domain/{ => updowngame}/UpDownGame.java (55%) diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java index a387541..4f67545 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -1,10 +1,10 @@ package leets.land.controller; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; -import leets.land.domain.NumberUpDownGame; -import leets.land.domain.UpDownGame; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import leets.land.domain.status.GuessStatus; +import leets.land.domain.updowngame.NumberUpDownGame; +import leets.land.domain.updowngame.UpDownGame; import leets.land.view.InputView; import leets.land.view.OutputView; diff --git a/src/main/java/leets/land/domain/AnswerNumber.java b/src/main/java/leets/land/domain/AnswerNumber.java index 0b3a30d..b171a14 100644 --- a/src/main/java/leets/land/domain/AnswerNumber.java +++ b/src/main/java/leets/land/domain/AnswerNumber.java @@ -1,5 +1,6 @@ package leets.land.domain; +import leets.land.domain.guess.GuessNumber; import leets.land.domain.status.GuessStatus; public class AnswerNumber { diff --git a/src/main/java/leets/land/domain/GuessAlphabet.java b/src/main/java/leets/land/domain/guess/GuessAlphabet.java similarity index 96% rename from src/main/java/leets/land/domain/GuessAlphabet.java rename to src/main/java/leets/land/domain/guess/GuessAlphabet.java index d8ea26f..691f0bb 100644 --- a/src/main/java/leets/land/domain/GuessAlphabet.java +++ b/src/main/java/leets/land/domain/guess/GuessAlphabet.java @@ -1,4 +1,4 @@ -package leets.land.domain; +package leets.land.domain.guess; import java.util.Objects; diff --git a/src/main/java/leets/land/domain/GuessNumber.java b/src/main/java/leets/land/domain/guess/GuessNumber.java similarity index 96% rename from src/main/java/leets/land/domain/GuessNumber.java rename to src/main/java/leets/land/domain/guess/GuessNumber.java index 0859db2..748050a 100644 --- a/src/main/java/leets/land/domain/GuessNumber.java +++ b/src/main/java/leets/land/domain/guess/GuessNumber.java @@ -1,4 +1,4 @@ -package leets.land.domain; +package leets.land.domain.guess; import java.util.Objects; diff --git a/src/main/java/leets/land/domain/GuessRange.java b/src/main/java/leets/land/domain/guess/GuessRange.java similarity index 97% rename from src/main/java/leets/land/domain/GuessRange.java rename to src/main/java/leets/land/domain/guess/GuessRange.java index 966a400..fcd6d8b 100644 --- a/src/main/java/leets/land/domain/GuessRange.java +++ b/src/main/java/leets/land/domain/guess/GuessRange.java @@ -1,4 +1,4 @@ -package leets.land.domain; +package leets.land.domain.guess; import java.util.Objects; diff --git a/src/main/java/leets/land/domain/GuessValue.java b/src/main/java/leets/land/domain/guess/GuessValue.java similarity index 70% rename from src/main/java/leets/land/domain/GuessValue.java rename to src/main/java/leets/land/domain/guess/GuessValue.java index 72fb0c7..40fef52 100644 --- a/src/main/java/leets/land/domain/GuessValue.java +++ b/src/main/java/leets/land/domain/guess/GuessValue.java @@ -1,4 +1,4 @@ -package leets.land.domain; +package leets.land.domain.guess; public interface GuessValue { diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java index 38f41db..33f8f16 100644 --- a/src/main/java/leets/land/domain/status/Correct.java +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; public class Correct implements Status { diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java index 1ae084b..0ff51b0 100644 --- a/src/main/java/leets/land/domain/status/Down.java +++ b/src/main/java/leets/land/domain/status/Down.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; public class Down implements Status { diff --git a/src/main/java/leets/land/domain/status/GuessStatus.java b/src/main/java/leets/land/domain/status/GuessStatus.java index 8821282..9875c0e 100644 --- a/src/main/java/leets/land/domain/status/GuessStatus.java +++ b/src/main/java/leets/land/domain/status/GuessStatus.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import java.util.Arrays; diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java index 39dd51b..2db67ba 100644 --- a/src/main/java/leets/land/domain/status/Status.java +++ b/src/main/java/leets/land/domain/status/Status.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; public interface Status { diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java index f4e181c..26d76bb 100644 --- a/src/main/java/leets/land/domain/status/Up.java +++ b/src/main/java/leets/land/domain/status/Up.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.GuessNumber; -import leets.land.domain.GuessRange; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; public class Up implements Status { diff --git a/src/main/java/leets/land/domain/AlphabetUpDownGame.java b/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java similarity index 74% rename from src/main/java/leets/land/domain/AlphabetUpDownGame.java rename to src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java index b8d692a..17311e0 100644 --- a/src/main/java/leets/land/domain/AlphabetUpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java @@ -1,5 +1,9 @@ -package leets.land.domain; +package leets.land.domain.updowngame; +import leets.land.domain.AnswerNumber; +import leets.land.domain.guess.GuessAlphabet; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import leets.land.domain.status.GuessStatus; public class AlphabetUpDownGame implements UpDownGame { diff --git a/src/main/java/leets/land/domain/NumberUpDownGame.java b/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java similarity index 78% rename from src/main/java/leets/land/domain/NumberUpDownGame.java rename to src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java index d888cff..4ea34a9 100644 --- a/src/main/java/leets/land/domain/NumberUpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java @@ -1,5 +1,8 @@ -package leets.land.domain; +package leets.land.domain.updowngame; +import leets.land.domain.AnswerNumber; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import leets.land.domain.status.GuessStatus; public class NumberUpDownGame implements UpDownGame { diff --git a/src/main/java/leets/land/domain/RandomAlphabetGenerator.java b/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java similarity index 88% rename from src/main/java/leets/land/domain/RandomAlphabetGenerator.java rename to src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java index 0952701..23916d4 100644 --- a/src/main/java/leets/land/domain/RandomAlphabetGenerator.java +++ b/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java @@ -1,4 +1,6 @@ -package leets.land.domain; +package leets.land.domain.updowngame; + +import leets.land.domain.AnswerNumber; import java.util.Random; diff --git a/src/main/java/leets/land/domain/RandomNumberGenerator.java b/src/main/java/leets/land/domain/updowngame/RandomNumberGenerator.java similarity index 82% rename from src/main/java/leets/land/domain/RandomNumberGenerator.java rename to src/main/java/leets/land/domain/updowngame/RandomNumberGenerator.java index 70f5da8..fe3e95f 100644 --- a/src/main/java/leets/land/domain/RandomNumberGenerator.java +++ b/src/main/java/leets/land/domain/updowngame/RandomNumberGenerator.java @@ -1,4 +1,6 @@ -package leets.land.domain; +package leets.land.domain.updowngame; + +import leets.land.domain.AnswerNumber; import java.util.Random; diff --git a/src/main/java/leets/land/domain/UpDownGame.java b/src/main/java/leets/land/domain/updowngame/UpDownGame.java similarity index 55% rename from src/main/java/leets/land/domain/UpDownGame.java rename to src/main/java/leets/land/domain/updowngame/UpDownGame.java index 0fed6a0..92f8bb0 100644 --- a/src/main/java/leets/land/domain/UpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/UpDownGame.java @@ -1,5 +1,7 @@ -package leets.land.domain; +package leets.land.domain.updowngame; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import leets.land.domain.status.GuessStatus; public interface UpDownGame { diff --git a/src/test/java/leets/land/domain/AnswerNumberTest.java b/src/test/java/leets/land/domain/AnswerNumberTest.java index 2f28a9b..234192d 100644 --- a/src/test/java/leets/land/domain/AnswerNumberTest.java +++ b/src/test/java/leets/land/domain/AnswerNumberTest.java @@ -1,5 +1,6 @@ package leets.land.domain; +import leets.land.domain.guess.GuessNumber; import leets.land.domain.status.GuessStatus; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/leets/land/domain/GuessNumberTest.java b/src/test/java/leets/land/domain/GuessNumberTest.java index 7d10a42..bbf4a2e 100644 --- a/src/test/java/leets/land/domain/GuessNumberTest.java +++ b/src/test/java/leets/land/domain/GuessNumberTest.java @@ -1,5 +1,6 @@ package leets.land.domain; +import leets.land.domain.guess.GuessNumber; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/leets/land/domain/GuessRangeTest.java b/src/test/java/leets/land/domain/GuessRangeTest.java index 90914b3..e4febb5 100644 --- a/src/test/java/leets/land/domain/GuessRangeTest.java +++ b/src/test/java/leets/land/domain/GuessRangeTest.java @@ -1,5 +1,7 @@ package leets.land.domain; +import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessRange; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 65da7d3163aa99730e9ce16b8fbeba2d97ee5764 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 21:53:17 +0900 Subject: [PATCH 23/26] =?UTF-8?q?refactor(AlphabetGameMachine):=20?= =?UTF-8?q?=EC=98=81=EC=96=B4=20=EA=B2=8C=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/UpdownApplication.java | 5 ++- .../land/controller/AlphabetGameMachine.java | 41 +++++++++++++++++++ ...ameMachine.java => NumberGameMachine.java} | 2 +- .../java/leets/land/domain/AnswerNumber.java | 6 +-- .../leets/land/domain/status/Correct.java | 8 ++-- .../java/leets/land/domain/status/Down.java | 6 +-- .../leets/land/domain/status/GuessStatus.java | 6 +-- .../java/leets/land/domain/status/Status.java | 4 +- .../java/leets/land/domain/status/Up.java | 6 +-- .../domain/updowngame/AlphabetUpDownGame.java | 8 ++-- .../domain/updowngame/NumberUpDownGame.java | 7 ++-- .../land/domain/updowngame/UpDownGame.java | 4 +- src/main/java/leets/land/view/InputView.java | 11 +++++ 13 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 src/main/java/leets/land/controller/AlphabetGameMachine.java rename src/main/java/leets/land/controller/{GameMachine.java => NumberGameMachine.java} (97%) diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 849b3c1..1545dcf 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,11 +1,12 @@ package leets.land; -import leets.land.controller.GameMachine; +import leets.land.controller.AlphabetGameMachine; public class UpdownApplication { public static void main(String[] args) { - GameMachine gameMachine = new GameMachine(); +// GameMachine gameMachine = new GameMachine(); + AlphabetGameMachine gameMachine = new AlphabetGameMachine(); gameMachine.run(); } } diff --git a/src/main/java/leets/land/controller/AlphabetGameMachine.java b/src/main/java/leets/land/controller/AlphabetGameMachine.java new file mode 100644 index 0000000..2208454 --- /dev/null +++ b/src/main/java/leets/land/controller/AlphabetGameMachine.java @@ -0,0 +1,41 @@ +package leets.land.controller; + +import leets.land.domain.guess.GuessAlphabet; +import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; +import leets.land.domain.status.GuessStatus; +import leets.land.domain.updowngame.AlphabetUpDownGame; +import leets.land.domain.updowngame.UpDownGame; +import leets.land.view.InputView; +import leets.land.view.OutputView; + +public class AlphabetGameMachine { + + private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); + + public void run() { + UpDownGame upDownGame = new AlphabetUpDownGame(); + play(upDownGame); + } + + private void play(UpDownGame upDownGame) { + GuessValue guessValue = readGuessValueInRange(upDownGame.guessRange()); + GuessStatus guessStatus = upDownGame.play(guessValue); + outputView.printGuessStatus(guessStatus); + if (guessStatus.isContinue()) { + play(upDownGame); + } + } + + private GuessValue readGuessValueInRange(GuessRange guessRange) { + try { + int guessValue = inputView.readGuessAlphabetInRange(guessRange.min(), guessRange.max()); + guessRange.checkRange(guessValue); + return new GuessAlphabet(guessValue); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return readGuessValueInRange(guessRange); + } + } +} diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/NumberGameMachine.java similarity index 97% rename from src/main/java/leets/land/controller/GameMachine.java rename to src/main/java/leets/land/controller/NumberGameMachine.java index 4f67545..854d751 100644 --- a/src/main/java/leets/land/controller/GameMachine.java +++ b/src/main/java/leets/land/controller/NumberGameMachine.java @@ -8,7 +8,7 @@ import leets.land.view.InputView; import leets.land.view.OutputView; -public class GameMachine { +public class NumberGameMachine { private final InputView inputView = new InputView(); private final OutputView outputView = new OutputView(); diff --git a/src/main/java/leets/land/domain/AnswerNumber.java b/src/main/java/leets/land/domain/AnswerNumber.java index b171a14..6b03f65 100644 --- a/src/main/java/leets/land/domain/AnswerNumber.java +++ b/src/main/java/leets/land/domain/AnswerNumber.java @@ -1,6 +1,6 @@ package leets.land.domain; -import leets.land.domain.guess.GuessNumber; +import leets.land.domain.guess.GuessValue; import leets.land.domain.status.GuessStatus; public class AnswerNumber { @@ -11,8 +11,8 @@ public AnswerNumber(int value) { this.value = value; } - public GuessStatus compare(GuessNumber guessNumber) { - int compared = guessNumber.compare(value); + public GuessStatus compare(GuessValue guessValue) { + int compared = guessValue.compare(value); return GuessStatus.match(compared); } } diff --git a/src/main/java/leets/land/domain/status/Correct.java b/src/main/java/leets/land/domain/status/Correct.java index 33f8f16..e8016c4 100644 --- a/src/main/java/leets/land/domain/status/Correct.java +++ b/src/main/java/leets/land/domain/status/Correct.java @@ -1,14 +1,14 @@ package leets.land.domain.status; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; public class Correct implements Status { @Override - public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - GuessRange downMaxed = guessRange.downMax(guessNumber); - return downMaxed.upMin(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessValue guessValue) { + GuessRange downMaxed = guessRange.downMax(guessValue); + return downMaxed.upMin(guessValue); } @Override diff --git a/src/main/java/leets/land/domain/status/Down.java b/src/main/java/leets/land/domain/status/Down.java index 0ff51b0..d3ad397 100644 --- a/src/main/java/leets/land/domain/status/Down.java +++ b/src/main/java/leets/land/domain/status/Down.java @@ -1,13 +1,13 @@ package leets.land.domain.status; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; public class Down implements Status { @Override - public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - return guessRange.downMax(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessValue guessValue) { + return guessRange.downMax(guessValue); } @Override diff --git a/src/main/java/leets/land/domain/status/GuessStatus.java b/src/main/java/leets/land/domain/status/GuessStatus.java index 9875c0e..3073e6b 100644 --- a/src/main/java/leets/land/domain/status/GuessStatus.java +++ b/src/main/java/leets/land/domain/status/GuessStatus.java @@ -1,7 +1,7 @@ package leets.land.domain.status; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; import java.util.Arrays; @@ -24,8 +24,8 @@ public static GuessStatus match(int gap) { .orElseThrow(); } - public GuessRange narrowRange(GuessNumber guessNumber, GuessRange guessRange) { - return status.narrowRange(guessRange, guessNumber); + public GuessRange narrowRange(GuessValue guessValue, GuessRange guessRange) { + return status.narrowRange(guessRange, guessValue); } public boolean isContinue() { diff --git a/src/main/java/leets/land/domain/status/Status.java b/src/main/java/leets/land/domain/status/Status.java index 2db67ba..9a9002a 100644 --- a/src/main/java/leets/land/domain/status/Status.java +++ b/src/main/java/leets/land/domain/status/Status.java @@ -1,11 +1,11 @@ package leets.land.domain.status; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; public interface Status { - GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber); + GuessRange narrowRange(GuessRange guessRange, GuessValue guessValue); boolean isValid(int gap); diff --git a/src/main/java/leets/land/domain/status/Up.java b/src/main/java/leets/land/domain/status/Up.java index 26d76bb..38fbd88 100644 --- a/src/main/java/leets/land/domain/status/Up.java +++ b/src/main/java/leets/land/domain/status/Up.java @@ -1,13 +1,13 @@ package leets.land.domain.status; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; public class Up implements Status { @Override - public GuessRange narrowRange(GuessRange guessRange, GuessNumber guessNumber) { - return guessRange.upMin(guessNumber); + public GuessRange narrowRange(GuessRange guessRange, GuessValue guessValue) { + return guessRange.upMin(guessValue); } @Override diff --git a/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java b/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java index 17311e0..69a67b9 100644 --- a/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/AlphabetUpDownGame.java @@ -2,8 +2,8 @@ import leets.land.domain.AnswerNumber; import leets.land.domain.guess.GuessAlphabet; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; import leets.land.domain.status.GuessStatus; public class AlphabetUpDownGame implements UpDownGame { @@ -12,9 +12,9 @@ public class AlphabetUpDownGame implements UpDownGame { private GuessRange guessRange = new GuessRange(new GuessAlphabet('A'), new GuessAlphabet('z')); @Override - public GuessStatus play(GuessNumber guessNumber) { - GuessStatus guessStatus = answerNumber.compare(guessNumber); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); + public GuessStatus play(GuessValue guessValue) { + GuessStatus guessStatus = answerNumber.compare(guessValue); + guessRange = guessStatus.narrowRange(guessValue, guessRange); return guessStatus; } diff --git a/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java b/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java index 4ea34a9..fef4f20 100644 --- a/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/NumberUpDownGame.java @@ -3,6 +3,7 @@ import leets.land.domain.AnswerNumber; import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; import leets.land.domain.status.GuessStatus; public class NumberUpDownGame implements UpDownGame { @@ -11,9 +12,9 @@ public class NumberUpDownGame implements UpDownGame { private GuessRange guessRange = new GuessRange(new GuessNumber(1), new GuessNumber(100)); @Override - public GuessStatus play(GuessNumber guessNumber) { - GuessStatus guessStatus = answerNumber.compare(guessNumber); - guessRange = guessStatus.narrowRange(guessNumber, guessRange); + public GuessStatus play(GuessValue guessValue) { + GuessStatus guessStatus = answerNumber.compare(guessValue); + guessRange = guessStatus.narrowRange(guessValue, guessRange); return guessStatus; } diff --git a/src/main/java/leets/land/domain/updowngame/UpDownGame.java b/src/main/java/leets/land/domain/updowngame/UpDownGame.java index 92f8bb0..28b5412 100644 --- a/src/main/java/leets/land/domain/updowngame/UpDownGame.java +++ b/src/main/java/leets/land/domain/updowngame/UpDownGame.java @@ -1,12 +1,12 @@ package leets.land.domain.updowngame; -import leets.land.domain.guess.GuessNumber; import leets.land.domain.guess.GuessRange; +import leets.land.domain.guess.GuessValue; import leets.land.domain.status.GuessStatus; public interface UpDownGame { - GuessStatus play(GuessNumber guessNumber); + GuessStatus play(GuessValue guessValue); GuessRange guessRange(); } diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java index 07cc9d0..97df0f6 100644 --- a/src/main/java/leets/land/view/InputView.java +++ b/src/main/java/leets/land/view/InputView.java @@ -5,6 +5,7 @@ public class InputView { private static final String GUESS_NUMBER_FORMAT = "숫자를 입력해주세요(%d ~ %d) : "; + private static final String GUESS_ALPHABET_FORMAT = "영어를 입력해주세요(%c ~ %c) : "; private final Scanner scanner = new Scanner(System.in); @@ -17,4 +18,14 @@ public int readGuessNumberInRange(int start, int end) { return readGuessNumberInRange(start, end); } } + + public int readGuessAlphabetInRange(int start, int end) { + System.out.print(String.format(GUESS_ALPHABET_FORMAT, start, end)); + try { + return scanner.nextLine().charAt(0); + } catch (NumberFormatException e) { + System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); + return readGuessNumberInRange(start, end); + } + } } From 82eaf4531888bc497755ddc16c3ebb4a3bc031bb Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 22:13:15 +0900 Subject: [PATCH 24/26] =?UTF-8?q?feat(GameLoader):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EC=84=A0=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/UpdownApplication.java | 7 ++-- .../land/controller/AlphabetGameMachine.java | 3 +- .../leets/land/controller/GameLoader.java | 19 +++++++++++ .../leets/land/controller/GameMachine.java | 6 ++++ .../land/controller/NumberGameMachine.java | 3 +- .../java/leets/land/domain/GameVersion.java | 32 +++++++++++++++++++ src/main/java/leets/land/view/InputView.java | 22 ++++++++++--- 7 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 src/main/java/leets/land/controller/GameLoader.java create mode 100644 src/main/java/leets/land/controller/GameMachine.java create mode 100644 src/main/java/leets/land/domain/GameVersion.java diff --git a/src/main/java/leets/land/UpdownApplication.java b/src/main/java/leets/land/UpdownApplication.java index 1545dcf..4c512f8 100644 --- a/src/main/java/leets/land/UpdownApplication.java +++ b/src/main/java/leets/land/UpdownApplication.java @@ -1,12 +1,11 @@ package leets.land; -import leets.land.controller.AlphabetGameMachine; +import leets.land.controller.GameLoader; public class UpdownApplication { public static void main(String[] args) { -// GameMachine gameMachine = new GameMachine(); - AlphabetGameMachine gameMachine = new AlphabetGameMachine(); - gameMachine.run(); + GameLoader gameLoader = new GameLoader(); + gameLoader.load(); } } diff --git a/src/main/java/leets/land/controller/AlphabetGameMachine.java b/src/main/java/leets/land/controller/AlphabetGameMachine.java index 2208454..7463249 100644 --- a/src/main/java/leets/land/controller/AlphabetGameMachine.java +++ b/src/main/java/leets/land/controller/AlphabetGameMachine.java @@ -9,11 +9,12 @@ import leets.land.view.InputView; import leets.land.view.OutputView; -public class AlphabetGameMachine { +public class AlphabetGameMachine implements GameMachine { private final InputView inputView = new InputView(); private final OutputView outputView = new OutputView(); + @Override public void run() { UpDownGame upDownGame = new AlphabetUpDownGame(); play(upDownGame); diff --git a/src/main/java/leets/land/controller/GameLoader.java b/src/main/java/leets/land/controller/GameLoader.java new file mode 100644 index 0000000..ad6e9ef --- /dev/null +++ b/src/main/java/leets/land/controller/GameLoader.java @@ -0,0 +1,19 @@ +package leets.land.controller; + +import leets.land.domain.GameVersion; +import leets.land.view.InputView; + +public class GameLoader { + + private final InputView inputView = new InputView(); + + public void load() { + GameVersion gameVersion = readGameVersion(); + gameVersion.start(); + } + + private GameVersion readGameVersion() { + int gameVersion = inputView.readGameVersion(); + return GameVersion.match(gameVersion); + } +} diff --git a/src/main/java/leets/land/controller/GameMachine.java b/src/main/java/leets/land/controller/GameMachine.java new file mode 100644 index 0000000..0dce157 --- /dev/null +++ b/src/main/java/leets/land/controller/GameMachine.java @@ -0,0 +1,6 @@ +package leets.land.controller; + +public interface GameMachine { + + void run(); +} diff --git a/src/main/java/leets/land/controller/NumberGameMachine.java b/src/main/java/leets/land/controller/NumberGameMachine.java index 854d751..e5fa9c8 100644 --- a/src/main/java/leets/land/controller/NumberGameMachine.java +++ b/src/main/java/leets/land/controller/NumberGameMachine.java @@ -8,11 +8,12 @@ import leets.land.view.InputView; import leets.land.view.OutputView; -public class NumberGameMachine { +public class NumberGameMachine implements GameMachine { private final InputView inputView = new InputView(); private final OutputView outputView = new OutputView(); + @Override public void run() { UpDownGame upDownGame = new NumberUpDownGame(); play(upDownGame); diff --git a/src/main/java/leets/land/domain/GameVersion.java b/src/main/java/leets/land/domain/GameVersion.java new file mode 100644 index 0000000..ff40a62 --- /dev/null +++ b/src/main/java/leets/land/domain/GameVersion.java @@ -0,0 +1,32 @@ +package leets.land.domain; + +import leets.land.controller.AlphabetGameMachine; +import leets.land.controller.GameMachine; +import leets.land.controller.NumberGameMachine; + +import java.util.Arrays; + +public enum GameVersion { + + NUMBER(1, new NumberGameMachine()), + ALPHABET(2, new AlphabetGameMachine()); + + private final int version; + private final GameMachine gameMachine; + + GameVersion(int version, GameMachine gameMachine) { + this.version = version; + this.gameMachine = gameMachine; + } + + public static GameVersion match(int version) { + return Arrays.stream(values()) + .filter(gameVersion -> gameVersion.version == version) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 존재하지 않는 버전입니다.")); + } + + public void start() { + gameMachine.run(); + } +} diff --git a/src/main/java/leets/land/view/InputView.java b/src/main/java/leets/land/view/InputView.java index 97df0f6..7f1168d 100644 --- a/src/main/java/leets/land/view/InputView.java +++ b/src/main/java/leets/land/view/InputView.java @@ -1,11 +1,15 @@ package leets.land.view; import java.util.Scanner; +import java.util.regex.Pattern; public class InputView { + private static final String VERSION_FORMAT = "버전을 입력해주세요 (숫자 버전: 1, 영어 버전: 2) : "; private static final String GUESS_NUMBER_FORMAT = "숫자를 입력해주세요(%d ~ %d) : "; private static final String GUESS_ALPHABET_FORMAT = "영어를 입력해주세요(%c ~ %c) : "; + private static final Pattern ALPHABET_FORMAT = Pattern.compile("[A-Z|a-z]"); + private static final Pattern VERSION = Pattern.compile("[1|2]"); private final Scanner scanner = new Scanner(System.in); @@ -21,11 +25,19 @@ public int readGuessNumberInRange(int start, int end) { public int readGuessAlphabetInRange(int start, int end) { System.out.print(String.format(GUESS_ALPHABET_FORMAT, start, end)); - try { - return scanner.nextLine().charAt(0); - } catch (NumberFormatException e) { - System.out.println("[ERROR] 입력 문자의 타입이 맞지 않습니다."); - return readGuessNumberInRange(start, end); + String input = scanner.nextLine(); + if (!ALPHABET_FORMAT.matcher(input).matches()) { + throw new IllegalArgumentException("[ERROR] 범위 내의 알파벳을 입력하세요."); + } + return input.charAt(0); + } + + public int readGameVersion() { + System.out.print(VERSION_FORMAT); + String version = scanner.nextLine(); + if (!VERSION.matcher(version).matches()) { + throw new IllegalArgumentException("[ERROR] 존재하지 않는 버전입니다."); } + return Integer.parseInt(version); } } From 2799a408955ded5916f59f4ca5654bdf7fa202df Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 22:21:04 +0900 Subject: [PATCH 25/26] =?UTF-8?q?refactor(RandomAlphabetGenerator):=20?= =?UTF-8?q?=EC=86=8C=EB=AC=B8=EC=9E=90=20=EB=B3=80=ED=99=98=20api=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/land/domain/updowngame/RandomAlphabetGenerator.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java b/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java index 23916d4..a92d0c0 100644 --- a/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java +++ b/src/main/java/leets/land/domain/updowngame/RandomAlphabetGenerator.java @@ -8,7 +8,6 @@ public class RandomAlphabetGenerator { private static final int CAPITAL_ORIGIN_RANDOM = 'A'; private static final int CAPITAL_BOUND_RANDOM = 'Z'; - private static final int TO_SMALL = 'a' - 'A'; private final Random random = new Random(); @@ -16,7 +15,7 @@ public AnswerNumber generate() { int randomNumber = random.nextInt(CAPITAL_ORIGIN_RANDOM, CAPITAL_BOUND_RANDOM); boolean isSmall = random.nextBoolean(); if (isSmall) { - randomNumber += TO_SMALL; + randomNumber = Character.toLowerCase(randomNumber); } return new AnswerNumber(randomNumber); } From ffb1a7e33cca8cd186a4782de578d3c463862183 Mon Sep 17 00:00:00 2001 From: ay-eonii Date: Sun, 14 Apr 2024 22:25:57 +0900 Subject: [PATCH 26/26] =?UTF-8?q?refactor(AlphabetGameMachine):=20GuessVal?= =?UTF-8?q?ue=20=EB=8C=80=EC=8B=A0=20GuessAlphabet=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/land/controller/AlphabetGameMachine.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/leets/land/controller/AlphabetGameMachine.java b/src/main/java/leets/land/controller/AlphabetGameMachine.java index 7463249..b9188a8 100644 --- a/src/main/java/leets/land/controller/AlphabetGameMachine.java +++ b/src/main/java/leets/land/controller/AlphabetGameMachine.java @@ -2,7 +2,6 @@ import leets.land.domain.guess.GuessAlphabet; import leets.land.domain.guess.GuessRange; -import leets.land.domain.guess.GuessValue; import leets.land.domain.status.GuessStatus; import leets.land.domain.updowngame.AlphabetUpDownGame; import leets.land.domain.updowngame.UpDownGame; @@ -21,22 +20,22 @@ public void run() { } private void play(UpDownGame upDownGame) { - GuessValue guessValue = readGuessValueInRange(upDownGame.guessRange()); - GuessStatus guessStatus = upDownGame.play(guessValue); + GuessAlphabet guessAlphabet = readGuessAlphabetInRange(upDownGame.guessRange()); + GuessStatus guessStatus = upDownGame.play(guessAlphabet); outputView.printGuessStatus(guessStatus); if (guessStatus.isContinue()) { play(upDownGame); } } - private GuessValue readGuessValueInRange(GuessRange guessRange) { + private GuessAlphabet readGuessAlphabetInRange(GuessRange guessRange) { try { int guessValue = inputView.readGuessAlphabetInRange(guessRange.min(), guessRange.max()); guessRange.checkRange(guessValue); return new GuessAlphabet(guessValue); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); - return readGuessValueInRange(guessRange); + return readGuessAlphabetInRange(guessRange); } } }