From 442ad43a22a2618e1c7ab824156a76f13780babc Mon Sep 17 00:00:00 2001 From: youngin kim Date: Sun, 5 May 2024 22:29:44 +0900 Subject: [PATCH 01/16] =?UTF-8?q?docs=20:=20=EC=95=BC=EA=B5=AC=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B5=AC=ED=98=84=EC=9D=84=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?README.md=EC=97=90=20=EA=B8=B0=EB=8A=A5=20=EC=A0=95=EB=A6=AC?= 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 8d7e8aee..db5c964e 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse +## 기능 구현 \ No newline at end of file From 3a696a8f0a3c011b45a2bbeb6dcb2df0dcf0ac95 Mon Sep 17 00:00:00 2001 From: Youngin Kim Date: Sun, 5 May 2024 23:50:47 +0900 Subject: [PATCH 02/16] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=9E=AC=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index db5c964e..84046ced 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ # java-baseball-precourse -## 기능 구현 \ No newline at end of file +## 기능 구현 +### 1. 1~9까지의 서로 다른 임의의 수 3개 생성 +### 2. 게임 플레이어가 컴퓨터가 생각하고 있는 3개의 숫자 입력 + 1) 사용자 입력 처리 + 1-1) 사용자가 잘못된 값을 입력할 경우, IllegalArgumentException 을 발생시킨 후 애플리케이션은 종료 + - 1 ~ 9가 아닌 다른 문자를 입력한 경우 + - 1 ~ 9 사이의 숫자를 입력했지만 중복되는 수가 있는 경우 + + 1-2) 사용자가 제대로 된 값을 입력한 경우, 게임을 진행함 + - 1 ~ 9 사이의 서로 다른 임의의 수 3개인 경우 + + 게임이 종료되기 전 까지 사용자에게 계속 값을 입력 받음 + +### 3. 게임 로직 처리 + 1) 컴퓨터가 생성한 값과 사용자가 입력한 값 중 일치하는 것이 있나 확인함 + - 반복문을 통해 먼저 스트라이크가 존재하는지 확인 + - 스트라이크가 있다면, 다음 index의 스트라이크 판단 + - 스트라이크가 아닌 경우, 볼인지 판단 + - 볼도 아니라면 다음 값으로 넘어가서 위의 과정 반복 + + 2) 사용자가 입력한 값의 스트라이크 개수와 볼 개수 확인 + - 스트라이크와 볼 개수를 더한 값이 0 : 낫싱 + - 스트라이크와 볼 개수를 더한 값이 0이 아니라면, 스트라이크와 볼 수 출력 + +### 4. 게임을 종료한 후 게임을 다시 시작하거나 완전 종료할 수 있게 함 + - 게임을 새로 시작하려면 1, 종료하려면 2룰 입력하개 함 + - 1,2 가 아닌 값을 입력할 경우, 다시 입력하게 함 From c3e102d7d93cddda01fcf3f179ccbd4b48d72199 Mon Sep 17 00:00:00 2001 From: Youngin Kim Date: Mon, 6 May 2024 03:47:36 +0900 Subject: [PATCH 03/16] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=9A=A9=EC=96=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 84046ced..45d9515a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # java-baseball-precourse ## 기능 구현 ### 1. 1~9까지의 서로 다른 임의의 수 3개 생성 -### 2. 게임 플레이어가 컴퓨터가 생각하고 있는 3개의 숫자 입력 - 1) 사용자 입력 처리 +### 2. 게임 플레이어에게 수를 입력 받음 + 1) 사용자 입력 검증 1-1) 사용자가 잘못된 값을 입력할 경우, IllegalArgumentException 을 발생시킨 후 애플리케이션은 종료 - 1 ~ 9가 아닌 다른 문자를 입력한 경우 - 1 ~ 9 사이의 숫자를 입력했지만 중복되는 수가 있는 경우 From 931859859c0d7c94a4141ff26a2856d83515dd53 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:08:02 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=EC=9D=98=20=ED=95=B5=EC=8B=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20=EB=8B=B4=EC=9D=80=20Game=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임에서 사용되는 숫자 배열, 스트라이크와 볼의 카운트 관리 --- src/main/java/baseball/domain/Game.java | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/baseball/domain/Game.java diff --git a/src/main/java/baseball/domain/Game.java b/src/main/java/baseball/domain/Game.java new file mode 100644 index 00000000..b77725e9 --- /dev/null +++ b/src/main/java/baseball/domain/Game.java @@ -0,0 +1,36 @@ +package baseball.domain; + +public class Game { + int strikeCount; + int ballCount; + int[] gameNumbers; + + public Game(int[] numbers) { + gameNumbers = numbers; + } + + public void initBaseBall() { + strikeCount = 0; + ballCount = 0; + } + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + public int[] getGameNumbers() { + return gameNumbers; + } + + public void increaseStrikeCount() { + strikeCount += 1; + } + + public void increaseBallCount() { + ballCount += 1; + } +} \ No newline at end of file From 2f97ade6333f64f8a17e18736f81fa0d72a3bd43 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:11:10 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=84=A0=ED=83=9D=ED=95=9C=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=93=A4=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자가 게임 중에 선택한 숫자들을 저장하고 접근하는 기능을 수행 --- src/main/java/baseball/domain/User.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/baseball/domain/User.java diff --git a/src/main/java/baseball/domain/User.java b/src/main/java/baseball/domain/User.java new file mode 100644 index 00000000..8d23b21c --- /dev/null +++ b/src/main/java/baseball/domain/User.java @@ -0,0 +1,13 @@ +package baseball.domain; + +public class User { + int[] userNumbers; + + public int[] getUserNumbers() { + return userNumbers; + } + + public void setUserNumbers(int[] userNumbers) { + this.userNumbers = userNumbers; + } +} \ No newline at end of file From 27ad5811436d79756d05074733961c780c4d73e6 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:24:29 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat=20:=20=EC=A7=80=EC=A0=95=EB=90=9C=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EB=82=B4=EC=97=90=EC=84=9C=20=EC=84=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=8B=A4=EB=A5=B8=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EB=93=A4=EB=A1=9C=20=EA=B5=AC=EC=84=B1=EB=90=9C=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/utils/GenerateRandomNum.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/baseball/utils/GenerateRandomNum.java diff --git a/src/main/java/baseball/utils/GenerateRandomNum.java b/src/main/java/baseball/utils/GenerateRandomNum.java new file mode 100644 index 00000000..07f0e6a8 --- /dev/null +++ b/src/main/java/baseball/utils/GenerateRandomNum.java @@ -0,0 +1,33 @@ +package baseball.utils; + +import java.util.Random; +public class GenerateRandomNum { + private static final Random random = new Random(); + public static int[] getRandomNumbers(int size, int start, int end) { + int[] numbers = new int[size]; + + for (int i = 0; i < size; i++) { + numbers[i] = getUniqueRandomNumber(numbers, start, end, i); + } + return numbers; + } + + private static int getUniqueRandomNumber(int[] numbers, int start, int end, int i) { + // start와 end 사이의 랜덤 숫자 생성 + int randomNumber = start + random.nextInt(end - start + 1); + while (!isUnique(numbers, i, randomNumber)) { + // 랜덤 숫자가 유니크하지 않으면 새로운 랜덤 숫자 생성 + randomNumber = start + random.nextInt(end - start + 1); + } + return randomNumber; + } + + private static Boolean isUnique(int[] numbers, int i, int randomNumber) { + for (int j = 0; j < i; j++) { + if (numbers[j] == randomNumber) { + return false; + } + } + return true; + } +} \ No newline at end of file From 8bf50a75d2595271f67c8776bcba8a805a83b579 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:43:59 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat=20:=20=EC=84=9C=EB=A1=9C=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B8=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=EB=93=A4?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=EC=84=B1=EB=90=9C=20=EB=B0=B0=EC=97=B4?= =?UTF-8?q?=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A5=BC=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=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 --- .../baseball/utils/GenerateRandomNumTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/baseball/utils/GenerateRandomNumTest.java diff --git a/src/test/java/baseball/utils/GenerateRandomNumTest.java b/src/test/java/baseball/utils/GenerateRandomNumTest.java new file mode 100644 index 00000000..64a1d7df --- /dev/null +++ b/src/test/java/baseball/utils/GenerateRandomNumTest.java @@ -0,0 +1,22 @@ +package baseball.utils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class GenerateRandomNumTest { + + @Test + @DisplayName("랜덤 숫자 생성 테스트") + void testGetRandomNumbers() { + int size = 3; + int[] numbers = GenerateRandomNum.getRandomNumbers(size, 1, 9); + + assertEquals(size, numbers.length); + assertTrue(numbers[0] != numbers[1]); + assertTrue(numbers[1] != numbers[2]); + assertTrue(numbers[0] != numbers[2]); + } +} \ No newline at end of file From 14ac5d6d3304bb916b8b1b69f673ed42b30c7532 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:58:00 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=EC=9D=84=20=EB=B6=84=EC=84=9D(parse)=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=A0=95=EC=88=98=20=EB=B0=B0=EC=97=B4=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/utils/Parse.java | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/baseball/utils/Parse.java diff --git a/src/main/java/baseball/utils/Parse.java b/src/main/java/baseball/utils/Parse.java new file mode 100644 index 00000000..467eb8f7 --- /dev/null +++ b/src/main/java/baseball/utils/Parse.java @@ -0,0 +1,35 @@ +package baseball.utils; + +public class Parse { + + public int[] parseUserInput(String input, int size) throws IllegalArgumentException { + checkSize(input, size); + return getParseInt(input, size); + } + + private void checkSize(String input, int size) throws IllegalArgumentException { + if (input.length() != size) { + throw new IllegalArgumentException(); + } + } + + private int[] getParseInt(String input, int size) throws IllegalArgumentException { + int[] parseInt = new int[size]; + + for (int i = 0; i < input.length(); i++) { + if (!checkDigit(input, i)) { + throw new IllegalArgumentException(); + } + parseInt[i] = convertCharToInt(input, i); + } + return parseInt; + } + + private int convertCharToInt(String input, int i) { + return input.charAt(i) - '0'; + } + + private Boolean checkDigit(String input, int i) { + return '0' <= input.charAt(i) && input.charAt(i) <= '9'; + } +} \ No newline at end of file From 087e5b83085462ecf2a2acc80b3b43755ba92c68 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 08:59:33 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?parsing=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=99=95=EC=9D=B8=20=EB=B0=8F=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=ED=99=95?= =?UTF-8?q?=EC=9D=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/baseball/utils/ParseTest.java | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/java/baseball/utils/ParseTest.java diff --git a/src/test/java/baseball/utils/ParseTest.java b/src/test/java/baseball/utils/ParseTest.java new file mode 100644 index 00000000..d6d07dec --- /dev/null +++ b/src/test/java/baseball/utils/ParseTest.java @@ -0,0 +1,28 @@ +package baseball.utils; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class ParseTest { + + @Test + void parseUserInputInvalidLength() { + // 길이가 유효하지 않을 때 IllegalArgumentException을 던져야 합니다. + Parse parse = new Parse(); + assertThrows(IllegalArgumentException.class, () -> parse.parseUserInput("12345", 3)); + } + + @Test + void parseUserInputNonDigit() { + // 입력에 숫자가 아닌 문자가 포함되어 있을 때 IllegalArgumentException을 던져야 합니다. + Parse parse = new Parse(); + assertThrows(IllegalArgumentException.class, () -> parse.parseUserInput("12a4", 4)); + } + + @Test + void parseUserInputValid() { + // 정상적인 입력을 처리할 수 있어야 합니다. + Parse parse = new Parse(); + assertArrayEquals(new int[]{1, 2, 3}, parse.parseUserInput("123", 3)); + } +} From 17c0f74851175fc65fc85ee1e7f01688ddb289c3 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 09:02:49 +0900 Subject: [PATCH 10/16] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=97=90=EA=B2=8C=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=9A=94=EC=B2=AD=EC=9D=84=20=ED=95=98=EA=B3=A0,?= =?UTF-8?q?=20=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=ED=9B=84=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EB=A6=AC=ED=8A=B8=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=AC=BB=EB=8A=94=20view=20=EC=BD=94=EB=93=9C=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/view/RequestInput.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/baseball/view/RequestInput.java diff --git a/src/main/java/baseball/view/RequestInput.java b/src/main/java/baseball/view/RequestInput.java new file mode 100644 index 00000000..8f045055 --- /dev/null +++ b/src/main/java/baseball/view/RequestInput.java @@ -0,0 +1,12 @@ +package baseball.view; + +public class RequestInput { + + public static void requestInputData() { + System.out.print("숫자를 입력해 주세요 : "); + } + + public static void printRetryMessage() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + } +} \ No newline at end of file From 73fcabfd675ea08029a8b7a9ecb95fdc7e3e090d Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 09:04:49 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat=20:=20=EB=82=AB=EC=8B=B1,=20?= =?UTF-8?q?=EB=B3=BC,=20=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC,=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20vie?= =?UTF-8?q?w=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/main/java/baseball/view/GameMessage.java | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/baseball/view/GameMessage.java diff --git a/src/main/java/baseball/view/GameMessage.java b/src/main/java/baseball/view/GameMessage.java new file mode 100644 index 00000000..8d3d04b4 --- /dev/null +++ b/src/main/java/baseball/view/GameMessage.java @@ -0,0 +1,22 @@ +package baseball.view; + +public class GameMessage { + public void printScoreMessage(int ball, int strike) { + if (ball == 0 && strike == 0) { + System.out.println("낫싱"); + } + if (ball == 0 && strike != 0) { + System.out.println(strike + "스트라이크"); + } + if (ball != 0 && strike == 0) { + System.out.println(ball + "볼"); + } + if (ball != 0 && strike != 0) { + System.out.println(ball + "볼 " + strike + "스트라이크"); + } + } + + public static void printGameOverMessage() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } +} From 23324c44be338f002ed63fa80e6b44d7013d2ac8 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 09:18:54 +0900 Subject: [PATCH 12/16] =?UTF-8?q?feat=20:=20=EB=82=AB=EC=8B=B1,=20?= =?UTF-8?q?=EB=B3=BC,=20=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC,=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20test=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 --- .../java/baseball/view/GameMessageTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/test/java/baseball/view/GameMessageTest.java diff --git a/src/test/java/baseball/view/GameMessageTest.java b/src/test/java/baseball/view/GameMessageTest.java new file mode 100644 index 00000000..e0818c54 --- /dev/null +++ b/src/test/java/baseball/view/GameMessageTest.java @@ -0,0 +1,60 @@ +package baseball.view; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GameMessageTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + + @BeforeEach + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + } + + @AfterEach + public void restoreStreams() { + System.setOut(originalOut); + } + + @Test + public void testPrintScoreMessageNothing() { + GameMessage gameMessage = new GameMessage(); + gameMessage.printScoreMessage(0, 0); + assertEquals("낫싱\n", outContent.toString()); + } + + @Test + public void testPrintScoreMessageOnlyStrikes() { + GameMessage gameMessage = new GameMessage(); + gameMessage.printScoreMessage(0, 3); + assertEquals("3스트라이크\n", outContent.toString()); + } + + @Test + public void testPrintScoreMessageOnlyBalls() { + GameMessage gameMessage = new GameMessage(); + gameMessage.printScoreMessage(2, 0); + assertEquals("2볼\n", outContent.toString()); + } + + @Test + public void testPrintScoreMessageBallsAndStrikes() { + GameMessage gameMessage = new GameMessage(); + gameMessage.printScoreMessage(1, 2); + assertEquals("1볼 2스트라이크\n", outContent.toString()); + } + + @Test + public void testPrintGameOverMessage() { + GameMessage.printGameOverMessage(); + assertEquals("3개의 숫자를 모두 맞히셨습니다! 게임 종료\n", outContent.toString()); + } +} From 372082d61afcf0ed90bd4c930b05a1b03421b606 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 09:25:05 +0900 Subject: [PATCH 13/16] =?UTF-8?q?feat=20:=20=EC=8B=A4=EC=A0=9C=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=95=BC=EA=B5=AC=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=98=EB=8A=94=20service=20=EC=BD=94?= =?UTF-8?q?=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 setGame 메서드를 통해 게임 설정(숫자의 크기와 범위) playGame 메서드를 호출하면, 사용자가 3 스트라이크를 얻을 때까지 게임이 진행됨 각 시도마다 사용자는 숫자를 입력하고, 프로그램은 스트라이크와 볼의 수를 계산하여 출력함 사용자가 3 스트라이크를 얻으면 게임이 종료됨 --- .../java/baseball/service/GameService.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/baseball/service/GameService.java diff --git a/src/main/java/baseball/service/GameService.java b/src/main/java/baseball/service/GameService.java new file mode 100644 index 00000000..3fcee947 --- /dev/null +++ b/src/main/java/baseball/service/GameService.java @@ -0,0 +1,70 @@ +package baseball.service; + +import baseball.domain.Game; +import baseball.domain.User; +import baseball.utils.Parse; +import baseball.utils.GenerateRandomNum; +import baseball.view.RequestInput; +import baseball.view.GameMessage; +import java.util.Scanner; + +public class GameService { + + int size; + Game game; + User user = new User(); + Parse parser = new Parse(); + GameMessage systemMessage = new GameMessage(); + private final Scanner scanner = new Scanner(System.in); + public void setGame(int size, int start, int end) { + this.size = size; + game = new Game(GenerateRandomNum.getRandomNumbers(size, start, end)); + } + + public void playGame() { + int strike = 0; + while (strike != 3) { + play(); + systemMessage.printScoreMessage(game.getBallCount(), game.getStrikeCount()); + strike = game.getStrikeCount(); + } + } + + private void play() { + game.initBaseBall(); + user.setUserNumbers(getUserNumber()); + computeScore(); + } + + private int[] getUserNumber() throws IllegalArgumentException { + RequestInput.requestInputData(); + String input = scanner.nextLine(); + return parser.parseUserInput(input, size); + } + + private void computeScore() { + for (int i = 0; i < size; i++) { + compute(game.getGameNumbers(), user.getUserNumbers(), i); + } + } + + private void compute(int[] gameNumber, int[] userNumber, int index) { + int temp = -1; + for (int i = 0; i < gameNumber.length; i++) { + if (gameNumber[i] == userNumber[index]) { + temp = i; + break; + } + } + increaseCount(index, temp); + } + + private void increaseCount(int index, int temp) { + if (temp != index && temp != -1) { + game.increaseBallCount(); + } + if (temp == index) { + game.increaseStrikeCount(); + } + } +} From 7feb66692dcbe0c6a59a5e9adabd1f66b7c01f9e Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 10:05:27 +0900 Subject: [PATCH 14/16] =?UTF-8?q?feat=20:=20=EA=B2=8C=EC=9E=84=EC=9D=98=20?= =?UTF-8?q?=EC=A3=BC=EC=9A=94=20=ED=9D=90=EB=A6=84=EC=9D=84=20=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=ED=95=98=EB=8A=94=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임 설정, 게임 시작, 게임 종료 후 재시도 여부 묻기 등의 기능 구현 --- .../controller/BaseballGameController.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/main/java/baseball/controller/BaseballGameController.java diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java new file mode 100644 index 00000000..dcd4b36a --- /dev/null +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -0,0 +1,57 @@ +package baseball.controller; + +import baseball.service.GameService; +import baseball.view.GameMessage; +import baseball.view.RequestInput; +import java.util.Scanner; + +public class BaseballGameController { + final int SIZE = 3; + final int START= 1; + final int END = 9; + final int RETRY = 1; + final int GAME_OVER = 2; + + GameService gameService = new GameService(); + private Scanner scanner = new Scanner(System.in); + + public void run() throws IllegalArgumentException { + setGame(); + startGame(); + endGame(); + askRetry(); + } + + private void setGame() { + gameService.setGame(SIZE, START, END); + } + + private void startGame() throws IllegalArgumentException { + gameService.playGame(); + } + + private void endGame() { + GameMessage.printGameOverMessage(); + } + + /* + - 유저입력이 (문자 or 개수가 0 or 3 이상) : Exception + - 유저입력이 (1) : 재시작 + - 유저입력이 (2) : 종료 + */ + private void askRetry() throws IllegalArgumentException { + RequestInput.printRetryMessage(); + if (getInputNum() == RETRY) { + run(); + } + } + + private int getInputNum() throws IllegalArgumentException { + int inputNum = Integer.parseInt(scanner.nextLine()); + + if (inputNum == 0 || inputNum > GAME_OVER) { + throw new IllegalArgumentException(); + } + return inputNum; + } +} From d3a0975094a6968326c548f4a7df54ee1dc061f7 Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 10:06:02 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20=EC=8B=A4=ED=96=89=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/baseball/Application.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java new file mode 100644 index 00000000..e6713556 --- /dev/null +++ b/src/main/java/baseball/Application.java @@ -0,0 +1,10 @@ +package baseball; + +import baseball.controller.BaseballGameController; + +public class Application { + public static void main(String[] args) { + BaseballGameController controller = new BaseballGameController(); + controller.run(); + } +} \ No newline at end of file From 6565b25e6284ea7fae3cecd9c0d90e84538ed31c Mon Sep 17 00:00:00 2001 From: youngin kim Date: Mon, 6 May 2024 10:07:06 +0900 Subject: [PATCH 16/16] =?UTF-8?q?feat=20:=20=EC=88=AB=EC=9E=90=20=EC=95=BC?= =?UTF-8?q?=EA=B5=AC=20=EA=B2=8C=EC=9E=84=20test=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 점수 출력 게임 성공 여부 출력 --- src/test/java/baseball/ApplicationTest.java | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/test/java/baseball/ApplicationTest.java diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java new file mode 100644 index 00000000..2bf30f75 --- /dev/null +++ b/src/test/java/baseball/ApplicationTest.java @@ -0,0 +1,48 @@ +package baseball; + +import baseball.view.GameMessage; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ApplicationTest { + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @AfterEach + public void tearDown() { + System.setOut(standardOut); + } + + @Test + public void testPrintScoreMessage() { + GameMessage gameMessage = new GameMessage(); + gameMessage.printScoreMessage(0, 0); + assertTrue(outputStreamCaptor.toString().trim().equals("낫싱")); + + outputStreamCaptor.reset(); // 스트림 초기화 + + gameMessage.printScoreMessage(1, 2); + assertTrue(outputStreamCaptor.toString().trim().equals("1볼 2스트라이크")); + } + + @Test + public void testPrintGameOverMessage() { + GameMessage.printGameOverMessage(); + assertTrue(outputStreamCaptor.toString().trim().equals("3개의 숫자를 모두 맞히셨습니다! 게임 종료")); + } + + // RequestInput에 대한 테스트는 복잡성으로 인해 여기서 다루지 않습니다. + // 일반적으로 표준 입력을 직접 다루는 것은 테스트에서 권장되지 않습니다. +}