From 1c14844563aded70fbf86f08fff27233906a3d80 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 13:23:04 +0900 Subject: [PATCH 01/17] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index fcf3f057..7b6bd37f 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,13 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 목록 +- 1 ~ 9사이의 임의의 수 생성 기능 +- 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 +- 사용자의 수를 입력 받는 기능 +- 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 +- 수가 같은지, 다른지 판별하는 기능 +- 수가 같은 자리에 있는지, 포함하고 있는지 판별하는 기능 +- 상대방의 수와 사용자의 수를 비교하는 기능 +- 게임 재시작/종료 기능 From dca79789cbc780d73d3cac2163e6d3afd0d1a1c1 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 13:26:08 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=201=20~=209=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=9D=98=20=EC=9E=84=EC=9D=98=EC=9D=98=20=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20?= =?UTF-8?q?=EC=BB=B4=ED=93=A8=ED=84=B0=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Computer.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/domain/Computer.java diff --git a/src/main/java/domain/Computer.java b/src/main/java/domain/Computer.java new file mode 100644 index 00000000..a9184189 --- /dev/null +++ b/src/main/java/domain/Computer.java @@ -0,0 +1,20 @@ +package domain; + +import java.util.Random; + +public class Computer { + + private final int MIN = 1; + private final int MAX = 9; + + private final Random random; + + public Computer() { + random = new Random(); + } + + public int generateRandomNumber() { + return random.nextInt(MAX) + MIN; + } + +} From 6a2f8ab49a2a452de93323d000ff2064adf698d6 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 14:13:26 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20=EC=83=81=EB=8C=80=EB=B0=A9=20?= =?UTF-8?q?=EC=88=98(=EC=84=9C=EB=A1=9C=20=EB=8B=A4=EB=A5=B8=20=EC=9E=84?= =?UTF-8?q?=EC=9D=98=EC=9D=98=20=EC=88=98=203=EA=B0=9C)=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20Set?= =?UTF-8?q?=EC=9D=84=20=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Computer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Computer.java b/src/main/java/domain/Computer.java index a9184189..4a39d140 100644 --- a/src/main/java/domain/Computer.java +++ b/src/main/java/domain/Computer.java @@ -1,6 +1,6 @@ package domain; -import java.util.Random; +import java.util.*; public class Computer { @@ -13,6 +13,17 @@ public Computer() { random = new Random(); } + public String generateThreeDifferentNumber() { + Set set = new HashSet<>(); + + while (set.size() < 3) { + set.add(generateRandomNumber()); + } + + return set.toString() + .replaceAll("[^0-9]", ""); + } + public int generateRandomNumber() { return random.nextInt(MAX) + MIN; } From 42126789fa072cd4b9290c006114dae56e608af8 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 14:21:25 +0900 Subject: [PATCH 04/17] =?UTF-8?q?test:=201=20~=209=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=9D=98=20=EC=9E=84=EC=9D=98=EC=9D=98=20=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=84=9C=EB=A1=9C=20=EB=8B=A4=EB=A5=B8?= =?UTF-8?q?=20=EC=88=98=203=EA=B0=9C=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/ComputerTest.java | 34 ++++++++++++++++++++++++++ src/test/java/study/StringTest.java | 13 ---------- 2 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 src/test/java/domain/ComputerTest.java delete mode 100644 src/test/java/study/StringTest.java diff --git a/src/test/java/domain/ComputerTest.java b/src/test/java/domain/ComputerTest.java new file mode 100644 index 00000000..7422febe --- /dev/null +++ b/src/test/java/domain/ComputerTest.java @@ -0,0 +1,34 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ComputerTest { + + @DisplayName("1 ~ 9 사이의 임의의 수 생성 테스트") + @Test + void generateRandomNumberTest() { + Computer computer = new Computer(); + int min = 1, max = 9; + + for (int i = 0; i < 100; i++) { + int randomNumber = computer.generateRandomNumber(); + assertThat(randomNumber).isGreaterThanOrEqualTo(min).isLessThanOrEqualTo(max); + } + } + + @DisplayName("서로 다른 임의의 수 3개 생성 테스트") + @Test + void generateThreeDifferentNumberTest() { + Computer computer = new Computer(); + char[] nums = computer.generateThreeDifferentNumber() + .toCharArray(); + + assertThat(nums[0]).isNotEqualTo(nums[1]); + assertThat(nums[0]).isNotEqualTo(nums[2]); + assertThat(nums[1]).isNotEqualTo(nums[2]); + } + +} \ No newline at end of file diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -} From 92780626db74bf7fdf78ddbf83f3690ffda95050 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 14:24:50 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EC=88=98=20=EB=B9=84=EA=B5=90=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20view?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/.gitkeep | 0 src/main/java/view/Console.java | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) delete mode 100644 src/main/java/.gitkeep create mode 100644 src/main/java/view/Console.java diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java new file mode 100644 index 00000000..a6dd7dd0 --- /dev/null +++ b/src/main/java/view/Console.java @@ -0,0 +1,35 @@ +package view; + +import java.util.Scanner; + +public class Console { + + private static final String INPUT_MESSAGE = "숫자를 입력해주세요 : "; + private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private static final String RESTART_OR_EXIT_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + + private Scanner scanner; + + public Console() { + scanner = new Scanner(System.in); + } + + public String getUserInputNumber() { + System.out.print(INPUT_MESSAGE); + return scanner.nextLine(); + } + + public String getUserInput() { + return scanner.nextLine(); + } + + public void printEndMessage() { + printMessage(END_MESSAGE); + printMessage(RESTART_OR_EXIT_MESSAGE); + } + + public void printMessage(String str) { + System.out.println(str); + } + +} From e7dd039ee9fb5420ff81b9c22eca114a22f2ae7b Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 16:53:42 +0900 Subject: [PATCH 06/17] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?-=20=EB=B9=84=EA=B5=90=20=EA=B2=B0=EA=B3=BC=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=EB=82=AB=EC=8B=B1,=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=81=AC,=20=EB=B3=BC=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7b6bd37f..107080c3 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,12 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 구현할 기능 목록 -- 1 ~ 9사이의 임의의 수 생성 기능 -- 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 -- 사용자의 수를 입력 받는 기능 -- 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 -- 수가 같은지, 다른지 판별하는 기능 +- 1 ~ 9사이의 임의의 수 생성 기능 [x] +- 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 [x] +- 사용자의 수를 입력 받는 기능 [x] +- 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 [x] +- 비교 결과에 따라 낫싱, 스트라이크, 볼 정보를 생성하는 기능 +- 수가 같은지, 다른지 판별하는 기능 - 수가 같은 자리에 있는지, 포함하고 있는지 판별하는 기능 - 상대방의 수와 사용자의 수를 비교하는 기능 - 게임 재시작/종료 기능 From e01b0f50bcbccd6da5a27f705baf6e89496d8975 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 16:55:39 +0900 Subject: [PATCH 07/17] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=A0=20GameResult?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B0=9D=EC=B2=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC?= =?UTF-8?q?=EC=99=80=20=EB=B3=BC=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=95=8C=EA=B3=A0=EC=9E=88=EC=96=B4=EC=95=BC=20=ED=95=A0=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EC=A1=B4=EC=9E=AC=20-=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EA=B2=B0=EA=B3=BC=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC/=EB=B3=BC=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EC=A6=9D=EA=B0=80=20-=20?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC=EC=99=80=20?= =?UTF-8?q?=EB=B3=BC=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EA=B2=B0=EA=B3=BC=20description=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++--- src/main/java/domain/GameResult.java | 52 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 src/main/java/domain/GameResult.java diff --git a/README.md b/README.md index 107080c3..cfc5b9de 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,11 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 구현할 기능 목록 -- 1 ~ 9사이의 임의의 수 생성 기능 [x] -- 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 [x] -- 사용자의 수를 입력 받는 기능 [x] -- 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 [x] -- 비교 결과에 따라 낫싱, 스트라이크, 볼 정보를 생성하는 기능 +- 1 ~ 9사이의 임의의 수 생성 기능 +- 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 +- 사용자의 수를 입력 받는 기능 +- 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 +- 비교 결과에 따라 낫싱, 스트라이크, 볼 정보를 생성하는 기능 [x] - 수가 같은지, 다른지 판별하는 기능 - 수가 같은 자리에 있는지, 포함하고 있는지 판별하는 기능 - 상대방의 수와 사용자의 수를 비교하는 기능 diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/GameResult.java new file mode 100644 index 00000000..e26697ed --- /dev/null +++ b/src/main/java/domain/GameResult.java @@ -0,0 +1,52 @@ +package domain; + +public class GameResult { + + private int strikeCount; + private int ballCount; + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + public String getDescription() { + StringBuilder sb = new StringBuilder(); + + checkIsNothing(sb); + checkStrikeCount(sb); + checkBallCount(sb); + + return sb.toString(); + } + + public void increaseStrikeCount() { + strikeCount += 1; + } + + public void increaseBallCount() { + ballCount += 1; + } + + public void checkIsNothing(StringBuilder sb) { + if (strikeCount + ballCount == 0) { + sb.append("낫싱"); + } + } + + public void checkStrikeCount(StringBuilder sb) { + if (strikeCount > 0) { + sb.append(strikeCount + "스트라이크 "); + } + } + + public void checkBallCount(StringBuilder sb) { + if (ballCount > 0) { + sb.append(ballCount + "볼"); + } + } + +} From 86619ae9afc556fa45d5d7653c36c62a690339e2 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 17:23:14 +0900 Subject: [PATCH 08/17] =?UTF-8?q?test:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20-=20?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC/=EB=B3=BC=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=20=ED=8C=90=EB=B3=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/GameResultTest.java | 65 ++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/test/java/domain/GameResultTest.java diff --git a/src/test/java/domain/GameResultTest.java b/src/test/java/domain/GameResultTest.java new file mode 100644 index 00000000..4fe10be3 --- /dev/null +++ b/src/test/java/domain/GameResultTest.java @@ -0,0 +1,65 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class GameResultTest { + + @DisplayName("스트라이크/볼 증가 테스트") + @ParameterizedTest + @MethodSource("provideIncreaseCount") + void increaseStrikeAndBallCountTest(int strikeCount, int ballCount) { + GameResult gameResult = new GameResult(); + + for (int i = 0; i < strikeCount; i++) { + gameResult.increaseStrikeCount(); + } + + for (int i = 0; i < ballCount; i++) { + gameResult.increaseBallCount(); + } + + assertThat(gameResult.getStrikeCount()).isEqualTo(strikeCount); + assertThat(gameResult.getBallCount()).isEqualTo(ballCount); + } + + @DisplayName("게임 결과 판별 테스트") + @ParameterizedTest + @MethodSource("provideCountAndDescription") + void gameResultDescriptionTest(int strikeCount, int ballCount, String description) { + GameResult gameResult = new GameResult(); + + for (int i = 0; i < strikeCount; i++) { + gameResult.increaseStrikeCount(); + } + + for (int i = 0; i < ballCount; i++) { + gameResult.increaseBallCount(); + } + + assertThat(gameResult.getDescription()).isEqualTo(description); + } + + private static Stream provideIncreaseCount() { + return Stream.of( + Arguments.of(3, 0), + Arguments.of(1, 2), + Arguments.of(0, 0) + ); + } + + private static Stream provideCountAndDescription() { + return Stream.of( + Arguments.of(0, 0, "낫싱"), + Arguments.of(2, 1, "2스트라이크 1볼"), + Arguments.of(0, 3, "3볼") + ); + } + +} \ No newline at end of file From 7e2c9700ff7169b78c3272040629150d5a9bf46e Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 17:28:16 +0900 Subject: [PATCH 09/17] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EC=99=80=20=EC=BB=B4=ED=93=A8=ED=84=B0?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20BaseballGame=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20=EC=88=98=EA=B0=80=20=EA=B0=99?= =?UTF-8?q?=EC=9D=80=EC=A7=80=20=EB=8B=A4=EB=A5=B8=EC=A7=80=20=ED=8C=90?= =?UTF-8?q?=EB=B3=84=20-=20=EC=88=98=EA=B0=80=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=EC=9E=90=EB=A6=AC=EC=97=90=20=EC=9E=88=EB=8A=94=EC=A7=80,=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=ED=8C=90=EB=B3=84=20-=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C(3=20strike)=20=EC=95=BC=EB=B6=80=20=ED=8C=90?= =?UTF-8?q?=EB=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BaseballGame.java | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/domain/BaseballGame.java diff --git a/src/main/java/domain/BaseballGame.java b/src/main/java/domain/BaseballGame.java new file mode 100644 index 00000000..6cb8d4c8 --- /dev/null +++ b/src/main/java/domain/BaseballGame.java @@ -0,0 +1,39 @@ +package domain; + +public class BaseballGame { + + private final String computerNumbers; + + private GameResult currentGameResult; + + public BaseballGame(String computerNumbers) { + this.computerNumbers = computerNumbers; + } + + public GameResult compareNumbers(String userNumbers) { + currentGameResult = new GameResult(); + + for (int i = 0; i < userNumbers.length(); i++) { + compareNumber(userNumbers.charAt(i), computerNumbers.charAt(i)); + } + + return currentGameResult; + } + + public void compareNumber(char userNum, char computerNum) { + if (!computerNumbers.contains(String.valueOf(userNum))) { + return; + } + + if (userNum == computerNum) { + currentGameResult.increaseStrikeCount(); + return; + } + currentGameResult.increaseBallCount(); + } + + public boolean isEnd() { + return currentGameResult.getStrikeCount() == 3; + } + +} From 87132c8d65964db9a8a03c70c24dcb54dcce020c Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 17:52:38 +0900 Subject: [PATCH 10/17] =?UTF-8?q?test:=20BaseballGame=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20-=20=EC=82=AC=EC=9A=A9=EC=9E=90=EC=9D=98?= =?UTF-8?q?=20=EC=88=98=EC=99=80=20=EC=BB=B4=ED=93=A8=ED=84=B0=EC=9D=98=20?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BaseballGameTest.java | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/domain/BaseballGameTest.java diff --git a/src/test/java/domain/BaseballGameTest.java b/src/test/java/domain/BaseballGameTest.java new file mode 100644 index 00000000..03d58111 --- /dev/null +++ b/src/test/java/domain/BaseballGameTest.java @@ -0,0 +1,36 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class BaseballGameTest { + + @DisplayName("사용자의 수와 컴퓨터의 수 비교 테스트") + @ParameterizedTest + @MethodSource("provideComputerNumbersAndUserNumbers") + void compareNumbersTest(String computerNumbers, String userNumbers, String description, int strikeCount, int ballCount) { + BaseballGame baseballGame = new BaseballGame(computerNumbers); + GameResult gameResult = baseballGame.compareNumbers(userNumbers); + + assertThat(gameResult.getDescription()).isEqualTo(description); + assertThat(gameResult.getStrikeCount()).isEqualTo(strikeCount); + assertThat(gameResult.getBallCount()).isEqualTo(ballCount); + } + + private static Stream provideComputerNumbersAndUserNumbers() { + return Stream.of( + Arguments.of("713", "123", "1스트라이크 1볼", 1, 1), + Arguments.of("713", "145", "1볼", 0, 1), + Arguments.of("713", "256", "낫싱", 0, 0), + Arguments.of("713", "671", "2볼", 0, 2), + Arguments.of("713", "713", "3스트라이크 ", 3, 0) + ); + } + +} \ No newline at end of file From 85f2f7ef16ad97418dba48218696c3df99cb827a Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 17:54:18 +0900 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20BaseballGame=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=20=EC=88=AB=EC=9E=90=20=EB=B9=84=EA=B5=90=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=91=EA=B7=BC=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20=EB=82=B4=EB=B6=80=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=EB=A7=8C=20=EC=82=AC=EC=9A=A9=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EC=9D=B8=20=EB=A7=8C=ED=81=BC=20pri?= =?UTF-8?q?vate=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BaseballGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/BaseballGame.java b/src/main/java/domain/BaseballGame.java index 6cb8d4c8..94bd61df 100644 --- a/src/main/java/domain/BaseballGame.java +++ b/src/main/java/domain/BaseballGame.java @@ -20,7 +20,7 @@ public GameResult compareNumbers(String userNumbers) { return currentGameResult; } - public void compareNumber(char userNum, char computerNum) { + private void compareNumber(char userNum, char computerNum) { if (!computerNumbers.contains(String.valueOf(userNum))) { return; } From a51772cf7eab6c28d916a5f667346a612903c013 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 17:58:46 +0900 Subject: [PATCH 12/17] =?UTF-8?q?feat:=20view=EC=99=80=20domain=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=9D=98=20controller=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20-=20view=EB=A1=9C=20=EB=B6=80=ED=84=B0=20=EB=B0=9B=EC=9D=80?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20domain=EC=97=90=20=EC=9E=91=EC=97=85?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=EC=9E=84=ED=95=98=EB=8A=94=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A1=9C=20=EA=B5=AC=ED=98=84=ED=95=98=EA=B3=A0?= =?UTF-8?q?=EC=9E=90=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 9 ++++ .../controller/BaseballGameController.java | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/controller/BaseballGameController.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..bbef3106 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,9 @@ +import controller.BaseballGameController; + +public class Main { + + public static void main(String[] args) { + new BaseballGameController().execute(); + } + +} diff --git a/src/main/java/controller/BaseballGameController.java b/src/main/java/controller/BaseballGameController.java new file mode 100644 index 00000000..7350c7a2 --- /dev/null +++ b/src/main/java/controller/BaseballGameController.java @@ -0,0 +1,44 @@ +package controller; + +import domain.BaseballGame; +import domain.Computer; +import domain.GameResult; +import view.Console; + +public class BaseballGameController { + + private static final String RESTART_FLAG = "1"; + private static final String EXIT_FLAG = "2"; + + private final Computer computer; + private final Console console; + + public BaseballGameController() { + computer = new Computer(); + console = new Console(); + } + + public void execute() { + BaseballGame baseballGame = new BaseballGame(computer.generateThreeDifferentNumber()); + + do { + String userNumbers = console.getUserInputNumber(); + GameResult gameResult = baseballGame.compareNumbers(userNumbers); + console.printMessage(gameResult.getDescription()); + } while (!baseballGame.isEnd()); + + restartOrExit(); + } + + public void restartOrExit() { + console.printEndMessage(); + String userInput = console.getUserInput(); + + if (userInput.equals(EXIT_FLAG)) { + return; + } + + execute(); + } + +} From f2029d4da977ba6a8a32d73f8b20bdf336119eee Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 18:30:59 +0900 Subject: [PATCH 13/17] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20description=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20-=20=EB=82=AB?= =?UTF-8?q?=EC=8B=B1,=20=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98,=20=EB=B3=BC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20-=20=EA=B0=9C?= =?UTF-8?q?=EB=B3=84=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=8B=A8=EC=9C=84?= =?UTF-8?q?=EC=9D=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=8F=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/GameResult.java | 24 +++++++------------ src/test/java/domain/GameResultTest.java | 30 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/GameResult.java index e26697ed..e4983f88 100644 --- a/src/main/java/domain/GameResult.java +++ b/src/main/java/domain/GameResult.java @@ -16,9 +16,9 @@ public int getBallCount() { public String getDescription() { StringBuilder sb = new StringBuilder(); - checkIsNothing(sb); - checkStrikeCount(sb); - checkBallCount(sb); + sb.append(checkIsNothing()); + sb.append(checkStrikeCount()); + sb.append(checkBallCount()); return sb.toString(); } @@ -31,22 +31,16 @@ public void increaseBallCount() { ballCount += 1; } - public void checkIsNothing(StringBuilder sb) { - if (strikeCount + ballCount == 0) { - sb.append("낫싱"); - } + public String checkIsNothing() { + return strikeCount + ballCount == 0 ? "낫싱" : ""; } - public void checkStrikeCount(StringBuilder sb) { - if (strikeCount > 0) { - sb.append(strikeCount + "스트라이크 "); - } + public String checkStrikeCount() { + return strikeCount > 0 ? strikeCount + "스트라이크 " : ""; } - public void checkBallCount(StringBuilder sb) { - if (ballCount > 0) { - sb.append(ballCount + "볼"); - } + public String checkBallCount() { + return ballCount > 0 ? ballCount + "볼" : ""; } } diff --git a/src/test/java/domain/GameResultTest.java b/src/test/java/domain/GameResultTest.java index 4fe10be3..c29b0815 100644 --- a/src/test/java/domain/GameResultTest.java +++ b/src/test/java/domain/GameResultTest.java @@ -1,6 +1,7 @@ package domain; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -29,6 +30,35 @@ void increaseStrikeAndBallCountTest(int strikeCount, int ballCount) { assertThat(gameResult.getBallCount()).isEqualTo(ballCount); } + @DisplayName("스트라이크와 볼 카운트가 없는 케이스 테스트") + @Test + void checkIsNothingTest() { + GameResult gameResult = new GameResult(); + + assertThat(gameResult.checkIsNothing()).isEqualTo("낫싱"); + assertThat(gameResult.checkStrikeCount()).isEmpty(); + assertThat(gameResult.checkBallCount()).isEmpty(); + } + + @DisplayName("스트라이크와 볼이 있는 케이스 테스트") + @Test + void checkStringAndBallCount() { + GameResult gameResult = new GameResult(); + int strikeCount = 1, ballCount = 1; + + for (int i = 0; i < strikeCount; i++) { + gameResult.increaseStrikeCount(); + } + + for (int i = 0; i < ballCount; i++) { + gameResult.increaseBallCount(); + } + + assertThat(gameResult.checkStrikeCount()).isEqualTo(strikeCount + "스트라이크 "); + assertThat(gameResult.checkBallCount()).isEqualTo(ballCount + "볼"); + } + + @DisplayName("게임 결과 판별 테스트") @ParameterizedTest @MethodSource("provideCountAndDescription") From 4ad43521169f34692935bcc0b49b0deedd71797f Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Tue, 20 Dec 2022 18:51:59 +0900 Subject: [PATCH 14/17] =?UTF-8?q?refactor:=20=EB=88=84=EB=9D=BD=EB=90=9C?= =?UTF-8?q?=20=EC=83=81=EC=88=98=20=EC=B2=98=EB=A6=AC=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Computer.java | 4 ++-- src/main/java/view/Console.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/Computer.java b/src/main/java/domain/Computer.java index 4a39d140..8ea9b9f1 100644 --- a/src/main/java/domain/Computer.java +++ b/src/main/java/domain/Computer.java @@ -4,8 +4,8 @@ public class Computer { - private final int MIN = 1; - private final int MAX = 9; + private static final int MIN = 1; + private static final int MAX = 9; private final Random random; diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java index a6dd7dd0..234bb745 100644 --- a/src/main/java/view/Console.java +++ b/src/main/java/view/Console.java @@ -8,7 +8,7 @@ public class Console { private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; private static final String RESTART_OR_EXIT_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; - private Scanner scanner; + private final Scanner scanner; public Console() { scanner = new Scanner(System.in); From 0b96a87d5a6c45cdc2c97f1d9b30675480dd5be0 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Wed, 21 Dec 2022 10:36:29 +0900 Subject: [PATCH 15/17] =?UTF-8?q?docs:=20=EA=B2=8C=EC=9E=84=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91/=EC=A2=85=EB=A3=8C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20-=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=EC=9D=80=20=ED=98=84=20=EB=A1=9C=EC=A7=81=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EA=B0=92=EC=9D=B4=20=EB=93=A4=EC=96=B4=EC=98=A4?= =?UTF-8?q?=EB=8D=94=EB=9D=BC=EB=8F=84=20=EB=AA=A8=EB=91=90=20=EB=82=AB?= =?UTF-8?q?=EC=8B=B1=EC=9C=BC=EB=A1=9C=20=ED=8C=90=EB=B3=84=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=90=98=EC=96=B4=EC=9E=88=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cfc5b9de..8e83df67 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,9 @@ - 상대방 수(서로 다른 임의의 수 3개)를 생성하는 기능 - 사용자의 수를 입력 받는 기능 - 상대방의 수와 사용자의 수 비교 결과를 출력하는 기능 -- 비교 결과에 따라 낫싱, 스트라이크, 볼 정보를 생성하는 기능 [x] +- 비교 결과에 따라 낫싱, 스트라이크, 볼 정보를 생성하는 기능 - 수가 같은지, 다른지 판별하는 기능 - 수가 같은 자리에 있는지, 포함하고 있는지 판별하는 기능 - 상대방의 수와 사용자의 수를 비교하는 기능 - 게임 재시작/종료 기능 +- 게임 재시작/종료 입력값 유효성 검증 기능 From 069fd71bfd06be506a7df6e7fd5e075bdfbcaa43 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Wed, 21 Dec 2022 10:38:19 +0900 Subject: [PATCH 16/17] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91/=EC=A2=85=EB=A3=8C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20Runnable=EC=9D=84?= =?UTF-8?q?=20=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=EB=A5=BC=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballGameController.java | 19 ++++++++++++++++--- src/main/java/view/Console.java | 5 +++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/BaseballGameController.java b/src/main/java/controller/BaseballGameController.java index 7350c7a2..26cf6b42 100644 --- a/src/main/java/controller/BaseballGameController.java +++ b/src/main/java/controller/BaseballGameController.java @@ -27,13 +27,22 @@ public void execute() { console.printMessage(gameResult.getDescription()); } while (!baseballGame.isEnd()); - restartOrExit(); + handleEndOfGame(console::printEndMessage); } - public void restartOrExit() { - console.printEndMessage(); + public void handleEndOfGame(Runnable runnable) { + runnable.run(); String userInput = console.getUserInput(); + if (!validateRestartOrExitInput(userInput)) { + handleEndOfGame(console::printErrorMessage); + return; + } + + restartOrExit(userInput); + } + + public void restartOrExit(String userInput) { if (userInput.equals(EXIT_FLAG)) { return; } @@ -41,4 +50,8 @@ public void restartOrExit() { execute(); } + public boolean validateRestartOrExitInput(String userInput) { + return userInput.equals(RESTART_FLAG) || userInput.equals(EXIT_FLAG); + } + } diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java index 234bb745..c4b09292 100644 --- a/src/main/java/view/Console.java +++ b/src/main/java/view/Console.java @@ -7,6 +7,7 @@ public class Console { private static final String INPUT_MESSAGE = "숫자를 입력해주세요 : "; private static final String END_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; private static final String RESTART_OR_EXIT_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + private static final String ERROR_MESSAGE = "올바른 숫자를 입력해주세요."; private final Scanner scanner; @@ -28,6 +29,10 @@ public void printEndMessage() { printMessage(RESTART_OR_EXIT_MESSAGE); } + public void printErrorMessage() { + printMessage(ERROR_MESSAGE); + } + public void printMessage(String str) { System.out.println(str); } From 7878dadb8d87cacc90d948246a27641b3d167f84 Mon Sep 17 00:00:00 2001 From: "eddie.kk" Date: Wed, 21 Dec 2022 10:41:22 +0900 Subject: [PATCH 17/17] =?UTF-8?q?refactor:=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BaseballGame.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/BaseballGame.java b/src/main/java/domain/BaseballGame.java index 94bd61df..963a4652 100644 --- a/src/main/java/domain/BaseballGame.java +++ b/src/main/java/domain/BaseballGame.java @@ -2,8 +2,9 @@ public class BaseballGame { - private final String computerNumbers; + private static final int NUMBER_LENGTH = 3; + private final String computerNumbers; private GameResult currentGameResult; public BaseballGame(String computerNumbers) { @@ -13,7 +14,7 @@ public BaseballGame(String computerNumbers) { public GameResult compareNumbers(String userNumbers) { currentGameResult = new GameResult(); - for (int i = 0; i < userNumbers.length(); i++) { + for (int i = 0; i < NUMBER_LENGTH; i++) { compareNumber(userNumbers.charAt(i), computerNumbers.charAt(i)); } @@ -33,7 +34,7 @@ private void compareNumber(char userNum, char computerNum) { } public boolean isEnd() { - return currentGameResult.getStrikeCount() == 3; + return currentGameResult.getStrikeCount() == NUMBER_LENGTH; } }