From 54d8c13117f59adaa256d7f2e9ae37a3e68c5002 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 15:45:21 +0900 Subject: [PATCH 01/12] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=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 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2..eb72e54b4e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,9 @@ +# 기능 목록 + +- [ ] 게임 관리 + - [ ] 게임 시작 + - [ ] 게임 종료시 재시작 기능 +- [ ] 숫자 야구 구현 + - [ ] 세 자리수 랜덤 숫자 생성 + - [ ] 사용자 숫자 입력 + - [ ] 사용자 숫자를 받아 채점 \ No newline at end of file From 8d3191c6c4fd833a85e05d0026a4ccf850cc113b Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 16:21:50 +0900 Subject: [PATCH 02/12] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index eb72e54b4e..27aa8b0645 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,9 +1,10 @@ # 기능 목록 -- [ ] 게임 관리 - - [ ] 게임 시작 - - [ ] 게임 종료시 재시작 기능 -- [ ] 숫자 야구 구현 - - [ ] 세 자리수 랜덤 숫자 생성 - - [ ] 사용자 숫자 입력 - - [ ] 사용자 숫자를 받아 채점 \ No newline at end of file +- [ ] 게임 관리 - GameManager class + - [ ] 게임 시작 - start() + - [ ] 게임 종료시 재시작 기능 - restart() +- [ ] 숫자 야구 구현 - BaseballGame class + - [ ] 세 자리수 랜덤 숫자 생성 - generateThreeDigitsRandomNumber() + - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() +- [ ] 입력 + - [ ] 사용자 입력 - receiveInput() \ No newline at end of file From 7500af5ae187061515855147e69053b5fc70ea8f Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 16:44:34 +0900 Subject: [PATCH 03/12] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 27aa8b0645..752d1c8870 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,6 @@ - [ ] 게임 시작 - start() - [ ] 게임 종료시 재시작 기능 - restart() - [ ] 숫자 야구 구현 - BaseballGame class - - [ ] 세 자리수 랜덤 숫자 생성 - generateThreeDigitsRandomNumber() - - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() -- [ ] 입력 - - [ ] 사용자 입력 - receiveInput() \ No newline at end of file + - [ ] 세 자리수 랜덤 숫자 생성 - generateAnswer() + - [ ] 사용자 입력 받기 - receiveUserInput() + - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() \ No newline at end of file From 3f5095d81f1150382e8d59df9b23b1f7c6499cbb Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 17:25:27 +0900 Subject: [PATCH 04/12] =?UTF-8?q?test:=20BaseballGame=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseballGame.java | 26 ++++++ src/test/java/baseball/BaseballGameTest.java | 95 ++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/main/java/baseball/BaseballGame.java create mode 100644 src/test/java/baseball/BaseballGameTest.java diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java new file mode 100644 index 0000000000..c2dc26ebbb --- /dev/null +++ b/src/main/java/baseball/BaseballGame.java @@ -0,0 +1,26 @@ +package baseball; + +public class BaseballGame { + + private Integer answer; + + public BaseballGame() { + this.answer = 0; + } + + public Integer getAnswer() { + return answer; + } + + public int generateAnswer() { + return 0; + } + + public String receiveUserInput() { + return null; + } + + public boolean score(int answer, int userAnswer) { + return false; + } +} diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java new file mode 100644 index 0000000000..a654b39f38 --- /dev/null +++ b/src/test/java/baseball/BaseballGameTest.java @@ -0,0 +1,95 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +class BaseballGameTest { + + private BaseballGame baseballGame; + + private final InputStream originalIn = System.in; + private final PrintStream originalOut = System.out; + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + + @BeforeEach + void setUp() { + baseballGame = new BaseballGame(); + System.setOut(new PrintStream(outputStream)); + } + + @AfterEach + void tearDown() { + System.setOut(originalOut); + System.setIn(originalIn); + } + + @Test + void generateAnswer_정답을_answer에_채워넣는다() { + baseballGame.generateAnswer(); + + assertThat(baseballGame.getAnswer()).isNotEqualTo(0); + } + + @Test + void generateAnswer_정답은_세자리수_이다() { + baseballGame.generateAnswer(); + + int length = baseballGame.getAnswer().toString().length(); + assertThat(length).isEqualTo(3); + } + + @Test + void receiveUserInput_유저의_입력을_반환한다() { + String input = "Hello, System.in!"; + ByteArrayInputStream inputStream = new ByteArrayInputStream(input.getBytes()); + System.setIn(inputStream); + + String result = baseballGame.receiveUserInput(); + + assertThat(result).isEqualTo(input); + } + + @Test + void score_한개만_맞으면_1스트라이크를_출력한다() { + boolean result = baseballGame.score(123, 145); + + String output = outputStream.toString().trim(); + + assertThat(result).isFalse(); + assertThat(output).isEqualTo("1스트라이크"); + } + + @Test + void score_다른_자리에_같은_숫자가_있으면_1볼을_출력한다() { + boolean result = baseballGame.score(123, 245); + + String output = outputStream.toString().trim(); + + assertThat(result).isFalse(); + assertThat(output).isEqualTo("1볼"); + } + + @Test + void score_3숫자_모두_맞추면_정답메세지를_출력하고_true를_반환한다() { + boolean result = baseballGame.score(123, 123); + + String output = outputStream.toString().trim(); + + assertThat(result).isTrue(); + assertThat(output).isEqualTo("3스트라이크\n" + + "3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } +} \ No newline at end of file From f762c222614507fa8af1f4dda5fb194bb847e2ba Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 19:53:52 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=EC=84=B8=20=EC=9E=90=EB=A6=AC?= =?UTF-8?q?=EC=88=98=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20-=20generateAnswer()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/baseball/BaseballGame.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 752d1c8870..6403f2fcb1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,6 @@ - [ ] 게임 시작 - start() - [ ] 게임 종료시 재시작 기능 - restart() - [ ] 숫자 야구 구현 - BaseballGame class - - [ ] 세 자리수 랜덤 숫자 생성 - generateAnswer() + - [x] 세 자리수 랜덤 숫자 생성 - generateAnswer() - [ ] 사용자 입력 받기 - receiveUserInput() - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() \ No newline at end of file diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index c2dc26ebbb..c55138cafe 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -1,5 +1,11 @@ package baseball; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + public class BaseballGame { private Integer answer; @@ -13,7 +19,17 @@ public Integer getAnswer() { } public int generateAnswer() { - return 0; + + AtomicInteger index = new AtomicInteger(); + + answer = Randoms.shuffle(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9)).stream() + .limit(3) + .reduce(0, (x, y) -> { + int result = (int) (x + y * Math.pow(10, index.doubleValue())); + index.getAndIncrement(); + return result; + }); + return answer; } public String receiveUserInput() { From 0b84aa7594181776433ead18273d70fc711bb0ba Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 19:54:16 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20GameManager=20skeleton=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/GameManager.java | 12 ++++++++++++ src/test/java/baseball/GameManagerTest.java | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/baseball/GameManager.java create mode 100644 src/test/java/baseball/GameManagerTest.java diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java new file mode 100644 index 0000000000..f186064b7c --- /dev/null +++ b/src/main/java/baseball/GameManager.java @@ -0,0 +1,12 @@ +package baseball; + +public class GameManager { + + public void start() { + + } + + public void restart() { + + } +} diff --git a/src/test/java/baseball/GameManagerTest.java b/src/test/java/baseball/GameManagerTest.java new file mode 100644 index 0000000000..1f06810f2a --- /dev/null +++ b/src/test/java/baseball/GameManagerTest.java @@ -0,0 +1,16 @@ +package baseball; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class GameManagerTest { + + @Test + void start() { + } + + @Test + void restart() { + } +} \ No newline at end of file From 9eee6f737853b468c7b13db2e3247931e5a47b08 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 20:23:49 +0900 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EA=B8=B0=20-=20receiveUserInput(?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/baseball/BaseballGame.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 6403f2fcb1..9c366d82ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,5 +5,5 @@ - [ ] 게임 종료시 재시작 기능 - restart() - [ ] 숫자 야구 구현 - BaseballGame class - [x] 세 자리수 랜덤 숫자 생성 - generateAnswer() - - [ ] 사용자 입력 받기 - receiveUserInput() + - [x] 사용자 입력 받기 - receiveUserInput() - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() \ No newline at end of file diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index c55138cafe..70519b554e 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -1,5 +1,6 @@ package baseball; +import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; import java.util.List; @@ -33,7 +34,7 @@ public int generateAnswer() { } public String receiveUserInput() { - return null; + return Console.readLine(); } public boolean score(int answer, int userAnswer) { From b696a057bb4f61af37962848f5b8c65d92bfdaf2 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 20:28:31 +0900 Subject: [PATCH 08/12] =?UTF-8?q?fix:=20receiveUserInput=20Integer?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseballGame.java | 4 ++-- src/test/java/baseball/BaseballGameTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 70519b554e..7951907608 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -33,8 +33,8 @@ public int generateAnswer() { return answer; } - public String receiveUserInput() { - return Console.readLine(); + public int receiveUserInput() { + return Integer.parseInt(Console.readLine()); } public boolean score(int answer, int userAnswer) { diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index a654b39f38..94db00738e 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -53,13 +53,13 @@ void tearDown() { @Test void receiveUserInput_유저의_입력을_반환한다() { - String input = "Hello, System.in!"; + String input = "123"; ByteArrayInputStream inputStream = new ByteArrayInputStream(input.getBytes()); System.setIn(inputStream); - String result = baseballGame.receiveUserInput(); + int result = baseballGame.receiveUserInput(); - assertThat(result).isEqualTo(input); + assertThat(result).isEqualTo(Integer.parseInt(input)); } @Test From 9ce7eb62238b369d6e2458180d75ceca974bd673 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 21:00:03 +0900 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EB=A5=BC=20=EB=B0=9B=EC=95=84=20=EC=B1=84?= =?UTF-8?q?=EC=A0=90=20=EB=B0=8F=20=EC=A0=95=EB=8B=B5=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=20=EB=B0=98=ED=99=98=20-=20score()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +- src/main/java/baseball/BaseballGame.java | 47 ++++++++++++++++++++ src/test/java/baseball/BaseballGameTest.java | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9c366d82ce..a63a2312c3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ - [ ] 게임 관리 - GameManager class - [ ] 게임 시작 - start() - [ ] 게임 종료시 재시작 기능 - restart() -- [ ] 숫자 야구 구현 - BaseballGame class +- [x] 숫자 야구 구현 - BaseballGame class - [x] 세 자리수 랜덤 숫자 생성 - generateAnswer() - [x] 사용자 입력 받기 - receiveUserInput() - - [ ] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() \ No newline at end of file + - [x] 사용자 숫자를 받아 채점 및 정답 여부 반환 - score() \ No newline at end of file diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 7951907608..be83cfcfa1 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -3,6 +3,7 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -38,6 +39,52 @@ public int receiveUserInput() { } public boolean score(int answer, int userAnswer) { + + List answerDigits = getDigits(answer); + List userAnswerDigits = getDigits(userAnswer); + + int strike = 0; + int ball = 0; + for (int index = 0; index < 3; index++) { + int num = userAnswerDigits.get(index); + + if (num == answerDigits.get(index)) { + strike++; + continue; + } + + if (answerDigits.contains(num)) { + ball++; + } + } + + StringBuilder sb = new StringBuilder(); + if (strike == 0 && ball == 0) { + sb.append("닛싱"); + } + + if (ball > 0) { + sb.append(ball).append("볼 "); + } + if (strike > 0) { + sb.append(strike).append("스트라이크 "); + } + System.out.println(sb); + + if (strike == 3) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } return false; } + + private static List getDigits(int answer) { + List answerNums = new ArrayList<>(); + int current = answer; + for (int i = 0; i < 3; i++) { + answerNums.add(0, current % 10); + current /= 10; + } + return answerNums; + } } diff --git a/src/test/java/baseball/BaseballGameTest.java b/src/test/java/baseball/BaseballGameTest.java index 94db00738e..05ac4184a0 100644 --- a/src/test/java/baseball/BaseballGameTest.java +++ b/src/test/java/baseball/BaseballGameTest.java @@ -89,7 +89,7 @@ void tearDown() { String output = outputStream.toString().trim(); assertThat(result).isTrue(); - assertThat(output).isEqualTo("3스트라이크\n" + + assertThat(output).isEqualTo("3스트라이크 \n" + "3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } } \ No newline at end of file From 996f71067750a6b223eb2ce437475c173851cae0 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 21:24:45 +0900 Subject: [PATCH 10/12] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20-=20start()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++-- src/main/java/baseball/Application.java | 3 ++- src/main/java/baseball/GameManager.java | 30 +++++++++++++++++++-- src/test/java/baseball/GameManagerTest.java | 4 --- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index a63a2312c3..fa06da19b0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,7 @@ # 기능 목록 -- [ ] 게임 관리 - GameManager class - - [ ] 게임 시작 - start() - - [ ] 게임 종료시 재시작 기능 - restart() +- [x] 게임 관리 - GameManager class + - [x] 게임 시작 - start() - [x] 숫자 야구 구현 - BaseballGame class - [x] 세 자리수 랜덤 숫자 생성 - generateAnswer() - [x] 사용자 입력 받기 - receiveUserInput() diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..3c0aad9897 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + GameManager gameManager = new GameManager(); + gameManager.start(); } } diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index f186064b7c..cb2c6dd7bf 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -1,12 +1,38 @@ package baseball; +import camp.nextstep.edu.missionutils.Console; + public class GameManager { - public void start() { + private BaseballGame game; + public GameManager() { + this.game = new BaseballGame(); } - public void restart() { + public void start() { + + System.out.println("숫자 야구 게임을 시작합니다."); + game.generateAnswer(); + + boolean result = false; + while (!result) { + int userInput = game.receiveUserInput(); + result = game.score(game.getAnswer(), userInput); + } + + askRestart(); + } + private void askRestart() { + while (true) { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String endInput = Console.readLine(); + if (endInput.equals("1")) { + start(); + } else if (endInput.equals("2")) { + return; + } + } } } diff --git a/src/test/java/baseball/GameManagerTest.java b/src/test/java/baseball/GameManagerTest.java index 1f06810f2a..4124bee819 100644 --- a/src/test/java/baseball/GameManagerTest.java +++ b/src/test/java/baseball/GameManagerTest.java @@ -9,8 +9,4 @@ class GameManagerTest { @Test void start() { } - - @Test - void restart() { - } } \ No newline at end of file From 1349ab12c64ede5391a46ae45a753acdc97ab9f7 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 21:49:46 +0900 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20generateAnswer=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91=20=EC=98=A4=EB=A5=98=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/baseball/BaseballGame.java | 29 ++++++++++++++---------- src/main/java/baseball/GameManager.java | 21 ++++++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index be83cfcfa1..a8fb7bea14 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -3,10 +3,11 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class BaseballGame { @@ -24,17 +25,21 @@ public int generateAnswer() { AtomicInteger index = new AtomicInteger(); - answer = Randoms.shuffle(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9)).stream() - .limit(3) - .reduce(0, (x, y) -> { - int result = (int) (x + y * Math.pow(10, index.doubleValue())); - index.getAndIncrement(); - return result; - }); + LinkedHashSet numbers = new LinkedHashSet<>(); + while (numbers.size() < 3) { + numbers.add(Randoms.pickNumberInRange(1, 9)); + } + + answer = numbers.stream().reduce(0, (x, y) -> { + int result = (int) (x + y * Math.pow(10, 2 - index.doubleValue())); + index.getAndIncrement(); + return result; + }); return answer; } public int receiveUserInput() { + System.out.print("숫자를 입력해주세요 : "); return Integer.parseInt(Console.readLine()); } @@ -60,7 +65,7 @@ public boolean score(int answer, int userAnswer) { StringBuilder sb = new StringBuilder(); if (strike == 0 && ball == 0) { - sb.append("닛싱"); + sb.append("낫싱"); } if (ball > 0) { @@ -78,9 +83,9 @@ public boolean score(int answer, int userAnswer) { return false; } - private static List getDigits(int answer) { + private static List getDigits(int num) { List answerNums = new ArrayList<>(); - int current = answer; + int current = num; for (int i = 0; i < 3; i++) { answerNums.add(0, current % 10); current /= 10; diff --git a/src/main/java/baseball/GameManager.java b/src/main/java/baseball/GameManager.java index cb2c6dd7bf..5619fc1daf 100644 --- a/src/main/java/baseball/GameManager.java +++ b/src/main/java/baseball/GameManager.java @@ -21,18 +21,17 @@ public void start() { result = game.score(game.getAnswer(), userInput); } - askRestart(); + String endInput = askRestart(); + if (endInput.equals("1")) { + start(); + } + if (endInput.equals("2")) { + return; + } } - private void askRestart() { - while (true) { - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - String endInput = Console.readLine(); - if (endInput.equals("1")) { - start(); - } else if (endInput.equals("2")) { - return; - } - } + private String askRestart() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + return Console.readLine(); } } From c8ca64b3297dc522bde285812ed287ea77f2f1d9 Mon Sep 17 00:00:00 2001 From: yohanii Date: Mon, 23 Sep 2024 21:54:14 +0900 Subject: [PATCH 12/12] =?UTF-8?q?refactor:=20input=20validate=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/BaseballGame.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index a8fb7bea14..0b7b1f293f 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -40,7 +40,21 @@ public int generateAnswer() { public int receiveUserInput() { System.out.print("숫자를 입력해주세요 : "); - return Integer.parseInt(Console.readLine()); + + String input = Console.readLine(); + validateInput(input); + + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("잘못된 입력 형식입니다."); + } + } + + private void validateInput(String input) { + if (input.length() != 3) { + throw new IllegalArgumentException("잘못된 입력 형식입니다."); + } } public boolean score(int answer, int userAnswer) {