From b4fbfbc8398d1d48feecca1e9d03d8b9c0b8c36e Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 17:45:31 +0900 Subject: [PATCH 01/26] =?UTF-8?q?docs=20README.md:=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=AA=A9=EB=A1=9D=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 --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..0b30332b 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +### 기능 요구사항 목록 +- [ ] 컴퓨터가 랜덤 3자리수 생성 +- [ ] 사용자에게 수 입력받기 +- [ ] 입력받은 수와 비교하여 힌트 생성 + - [ ] 스트라이크 : 같은 수가 같은 자리에 있을 때 + - [ ] 볼 : 같은 수가 다른 자리에 있을 때 + - [ ] 낫싱 : 같은 수가 전혀 없을 때 +- [ ] 힌트 출력하기 +- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 +- [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 From 3cd1fade9f48159e9028487ccdd750e9c55e12fb Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 17:45:44 +0900 Subject: [PATCH 02/26] =?UTF-8?q?docs=20README.md:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=AA=A9=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 --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 0b30332b..b36f769a 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,14 @@ - [ ] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 - [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 + +### 테스트 목록 +- [ ] 랜덤 3자리수를 생성하는지 확인 + - [ ] 3자리 숫자를 생성하는지 확인 +- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생하는 지 확인 + - [ ] 숫자가 아닌 값을 입력했을 때 + - [ ] 3자리가 아닌 숫자를 입력했을 때 +- [ ] 힌트 확인하기 + - [ ] 스트라이크 + - [ ] 볼 + - [ ] 낫싱 From e50b63b8fbb42fd0243b8a5173c2f85fc657247b Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 18:56:48 +0900 Subject: [PATCH 03/26] =?UTF-8?q?feat=20BaseballGame:=20=EC=BB=B4=ED=93=A8?= =?UTF-8?q?=ED=84=B0=EA=B0=80=201=EC=97=90=EC=84=9C=209=EA=B9=8C=EC=A7=80?= =?UTF-8?q?=20=EC=84=9C=EB=A1=9C=20=EB=8B=A4=EB=A5=B8=20=EC=9E=84=EC=9D=98?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=203=EA=B0=9C=EB=A5=BC=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++++++++++--------- src/main/java/Application.java | 7 +++++++ src/main/java/BaseballGame.java | 34 +++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/BaseballGame.java diff --git a/README.md b/README.md index b36f769a..d8f9bd05 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,19 @@ # java-baseball-precourse ### 기능 요구사항 목록 -- [ ] 컴퓨터가 랜덤 3자리수 생성 -- [ ] 사용자에게 수 입력받기 -- [ ] 입력받은 수와 비교하여 힌트 생성 - - [ ] 스트라이크 : 같은 수가 같은 자리에 있을 때 - - [ ] 볼 : 같은 수가 다른 자리에 있을 때 - - [ ] 낫싱 : 같은 수가 전혀 없을 때 -- [ ] 힌트 출력하기 -- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 -- [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 + +- [x] 컴퓨터가 1에서 9까지 서로 다른 임의의 수 3개를 선택 +- [ ] 사용자에게 수 입력받기 +- [ ] 입력받은 수와 비교하여 힌트 생성 + - [ ] 스트라이크 : 같은 수가 같은 자리에 있을 때 + - [ ] 볼 : 같은 수가 다른 자리에 있을 때 + - [ ] 낫싱 : 같은 수가 전혀 없을 때 +- [ ] 힌트 출력하기 +- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 +- [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 ### 테스트 목록 + - [ ] 랜덤 3자리수를 생성하는지 확인 - [ ] 3자리 숫자를 생성하는지 확인 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생하는 지 확인 diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..35fefdc6 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,7 @@ +public class Application { + + public static void main(String[] args) { + BaseballGame baseballGame = new BaseballGame(); + baseballGame.init(); + } +} diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java new file mode 100644 index 00000000..ea8bdbf6 --- /dev/null +++ b/src/main/java/BaseballGame.java @@ -0,0 +1,34 @@ +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +public class BaseballGame { + + private final int NUMBER_COUNT = 3; + private int[] answer = new int[NUMBER_COUNT]; + + public BaseballGame() { + + } + + public void init() { + createRandomAnswer(); + } + + private void createRandomAnswer() { + Set numbers = new HashSet<>(); + while (numbers.size() < NUMBER_COUNT) { + int number = createRandomNumber(); + numbers.add(number); + } + int index = 0; + for (int number : numbers) { + answer[index++] = number; + } + } + + private int createRandomNumber() { + Random random = new Random(); + return random.nextInt(); + } +} From dfd2e6a6bdaf08e0d2264786bba2d6d46c78d244 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 19:12:37 +0900 Subject: [PATCH 04/26] =?UTF-8?q?refactor=20BaseballGame:=20BaseBallGame?= =?UTF-8?q?=EC=97=90=EC=84=9C=20player=EC=99=80=20constant=EB=A1=9C=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=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/BaseballGame.java | 26 +------------------------- src/main/java/GameConstant.java | 4 ++++ src/main/java/Player.java | 30 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 src/main/java/GameConstant.java create mode 100644 src/main/java/Player.java diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index ea8bdbf6..9def72ca 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -1,34 +1,10 @@ -import java.util.HashSet; -import java.util.Random; -import java.util.Set; - public class BaseballGame { - private final int NUMBER_COUNT = 3; - private int[] answer = new int[NUMBER_COUNT]; - public BaseballGame() { } public void init() { - createRandomAnswer(); - } - - private void createRandomAnswer() { - Set numbers = new HashSet<>(); - while (numbers.size() < NUMBER_COUNT) { - int number = createRandomNumber(); - numbers.add(number); - } - int index = 0; - for (int number : numbers) { - answer[index++] = number; - } - } - - private int createRandomNumber() { - Random random = new Random(); - return random.nextInt(); + Player computer = new Player(); } } diff --git a/src/main/java/GameConstant.java b/src/main/java/GameConstant.java new file mode 100644 index 00000000..955134f8 --- /dev/null +++ b/src/main/java/GameConstant.java @@ -0,0 +1,4 @@ +public final class GameConstant { + + static final int NUMBER_COUNT = 3; +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java new file mode 100644 index 00000000..6cc7655f --- /dev/null +++ b/src/main/java/Player.java @@ -0,0 +1,30 @@ +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +public class Player { + + private int[] answer = new int[GameConstant.NUMBER_COUNT]; + + public Player() { + createRandomAnswer(); + } + + private void createRandomAnswer() { + Set numbers = new HashSet<>(); + while (numbers.size() < GameConstant.NUMBER_COUNT) { + int number = createRandomNumber(); + numbers.add(number); + } + int index = 0; + for (int number : numbers) { + answer[index++] = number; + } + } + + private int createRandomNumber() { + Random random = new Random(); + return random.nextInt(); + } + +} From 5cbf448e33514c50af3bd506fb19219b388281da Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 22:13:25 +0900 Subject: [PATCH 05/26] =?UTF-8?q?feat=20Player:=20guess=20=EA=B0=80=20?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=99=94=EC=9D=84=20=EB=95=8C,=20ball=20?= =?UTF-8?q?=EA=B3=BC=20strike=20=EA=B0=9C=EC=88=98=EB=A5=BC=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=B4=EC=A3=BC=EB=8A=94=20checkMatching=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- src/main/java/BaseBallGameResult.java | 3 +++ src/main/java/Player.java | 31 ++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/BaseBallGameResult.java diff --git a/README.md b/README.md index d8f9bd05..4fb02f58 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ - [x] 컴퓨터가 1에서 9까지 서로 다른 임의의 수 3개를 선택 - [ ] 사용자에게 수 입력받기 - [ ] 입력받은 수와 비교하여 힌트 생성 - - [ ] 스트라이크 : 같은 수가 같은 자리에 있을 때 - - [ ] 볼 : 같은 수가 다른 자리에 있을 때 + - [x] 스트라이크 : 같은 수가 같은 자리에 있을 때 + - [x] 볼 : 같은 수가 다른 자리에 있을 때 - [ ] 낫싱 : 같은 수가 전혀 없을 때 - [ ] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 @@ -19,6 +19,7 @@ - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생하는 지 확인 - [ ] 숫자가 아닌 값을 입력했을 때 - [ ] 3자리가 아닌 숫자를 입력했을 때 + - [ ] 같은 숫자 여러개를 입력했을 때 - [ ] 힌트 확인하기 - [ ] 스트라이크 - [ ] 볼 diff --git a/src/main/java/BaseBallGameResult.java b/src/main/java/BaseBallGameResult.java new file mode 100644 index 00000000..c24136cc --- /dev/null +++ b/src/main/java/BaseBallGameResult.java @@ -0,0 +1,3 @@ +public record BaseBallGameResult(int ball, int strike) { + +} \ No newline at end of file diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 6cc7655f..358df768 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -5,13 +5,14 @@ public class Player { private int[] answer = new int[GameConstant.NUMBER_COUNT]; + Set numbers = new HashSet<>(); public Player() { createRandomAnswer(); } private void createRandomAnswer() { - Set numbers = new HashSet<>(); + numbers.clear(); while (numbers.size() < GameConstant.NUMBER_COUNT) { int number = createRandomNumber(); numbers.add(number); @@ -27,4 +28,32 @@ private int createRandomNumber() { return random.nextInt(); } + public BaseBallGameResult checkMatching(int[] guess) { + int ball = checkBall(guess); + int strike = checkStrike(guess); + return new BaseBallGameResult(ball, strike); + } + + private int checkBall(int[] guess) { + int count = 0; + for (int i = 0; i < GameConstant.NUMBER_COUNT; i++) { + if (answer[i] == guess[i]) { + continue; + } + if (numbers.contains(guess[i])) { + count++; + } + } + return count; + } + + private int checkStrike(int[] guess) { + int count = 0; + for (int i = 0; i < GameConstant.NUMBER_COUNT; i++) { + if (answer[i] == guess[i]) { + count++; + } + } + return count; + } } From 8e5794daac45da1286d43f0297da8bac5433c229 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 22:42:38 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat=20BaseballGame:=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=88=98=EC=99=80=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=ED=9E=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++-- src/main/java/BaseballGame.java | 53 +++++++++++++++++++++++++- src/main/java/GameMessageConstant.java | 6 +++ 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/main/java/GameMessageConstant.java diff --git a/README.md b/README.md index 4fb02f58..6d73591b 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ - [x] 컴퓨터가 1에서 9까지 서로 다른 임의의 수 3개를 선택 - [ ] 사용자에게 수 입력받기 -- [ ] 입력받은 수와 비교하여 힌트 생성 - - [x] 스트라이크 : 같은 수가 같은 자리에 있을 때 - - [x] 볼 : 같은 수가 다른 자리에 있을 때 - - [ ] 낫싱 : 같은 수가 전혀 없을 때 +- [x] 입력받은 수와 비교하여 힌트 생성 + - [x] 스트라이크 : 같은 수가 같은 자리에 있을 때 + - [x] 볼 : 같은 수가 다른 자리에 있을 때 + - [x] 낫싱 : 같은 수가 전혀 없을 때 - [ ] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 - [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 9def72ca..a76f3d7a 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -1,10 +1,61 @@ public class BaseballGame { + Player computer; + boolean isEnd; + public BaseballGame() { } public void init() { - Player computer = new Player(); + computer = new Player(); + isEnd = false; + } + + public String getHint(String input) { + BaseBallGameResult result = computer.checkMatching(input2IntArray(input)); + checkEnd(result); + return result2Hint(result); + } + + private void checkEnd(BaseBallGameResult result) { + if (result.strike() == GameConstant.NUMBER_COUNT) { + isEnd = true; + } + } + + private int[] input2IntArray(String input) { + int[] guess = new int[GameConstant.NUMBER_COUNT]; + for (int i = 0; i < GameConstant.NUMBER_COUNT; i++) { + guess[i] = Character.getNumericValue(input.charAt(i)); + } + return guess; + } + + private String result2Hint(BaseBallGameResult result) { + if (result.ball() == 0 && result.strike() == 0) { + return GameMessageConstant.NOTHING; + } + if (result.ball() == 0) { + return strike2String(result.strike()); + } + if (result.strike() == 0) { + return ball2String(result.ball()); + } + return ball2String(result.ball()) + " " + strike2String(result.strike()); + } + + private String ball2String(int ball) { + if (ball > 0) { + return String.format("%d%s", ball, GameMessageConstant.BALL); + } + return ""; + } + + private String strike2String(int strike) { + if (strike > 0) { + return String.format("%d%s", strike, GameMessageConstant.STRIKE); + } + return ""; } } diff --git a/src/main/java/GameMessageConstant.java b/src/main/java/GameMessageConstant.java new file mode 100644 index 00000000..bffe7190 --- /dev/null +++ b/src/main/java/GameMessageConstant.java @@ -0,0 +1,6 @@ +public final class GameMessageConstant { + + static final String BALL = "볼"; + static final String STRIKE = "스트라이크"; + static final String NOTHING = "낫싱"; +} From 7cc21418f3928c49a803ce3e1624a6568b2c1408 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 22:50:11 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat=20BaseballGame:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EC=97=90=EA=B2=8C=20=EC=88=98=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EA=B3=A0,=20=ED=9E=8C=ED=8A=B8=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/Application.java | 1 + src/main/java/BaseballGame.java | 13 +++++++++++++ src/main/java/GameMessageConstant.java | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d73591b..e2441bda 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ ### 기능 요구사항 목록 - [x] 컴퓨터가 1에서 9까지 서로 다른 임의의 수 3개를 선택 -- [ ] 사용자에게 수 입력받기 +- [x] 사용자에게 수 입력받기 - [x] 입력받은 수와 비교하여 힌트 생성 - [x] 스트라이크 : 같은 수가 같은 자리에 있을 때 - [x] 볼 : 같은 수가 다른 자리에 있을 때 - [x] 낫싱 : 같은 수가 전혀 없을 때 -- [ ] 힌트 출력하기 +- [x] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 - [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 35fefdc6..09007449 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -3,5 +3,6 @@ public class Application { public static void main(String[] args) { BaseballGame baseballGame = new BaseballGame(); baseballGame.init(); + baseballGame.game(); } } diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index a76f3d7a..cd2ebadc 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -1,3 +1,5 @@ +import java.util.Scanner; + public class BaseballGame { Player computer; @@ -12,6 +14,17 @@ public void init() { isEnd = false; } + public void game() { + init(); + System.out.println(GameMessageConstant.START_GAME); + do { + Scanner scanner = new Scanner(System.in); + String input = scanner.next(); + String hint = getHint(input); + System.out.println(hint); + } while (!isEnd); + } + public String getHint(String input) { BaseBallGameResult result = computer.checkMatching(input2IntArray(input)); checkEnd(result); diff --git a/src/main/java/GameMessageConstant.java b/src/main/java/GameMessageConstant.java index bffe7190..f11fbbb4 100644 --- a/src/main/java/GameMessageConstant.java +++ b/src/main/java/GameMessageConstant.java @@ -3,4 +3,5 @@ public final class GameMessageConstant { static final String BALL = "볼"; static final String STRIKE = "스트라이크"; static final String NOTHING = "낫싱"; + static final String START_GAME = "숫자 야구 게임을 시작합니다. 제가 생각한 숫자를 맞춰보세요!\n"; } From e2c2095cb0769090d27c56d73d682db181128d57 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 22:54:07 +0900 Subject: [PATCH 08/26] =?UTF-8?q?fix=20Player:=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=EC=8B=9C=2010=20?= =?UTF-8?q?=EB=AF=B8=EB=A7=8C=EC=9C=BC=EB=A1=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=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/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 358df768..bd01ed65 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -25,7 +25,7 @@ private void createRandomAnswer() { private int createRandomNumber() { Random random = new Random(); - return random.nextInt(); + return random.nextInt(10); } public BaseBallGameResult checkMatching(int[] guess) { From 78e1e84f36d2b350c23e2127ad8e4b696d47adb4 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:03:51 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat=20Player:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=88=98=EB=A5=BC=20=EB=A7=9E=EC=B7=84?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C,=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=ED=95=A0=20=EA=B1=B4=EC=A7=80=20=EB=AC=BC?= =?UTF-8?q?=EC=96=B4=EB=B3=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/Application.java | 3 +-- src/main/java/BaseballGame.java | 14 ++++++++++++++ src/main/java/GameConstant.java | 2 ++ src/main/java/GameMessageConstant.java | 5 +++++ 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e2441bda..4ba12af0 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - [x] 낫싱 : 같은 수가 전혀 없을 때 - [x] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 -- [ ] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 +- [x] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 ### 테스트 목록 diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 09007449..809cda5f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -2,7 +2,6 @@ public class Application { public static void main(String[] args) { BaseballGame baseballGame = new BaseballGame(); - baseballGame.init(); - baseballGame.game(); + baseballGame.run(); } } diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index cd2ebadc..42d52e24 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -23,6 +23,20 @@ public void game() { String hint = getHint(input); System.out.println(hint); } while (!isEnd); + System.out.println(GameMessageConstant.GAME_CLEAR); + } + + public void run() { + while (true) { + game(); + System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); + Scanner scanner = new Scanner(System.in); + int input = scanner.nextInt(); + if (input == GameConstant.END_GAME_NUMBER) { + break; + } + } + System.out.println(GameMessageConstant.GAME_END); } public String getHint(String input) { diff --git a/src/main/java/GameConstant.java b/src/main/java/GameConstant.java index 955134f8..69861777 100644 --- a/src/main/java/GameConstant.java +++ b/src/main/java/GameConstant.java @@ -1,4 +1,6 @@ public final class GameConstant { static final int NUMBER_COUNT = 3; + static final int RESTART_GAME_NUMBER = 1; + static final int END_GAME_NUMBER = 2; } diff --git a/src/main/java/GameMessageConstant.java b/src/main/java/GameMessageConstant.java index f11fbbb4..fbebf054 100644 --- a/src/main/java/GameMessageConstant.java +++ b/src/main/java/GameMessageConstant.java @@ -4,4 +4,9 @@ public final class GameMessageConstant { static final String STRIKE = "스트라이크"; static final String NOTHING = "낫싱"; static final String START_GAME = "숫자 야구 게임을 시작합니다. 제가 생각한 숫자를 맞춰보세요!\n"; + static final String GAME_CLEAR = String.format("%d개의 숫자를 정확히 맞히셨습니다! 축하드립니다.", + GameConstant.NUMBER_COUNT); + static final String GAME_RESTART_QUESTION = String.format("게임을 새로 시작하려면 %d, 종료하려면 %d를 입력하세요.", + GameConstant.RESTART_GAME_NUMBER, GameConstant.END_GAME_NUMBER); + static final String GAME_END = "게임을 종료합니다."; } From 83b565ed82de5b19cc71f3bef8333c7858fd7357 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:14:50 +0900 Subject: [PATCH 10/26] =?UTF-8?q?refactor:=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=BD=94=EB=93=9C=EC=A0=95=EB=A6=AC,=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EC=8B=9C=20=EC=9E=98=EB=AA=BB=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=A9=B4=20IllegalArgumentException=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BaseballGame.java | 22 ++++++++++++---------- src/main/java/GameMessageConstant.java | 1 + src/main/java/Player.java | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 42d52e24..687cfa95 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -5,10 +5,6 @@ public class BaseballGame { Player computer; boolean isEnd; - public BaseballGame() { - - } - public void init() { computer = new Player(); isEnd = false; @@ -17,23 +13,29 @@ public void init() { public void game() { init(); System.out.println(GameMessageConstant.START_GAME); + Scanner scanner = new Scanner(System.in); + String input; + String hint; do { - Scanner scanner = new Scanner(System.in); - String input = scanner.next(); - String hint = getHint(input); + System.out.print(GameMessageConstant.INPUT_NUMBER); + input = scanner.next(); + hint = getHint(input); System.out.println(hint); } while (!isEnd); System.out.println(GameMessageConstant.GAME_CLEAR); } public void run() { + Scanner scanner = new Scanner(System.in); + String input; while (true) { game(); System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); - Scanner scanner = new Scanner(System.in); - int input = scanner.nextInt(); - if (input == GameConstant.END_GAME_NUMBER) { + input = scanner.next(); + if (input.equals(String.valueOf(GameConstant.END_GAME_NUMBER))) { break; + } else if (!input.equals(String.valueOf(GameConstant.RESTART_GAME_NUMBER))) { + throw new IllegalArgumentException(); } } System.out.println(GameMessageConstant.GAME_END); diff --git a/src/main/java/GameMessageConstant.java b/src/main/java/GameMessageConstant.java index fbebf054..fe47cd91 100644 --- a/src/main/java/GameMessageConstant.java +++ b/src/main/java/GameMessageConstant.java @@ -4,6 +4,7 @@ public final class GameMessageConstant { static final String STRIKE = "스트라이크"; static final String NOTHING = "낫싱"; static final String START_GAME = "숫자 야구 게임을 시작합니다. 제가 생각한 숫자를 맞춰보세요!\n"; + static final String INPUT_NUMBER = "숫자를 입력해주세요 : "; static final String GAME_CLEAR = String.format("%d개의 숫자를 정확히 맞히셨습니다! 축하드립니다.", GameConstant.NUMBER_COUNT); static final String GAME_RESTART_QUESTION = String.format("게임을 새로 시작하려면 %d, 종료하려면 %d를 입력하세요.", diff --git a/src/main/java/Player.java b/src/main/java/Player.java index bd01ed65..0072e941 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -4,7 +4,7 @@ public class Player { - private int[] answer = new int[GameConstant.NUMBER_COUNT]; + private final int[] answer = new int[GameConstant.NUMBER_COUNT]; Set numbers = new HashSet<>(); public Player() { From e078e770ae4d7104ade901206219e1a95bde4538 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:33:17 +0900 Subject: [PATCH 11/26] =?UTF-8?q?refactor=20BaseballGame:=20input=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EC=A2=80=20=EB=8D=94=20=EB=AA=85?= =?UTF-8?q?=ED=99=95=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD=20-=20?= =?UTF-8?q?=EC=B6=94=EC=B8=A1=20=EC=9E=85=EB=A0=A5=EC=9D=98=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20inputNumber,=20=EA=B2=8C=EC=9E=84=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EB=AA=85=EB=A0=B9=EC=9D=98=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?inputCommand=20=EB=A1=9C=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BaseballGame.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 687cfa95..73afcd97 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -10,39 +10,39 @@ public void init() { isEnd = false; } - public void game() { + public void game() throws IllegalArgumentException { init(); System.out.println(GameMessageConstant.START_GAME); Scanner scanner = new Scanner(System.in); - String input; + String inputNumber; String hint; do { System.out.print(GameMessageConstant.INPUT_NUMBER); - input = scanner.next(); - hint = getHint(input); + inputNumber = scanner.next(); + hint = getHint(inputNumber); System.out.println(hint); } while (!isEnd); System.out.println(GameMessageConstant.GAME_CLEAR); } - public void run() { + public void run() throws IllegalArgumentException { Scanner scanner = new Scanner(System.in); - String input; + String inputCommand; while (true) { game(); System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); - input = scanner.next(); - if (input.equals(String.valueOf(GameConstant.END_GAME_NUMBER))) { + inputCommand = scanner.next(); + if (inputCommand.equals(String.valueOf(GameConstant.END_GAME_NUMBER))) { break; - } else if (!input.equals(String.valueOf(GameConstant.RESTART_GAME_NUMBER))) { + } else if (!inputCommand.equals(String.valueOf(GameConstant.RESTART_GAME_NUMBER))) { throw new IllegalArgumentException(); } } System.out.println(GameMessageConstant.GAME_END); } - public String getHint(String input) { - BaseBallGameResult result = computer.checkMatching(input2IntArray(input)); + private String getHint(String inputNumber) { + BaseBallGameResult result = computer.checkMatching(input2IntArray(inputNumber)); checkEnd(result); return result2Hint(result); } @@ -53,10 +53,10 @@ private void checkEnd(BaseBallGameResult result) { } } - private int[] input2IntArray(String input) { + private int[] input2IntArray(String inputNumber) { int[] guess = new int[GameConstant.NUMBER_COUNT]; for (int i = 0; i < GameConstant.NUMBER_COUNT; i++) { - guess[i] = Character.getNumericValue(input.charAt(i)); + guess[i] = Character.getNumericValue(inputNumber.charAt(i)); } return guess; } From 3e522d6dbb00b32bce34f73f955934366c0776a4 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:33:47 +0900 Subject: [PATCH 12/26] =?UTF-8?q?docs=20README:=20IllegalArgumentException?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4ba12af0..104ee038 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ - [x] 낫싱 : 같은 수가 전혀 없을 때 - [x] 힌트 출력하기 - [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 + - [x] 게임 종료후, 재시작을 물어볼 때 1, 2 외에 잘못한 값을 입력했을 때 + - [ ] 게임 중, 세자리 숫자를 잘못 입력 했을 때 - [x] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 ### 테스트 목록 From aadce0f24516092d097039a3608d0e44a070989e Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:36:11 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat=20BaseballGame:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?`IllegalArgumentException`=20=EB=B0=9C=EC=83=9D=EC=8B=9C?= =?UTF-8?q?=ED=82=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/BaseballGame.java | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 104ee038..6fdff80d 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ - [x] 볼 : 같은 수가 다른 자리에 있을 때 - [x] 낫싱 : 같은 수가 전혀 없을 때 - [x] 힌트 출력하기 -- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 +- [x] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생시키기 - [x] 게임 종료후, 재시작을 물어볼 때 1, 2 외에 잘못한 값을 입력했을 때 - - [ ] 게임 중, 세자리 숫자를 잘못 입력 했을 때 + - [x] 게임 중, 세자리 숫자를 잘못 입력 했을 때 - [x] 사용자가 수를 맞췄을 때, 게임을 다시 할 건지 물어보기 ### 테스트 목록 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 73afcd97..a4fe8c2e 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -1,4 +1,7 @@ +import java.util.HashSet; import java.util.Scanner; +import java.util.Set; +import java.util.regex.Pattern; public class BaseballGame { @@ -19,6 +22,7 @@ public void game() throws IllegalArgumentException { do { System.out.print(GameMessageConstant.INPUT_NUMBER); inputNumber = scanner.next(); + checkInput(inputNumber); hint = getHint(inputNumber); System.out.println(hint); } while (!isEnd); @@ -47,6 +51,25 @@ private String getHint(String inputNumber) { return result2Hint(result); } + private void checkInput(String inputNumber) throws IllegalArgumentException { + if (!checkTreeDigitNumber(inputNumber) || !checkDuplicateNumber(inputNumber)) { + throw new IllegalArgumentException(); + } + } + + private boolean checkTreeDigitNumber(String inputNumber) { + String TREE_DIGIT_REGEX = "^[0-9]{3}$"; + return Pattern.compile(TREE_DIGIT_REGEX).matcher(inputNumber).matches(); + } + + private boolean checkDuplicateNumber(String inputNumber) { + Set chars = new HashSet<>(); + for (char c : inputNumber.toCharArray()) { + chars.add(c); + } + return chars.size() == GameConstant.NUMBER_COUNT; + } + private void checkEnd(BaseBallGameResult result) { if (result.strike() == GameConstant.NUMBER_COUNT) { isEnd = true; From f4db7cdc9fc5d042841dab6afae48e4f93a79248 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:38:04 +0900 Subject: [PATCH 14/26] =?UTF-8?q?refactor:=20"BaseballGame"=20=ED=98=B8?= =?UTF-8?q?=EC=B9=AD=EC=9D=84=20"Game"=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Baseball 접미사를 앞에다 다 붙이는건 길어지는 것 같아서 변경 --- src/main/java/Application.java | 4 ++-- src/main/java/BaseBallGameResult.java | 3 --- src/main/java/{BaseballGame.java => Game.java} | 12 ++++++------ src/main/java/GameResult.java | 3 +++ src/main/java/Player.java | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/BaseBallGameResult.java rename src/main/java/{BaseballGame.java => Game.java} (89%) create mode 100644 src/main/java/GameResult.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 809cda5f..48e807aa 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,7 +1,7 @@ public class Application { public static void main(String[] args) { - BaseballGame baseballGame = new BaseballGame(); - baseballGame.run(); + Game game = new Game(); + game.run(); } } diff --git a/src/main/java/BaseBallGameResult.java b/src/main/java/BaseBallGameResult.java deleted file mode 100644 index c24136cc..00000000 --- a/src/main/java/BaseBallGameResult.java +++ /dev/null @@ -1,3 +0,0 @@ -public record BaseBallGameResult(int ball, int strike) { - -} \ No newline at end of file diff --git a/src/main/java/BaseballGame.java b/src/main/java/Game.java similarity index 89% rename from src/main/java/BaseballGame.java rename to src/main/java/Game.java index a4fe8c2e..3695f305 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/Game.java @@ -3,7 +3,7 @@ import java.util.Set; import java.util.regex.Pattern; -public class BaseballGame { +public class Game { Player computer; boolean isEnd; @@ -46,18 +46,18 @@ public void run() throws IllegalArgumentException { } private String getHint(String inputNumber) { - BaseBallGameResult result = computer.checkMatching(input2IntArray(inputNumber)); + GameResult result = computer.checkMatching(input2IntArray(inputNumber)); checkEnd(result); return result2Hint(result); } private void checkInput(String inputNumber) throws IllegalArgumentException { - if (!checkTreeDigitNumber(inputNumber) || !checkDuplicateNumber(inputNumber)) { + if (!checkThreeDigitNumber(inputNumber) || !checkDuplicateNumber(inputNumber)) { throw new IllegalArgumentException(); } } - private boolean checkTreeDigitNumber(String inputNumber) { + private boolean checkThreeDigitNumber(String inputNumber) { String TREE_DIGIT_REGEX = "^[0-9]{3}$"; return Pattern.compile(TREE_DIGIT_REGEX).matcher(inputNumber).matches(); } @@ -70,7 +70,7 @@ private boolean checkDuplicateNumber(String inputNumber) { return chars.size() == GameConstant.NUMBER_COUNT; } - private void checkEnd(BaseBallGameResult result) { + private void checkEnd(GameResult result) { if (result.strike() == GameConstant.NUMBER_COUNT) { isEnd = true; } @@ -84,7 +84,7 @@ private int[] input2IntArray(String inputNumber) { return guess; } - private String result2Hint(BaseBallGameResult result) { + private String result2Hint(GameResult result) { if (result.ball() == 0 && result.strike() == 0) { return GameMessageConstant.NOTHING; } diff --git a/src/main/java/GameResult.java b/src/main/java/GameResult.java new file mode 100644 index 00000000..fd49f0e2 --- /dev/null +++ b/src/main/java/GameResult.java @@ -0,0 +1,3 @@ +public record GameResult(int ball, int strike) { + +} \ No newline at end of file diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 0072e941..77340fce 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -28,10 +28,10 @@ private int createRandomNumber() { return random.nextInt(10); } - public BaseBallGameResult checkMatching(int[] guess) { + public GameResult checkMatching(int[] guess) { int ball = checkBall(guess); int strike = checkStrike(guess); - return new BaseBallGameResult(ball, strike); + return new GameResult(ball, strike); } private int checkBall(int[] guess) { From 72fbdbbe7b4271d0b40a41620a11c71f709ebc90 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:47:01 +0900 Subject: [PATCH 15/26] =?UTF-8?q?refactor=20Game=20Validation:=20Game=20cl?= =?UTF-8?q?ass=EC=9D=98=20=EC=88=AB=EC=9E=90=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20=EB=B6=80=EB=B6=84=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Game.java | 23 ++++------------------- src/main/java/Validation.java | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 src/main/java/Validation.java diff --git a/src/main/java/Game.java b/src/main/java/Game.java index 3695f305..9d05f37d 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -1,7 +1,4 @@ -import java.util.HashSet; import java.util.Scanner; -import java.util.Set; -import java.util.regex.Pattern; public class Game { @@ -22,7 +19,7 @@ public void game() throws IllegalArgumentException { do { System.out.print(GameMessageConstant.INPUT_NUMBER); inputNumber = scanner.next(); - checkInput(inputNumber); + checkInputNumber(inputNumber); hint = getHint(inputNumber); System.out.println(hint); } while (!isEnd); @@ -51,25 +48,13 @@ private String getHint(String inputNumber) { return result2Hint(result); } - private void checkInput(String inputNumber) throws IllegalArgumentException { - if (!checkThreeDigitNumber(inputNumber) || !checkDuplicateNumber(inputNumber)) { + private void checkInputNumber(String inputNumber) throws IllegalArgumentException { + if (!Validation.checkThreeDigitNumber(inputNumber) || !Validation.checkDuplicateNumber( + inputNumber)) { throw new IllegalArgumentException(); } } - private boolean checkThreeDigitNumber(String inputNumber) { - String TREE_DIGIT_REGEX = "^[0-9]{3}$"; - return Pattern.compile(TREE_DIGIT_REGEX).matcher(inputNumber).matches(); - } - - private boolean checkDuplicateNumber(String inputNumber) { - Set chars = new HashSet<>(); - for (char c : inputNumber.toCharArray()) { - chars.add(c); - } - return chars.size() == GameConstant.NUMBER_COUNT; - } - private void checkEnd(GameResult result) { if (result.strike() == GameConstant.NUMBER_COUNT) { isEnd = true; diff --git a/src/main/java/Validation.java b/src/main/java/Validation.java new file mode 100644 index 00000000..24ba14eb --- /dev/null +++ b/src/main/java/Validation.java @@ -0,0 +1,20 @@ +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +public final class Validation { + + static final String TREE_DIGIT_REGEX = "^[0-9]{3}$"; + + public static boolean checkThreeDigitNumber(String inputNumber) { + return Pattern.compile(TREE_DIGIT_REGEX).matcher(inputNumber).matches(); + } + + public static boolean checkDuplicateNumber(String inputNumber) { + Set chars = new HashSet<>(); + for (char c : inputNumber.toCharArray()) { + chars.add(c); + } + return chars.size() == GameConstant.NUMBER_COUNT; + } +} From b708ce52c045688fc9dda685dd155657935d39d3 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:54:03 +0900 Subject: [PATCH 16/26] =?UTF-8?q?refactor=20Game=20Validation:=20Game=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EB=81=9D=EB=82=B4?= =?UTF-8?q?=EB=8A=94=20=EB=AA=85=EB=A0=B9=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EA=B1=B8=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20Validation=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Game.java | 8 +++----- src/main/java/Validation.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/Game.java b/src/main/java/Game.java index 9d05f37d..14b172f8 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -29,16 +29,14 @@ public void game() throws IllegalArgumentException { public void run() throws IllegalArgumentException { Scanner scanner = new Scanner(System.in); String inputCommand; - while (true) { + do { game(); System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); inputCommand = scanner.next(); - if (inputCommand.equals(String.valueOf(GameConstant.END_GAME_NUMBER))) { - break; - } else if (!inputCommand.equals(String.valueOf(GameConstant.RESTART_GAME_NUMBER))) { + if (Validation.checkEndCommand(inputCommand)) { throw new IllegalArgumentException(); } - } + } while (Integer.parseInt(inputCommand) != GameConstant.END_GAME_NUMBER); System.out.println(GameMessageConstant.GAME_END); } diff --git a/src/main/java/Validation.java b/src/main/java/Validation.java index 24ba14eb..3d207c91 100644 --- a/src/main/java/Validation.java +++ b/src/main/java/Validation.java @@ -5,6 +5,7 @@ public final class Validation { static final String TREE_DIGIT_REGEX = "^[0-9]{3}$"; + static final String ONE_DIGIT_REGEX = "^[0-9]{1}$"; public static boolean checkThreeDigitNumber(String inputNumber) { return Pattern.compile(TREE_DIGIT_REGEX).matcher(inputNumber).matches(); @@ -17,4 +18,13 @@ public static boolean checkDuplicateNumber(String inputNumber) { } return chars.size() == GameConstant.NUMBER_COUNT; } + + public static boolean checkEndCommand(String inputCommand) { + if (!Pattern.compile(ONE_DIGIT_REGEX).matcher(inputCommand).matches()) { + return false; + } + int command = Integer.parseInt(inputCommand); + return command == GameConstant.END_GAME_NUMBER + || command == GameConstant.RESTART_GAME_NUMBER; + } } From 875870c83b3586738ec76f8ffa602a6d4e014505 Mon Sep 17 00:00:00 2001 From: doyooon Date: Sun, 5 May 2024 23:56:49 +0900 Subject: [PATCH 17/26] =?UTF-8?q?refactor=20Game:=20=20run,=20init,=20game?= =?UTF-8?q?=20=EC=88=9C=EC=9C=BC=EB=A1=9C=20=ED=95=A8=EC=88=98=20=EC=88=9C?= =?UTF-8?q?=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/Game.java | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/Game.java b/src/main/java/Game.java index 14b172f8..aa2e805e 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -5,6 +5,20 @@ public class Game { Player computer; boolean isEnd; + public void run() throws IllegalArgumentException { + Scanner scanner = new Scanner(System.in); + String inputCommand; + do { + game(); + System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); + inputCommand = scanner.next(); + if (Validation.checkEndCommand(inputCommand)) { + throw new IllegalArgumentException(); + } + } while (Integer.parseInt(inputCommand) != GameConstant.END_GAME_NUMBER); + System.out.println(GameMessageConstant.GAME_END); + } + public void init() { computer = new Player(); isEnd = false; @@ -26,20 +40,6 @@ public void game() throws IllegalArgumentException { System.out.println(GameMessageConstant.GAME_CLEAR); } - public void run() throws IllegalArgumentException { - Scanner scanner = new Scanner(System.in); - String inputCommand; - do { - game(); - System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); - inputCommand = scanner.next(); - if (Validation.checkEndCommand(inputCommand)) { - throw new IllegalArgumentException(); - } - } while (Integer.parseInt(inputCommand) != GameConstant.END_GAME_NUMBER); - System.out.println(GameMessageConstant.GAME_END); - } - private String getHint(String inputNumber) { GameResult result = computer.checkMatching(input2IntArray(inputNumber)); checkEnd(result); From a8c7b31c2600daaad46a77a1a456b0a0dedacd36 Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 00:03:24 +0900 Subject: [PATCH 18/26] =?UTF-8?q?refactor=20Game=20Hint:=20Hint=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EC=9D=84=20Hint=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Game.java | 38 +++++++------------------------------- src/main/java/Hint.java | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 src/main/java/Hint.java diff --git a/src/main/java/Game.java b/src/main/java/Game.java index aa2e805e..edbb9ad6 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -29,21 +29,23 @@ public void game() throws IllegalArgumentException { System.out.println(GameMessageConstant.START_GAME); Scanner scanner = new Scanner(System.in); String inputNumber; - String hint; + GameResult result; + Hint hint; do { System.out.print(GameMessageConstant.INPUT_NUMBER); inputNumber = scanner.next(); checkInputNumber(inputNumber); - hint = getHint(inputNumber); - System.out.println(hint); + result = getResult(inputNumber); + hint = new Hint(result); + System.out.println(hint.getHint()); } while (!isEnd); System.out.println(GameMessageConstant.GAME_CLEAR); } - private String getHint(String inputNumber) { + private GameResult getResult(String inputNumber) { GameResult result = computer.checkMatching(input2IntArray(inputNumber)); checkEnd(result); - return result2Hint(result); + return result; } private void checkInputNumber(String inputNumber) throws IllegalArgumentException { @@ -67,30 +69,4 @@ private int[] input2IntArray(String inputNumber) { return guess; } - private String result2Hint(GameResult result) { - if (result.ball() == 0 && result.strike() == 0) { - return GameMessageConstant.NOTHING; - } - if (result.ball() == 0) { - return strike2String(result.strike()); - } - if (result.strike() == 0) { - return ball2String(result.ball()); - } - return ball2String(result.ball()) + " " + strike2String(result.strike()); - } - - private String ball2String(int ball) { - if (ball > 0) { - return String.format("%d%s", ball, GameMessageConstant.BALL); - } - return ""; - } - - private String strike2String(int strike) { - if (strike > 0) { - return String.format("%d%s", strike, GameMessageConstant.STRIKE); - } - return ""; - } } diff --git a/src/main/java/Hint.java b/src/main/java/Hint.java new file mode 100644 index 00000000..13afc312 --- /dev/null +++ b/src/main/java/Hint.java @@ -0,0 +1,35 @@ +public class Hint { + + GameResult result; + + public Hint(GameResult result) { + this.result = result; + } + + public String getHint() { + if (result.ball() == 0 && result.strike() == 0) { + return GameMessageConstant.NOTHING; + } + if (result.ball() == 0) { + return strike2String(result.strike()); + } + if (result.strike() == 0) { + return ball2String(result.ball()); + } + return ball2String(result.ball()) + " " + strike2String(result.strike()); + } + + private String ball2String(int ball) { + if (ball > 0) { + return String.format("%d%s", ball, GameMessageConstant.BALL); + } + return ""; + } + + private String strike2String(int strike) { + if (strike > 0) { + return String.format("%d%s", strike, GameMessageConstant.STRIKE); + } + return ""; + } +} From 489e4b1a9c027df6b2f59d7540036b4402ea302e Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 00:06:24 +0900 Subject: [PATCH 19/26] =?UTF-8?q?refactor=20constant:=20Constant=20class?= =?UTF-8?q?=EB=A5=BC=20constant=20package=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Game.java | 2 ++ src/main/java/GameConstant.java | 6 ------ src/main/java/GameMessageConstant.java | 13 ------------- src/main/java/Hint.java | 2 ++ src/main/java/Player.java | 1 + src/main/java/Validation.java | 1 + src/main/java/constant/GameConstant.java | 8 ++++++++ src/main/java/constant/GameMessageConstant.java | 16 ++++++++++++++++ 8 files changed, 30 insertions(+), 19 deletions(-) delete mode 100644 src/main/java/GameConstant.java delete mode 100644 src/main/java/GameMessageConstant.java create mode 100644 src/main/java/constant/GameConstant.java create mode 100644 src/main/java/constant/GameMessageConstant.java diff --git a/src/main/java/Game.java b/src/main/java/Game.java index edbb9ad6..5ac70712 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -1,3 +1,5 @@ +import constant.GameConstant; +import constant.GameMessageConstant; import java.util.Scanner; public class Game { diff --git a/src/main/java/GameConstant.java b/src/main/java/GameConstant.java deleted file mode 100644 index 69861777..00000000 --- a/src/main/java/GameConstant.java +++ /dev/null @@ -1,6 +0,0 @@ -public final class GameConstant { - - static final int NUMBER_COUNT = 3; - static final int RESTART_GAME_NUMBER = 1; - static final int END_GAME_NUMBER = 2; -} diff --git a/src/main/java/GameMessageConstant.java b/src/main/java/GameMessageConstant.java deleted file mode 100644 index fe47cd91..00000000 --- a/src/main/java/GameMessageConstant.java +++ /dev/null @@ -1,13 +0,0 @@ -public final class GameMessageConstant { - - static final String BALL = "볼"; - static final String STRIKE = "스트라이크"; - static final String NOTHING = "낫싱"; - static final String START_GAME = "숫자 야구 게임을 시작합니다. 제가 생각한 숫자를 맞춰보세요!\n"; - static final String INPUT_NUMBER = "숫자를 입력해주세요 : "; - static final String GAME_CLEAR = String.format("%d개의 숫자를 정확히 맞히셨습니다! 축하드립니다.", - GameConstant.NUMBER_COUNT); - static final String GAME_RESTART_QUESTION = String.format("게임을 새로 시작하려면 %d, 종료하려면 %d를 입력하세요.", - GameConstant.RESTART_GAME_NUMBER, GameConstant.END_GAME_NUMBER); - static final String GAME_END = "게임을 종료합니다."; -} diff --git a/src/main/java/Hint.java b/src/main/java/Hint.java index 13afc312..77303093 100644 --- a/src/main/java/Hint.java +++ b/src/main/java/Hint.java @@ -1,3 +1,5 @@ +import constant.GameMessageConstant; + public class Hint { GameResult result; diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 77340fce..2f46fc53 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,3 +1,4 @@ +import constant.GameConstant; import java.util.HashSet; import java.util.Random; import java.util.Set; diff --git a/src/main/java/Validation.java b/src/main/java/Validation.java index 3d207c91..8439ffe1 100644 --- a/src/main/java/Validation.java +++ b/src/main/java/Validation.java @@ -1,3 +1,4 @@ +import constant.GameConstant; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; diff --git a/src/main/java/constant/GameConstant.java b/src/main/java/constant/GameConstant.java new file mode 100644 index 00000000..38b95b3a --- /dev/null +++ b/src/main/java/constant/GameConstant.java @@ -0,0 +1,8 @@ +package constant; + +public final class GameConstant { + + public static final int NUMBER_COUNT = 3; + public static final int RESTART_GAME_NUMBER = 1; + public static final int END_GAME_NUMBER = 2; +} diff --git a/src/main/java/constant/GameMessageConstant.java b/src/main/java/constant/GameMessageConstant.java new file mode 100644 index 00000000..10ee1169 --- /dev/null +++ b/src/main/java/constant/GameMessageConstant.java @@ -0,0 +1,16 @@ +package constant; + +public final class GameMessageConstant { + + public static final String BALL = "볼"; + public static final String STRIKE = "스트라이크"; + public static final String NOTHING = "낫싱"; + public static final String START_GAME = "숫자 야구 게임을 시작합니다. 제가 생각한 숫자를 맞춰보세요!\n"; + public static final String INPUT_NUMBER = "숫자를 입력해주세요 : "; + public static final String GAME_CLEAR = String.format("%d개의 숫자를 정확히 맞히셨습니다! 축하드립니다.", + GameConstant.NUMBER_COUNT); + public static final String GAME_RESTART_QUESTION = String.format( + "게임을 새로 시작하려면 %d, 종료하려면 %d를 입력하세요.", + GameConstant.RESTART_GAME_NUMBER, GameConstant.END_GAME_NUMBER); + public static final String GAME_END = "게임을 종료합니다."; +} From a932c5c8c1438c2fec596faa18e692655f103a51 Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 00:07:33 +0900 Subject: [PATCH 20/26] =?UTF-8?q?refactor=20GameResult:=20GameResult?= =?UTF-8?q?=EB=A5=BC=20data=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Game.java | 1 + src/main/java/Hint.java | 1 + src/main/java/Player.java | 1 + src/main/java/{ => data}/GameResult.java | 2 ++ 4 files changed, 5 insertions(+) rename src/main/java/{ => data}/GameResult.java (77%) diff --git a/src/main/java/Game.java b/src/main/java/Game.java index 5ac70712..e827d526 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -1,5 +1,6 @@ import constant.GameConstant; import constant.GameMessageConstant; +import data.GameResult; import java.util.Scanner; public class Game { diff --git a/src/main/java/Hint.java b/src/main/java/Hint.java index 77303093..e8ff97a1 100644 --- a/src/main/java/Hint.java +++ b/src/main/java/Hint.java @@ -1,4 +1,5 @@ import constant.GameMessageConstant; +import data.GameResult; public class Hint { diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 2f46fc53..e1363519 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,4 +1,5 @@ import constant.GameConstant; +import data.GameResult; import java.util.HashSet; import java.util.Random; import java.util.Set; diff --git a/src/main/java/GameResult.java b/src/main/java/data/GameResult.java similarity index 77% rename from src/main/java/GameResult.java rename to src/main/java/data/GameResult.java index fd49f0e2..00c125fa 100644 --- a/src/main/java/GameResult.java +++ b/src/main/java/data/GameResult.java @@ -1,3 +1,5 @@ +package data; + public record GameResult(int ball, int strike) { } \ No newline at end of file From 28c84d33bcede5a569fadaef99027614558cfa28 Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 00:20:30 +0900 Subject: [PATCH 21/26] =?UTF-8?q?docs=20README:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=8F=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6fdff80d..899d6b72 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ - [ ] 숫자가 아닌 값을 입력했을 때 - [ ] 3자리가 아닌 숫자를 입력했을 때 - [ ] 같은 숫자 여러개를 입력했을 때 + - [ ] 종료할 때, 1과 2 외에 다른 값을 입력했을 때 - [ ] 힌트 확인하기 - [ ] 스트라이크 - [ ] 볼 From 6ad9f06f54408b8b8b8c9b0a388fbfeed410fe0b Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 12:20:02 +0900 Subject: [PATCH 22/26] =?UTF-8?q?test=20Validation:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?Validation=20Class=20=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=90=98=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++------ src/test/java/ValidationTest.java | 53 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 src/test/java/ValidationTest.java diff --git a/README.md b/README.md index 899d6b72..a832ff31 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ ### 테스트 목록 - [ ] 랜덤 3자리수를 생성하는지 확인 - - [ ] 3자리 숫자를 생성하는지 확인 -- [ ] 사용자가 잘못된 값을 입력한 경우 `IllegalArgumentException` 발생하는 지 확인 - - [ ] 숫자가 아닌 값을 입력했을 때 - - [ ] 3자리가 아닌 숫자를 입력했을 때 - - [ ] 같은 숫자 여러개를 입력했을 때 - - [ ] 종료할 때, 1과 2 외에 다른 값을 입력했을 때 + - [ ] 3자리 숫자를 생성하는지 확인 +- [x] 사용자가 잘못된 값을 입력한 경우 Validation Class 에서 검증 되는지 확인 + - [x] 숫자가 아닌 값을 입력했을 때 + - [x] 3자리가 아닌 숫자를 입력했을 때 + - [x] 같은 숫자 여러개를 입력했을 때 + - [x] 종료할 때, 1과 2 외에 다른 값을 입력했을 때 - [ ] 힌트 확인하기 - - [ ] 스트라이크 - - [ ] 볼 - - [ ] 낫싱 + - [ ] 스트라이크 + - [ ] 볼 + - [ ] 낫싱 diff --git a/src/test/java/ValidationTest.java b/src/test/java/ValidationTest.java new file mode 100644 index 00000000..6f97df53 --- /dev/null +++ b/src/test/java/ValidationTest.java @@ -0,0 +1,53 @@ +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class ValidationTest { + + @Test + void checkThreeDigitNumber_rightInput_true() { + assertTrue(Validation.checkThreeDigitNumber("136")); + assertTrue(Validation.checkThreeDigitNumber("111")); + } + + @Test + void checkThreeDigitNumber_wrongLengthInput_false() { + assertFalse(Validation.checkThreeDigitNumber("14")); + assertFalse(Validation.checkThreeDigitNumber("")); + assertFalse(Validation.checkThreeDigitNumber("6789")); + } + + @Test + void checkThreeDigitNumber_notNumberInput_false() { + assertFalse(Validation.checkThreeDigitNumber("1a2")); + assertFalse(Validation.checkThreeDigitNumber("14*")); + assertFalse(Validation.checkThreeDigitNumber("9$0")); + } + + @Test + void checkDuplicateNumber_rightInput_true() { + assertTrue(Validation.checkDuplicateNumber("136")); + assertTrue(Validation.checkDuplicateNumber("567")); + } + + @Test + void checkDuplicateNumber_duplicateInput_false() { + assertFalse(Validation.checkDuplicateNumber("118")); + assertFalse(Validation.checkDuplicateNumber("399")); + assertFalse(Validation.checkDuplicateNumber("080")); + } + + @Test + void checkEndCommand_rightInput_true() { + assertTrue(Validation.checkEndCommand("1")); + assertTrue(Validation.checkEndCommand("2")); + } + + @Test + void checkEndCommand_otherInput_false() { + assertFalse(Validation.checkEndCommand("0")); + assertFalse(Validation.checkEndCommand("a")); + assertFalse(Validation.checkEndCommand("4")); + } +} \ No newline at end of file From 4b959c24aa70e0cf04ab86e06d20805f67f5a1de Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 12:27:12 +0900 Subject: [PATCH 23/26] =?UTF-8?q?test=20Hint:=20strike=EC=99=80=20ball?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=A0=81=EC=A0=88=ED=95=9C=20?= =?UTF-8?q?Hint=20String=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- src/test/java/HintTest.java | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/test/java/HintTest.java diff --git a/README.md b/README.md index a832ff31..d87cc3f0 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ - [x] 3자리가 아닌 숫자를 입력했을 때 - [x] 같은 숫자 여러개를 입력했을 때 - [x] 종료할 때, 1과 2 외에 다른 값을 입력했을 때 -- [ ] 힌트 확인하기 - - [ ] 스트라이크 - - [ ] 볼 - - [ ] 낫싱 +- [x] strike와 ball에 따라 적절한 Hint String을 반환하는지 확인 + - [x] 스트라이크 + - [x] 볼 + - [x] 낫싱 diff --git a/src/test/java/HintTest.java b/src/test/java/HintTest.java new file mode 100644 index 00000000..03842eb6 --- /dev/null +++ b/src/test/java/HintTest.java @@ -0,0 +1,38 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; + +import constant.GameMessageConstant; +import data.GameResult; +import org.junit.jupiter.api.Test; + +class HintTest { + + @Test + void getHint_nothing() { + Hint hint = new Hint(new GameResult(0, 0)); + assertEquals(hint.getHint(), GameMessageConstant.NOTHING); + } + + @Test + void getHint_onlyBall() { + int ball = 1; + Hint hint = new Hint(new GameResult(ball, 0)); + assertEquals(hint.getHint(), String.format("%d%s", ball, GameMessageConstant.BALL)); + } + + @Test + void getHint_onlyStrike() { + int strike = 3; + Hint hint = new Hint(new GameResult(0, strike)); + assertEquals(hint.getHint(), String.format("%d%s", strike, GameMessageConstant.STRIKE)); + } + + @Test + void getHint_ballAndStrike() { + int ball = 1; + int strike = 1; + Hint hint = new Hint(new GameResult(ball, strike)); + assertEquals(hint.getHint(), + String.format("%d%s %d%s", ball, GameMessageConstant.BALL, strike, + GameMessageConstant.STRIKE)); + } +} \ No newline at end of file From 9a399ddcb7ad8ae1748da9988a9f95d7c40ae3ea Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 12:49:12 +0900 Subject: [PATCH 24/26] =?UTF-8?q?refactor=20Player:=20=EB=9E=9C=EB=8D=A4?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=83=9D=EC=84=B1=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EB=94=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Player.java | 19 ++++-------------- src/main/java/RandomNumberGenerator.java | 25 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 src/main/java/RandomNumberGenerator.java diff --git a/src/main/java/Player.java b/src/main/java/Player.java index e1363519..337c6f13 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,12 +1,11 @@ import constant.GameConstant; import data.GameResult; import java.util.HashSet; -import java.util.Random; import java.util.Set; public class Player { - private final int[] answer = new int[GameConstant.NUMBER_COUNT]; + private int[] answer = new int[GameConstant.NUMBER_COUNT]; Set numbers = new HashSet<>(); public Player() { @@ -14,22 +13,12 @@ public Player() { } private void createRandomAnswer() { - numbers.clear(); - while (numbers.size() < GameConstant.NUMBER_COUNT) { - int number = createRandomNumber(); - numbers.add(number); - } - int index = 0; - for (int number : numbers) { - answer[index++] = number; + answer = RandomNumberGenerator.generate(GameConstant.NUMBER_COUNT); + for (int i = 0; i < GameConstant.NUMBER_COUNT; i++) { + numbers.add(answer[i]); } } - private int createRandomNumber() { - Random random = new Random(); - return random.nextInt(10); - } - public GameResult checkMatching(int[] guess) { int ball = checkBall(guess); int strike = checkStrike(guess); diff --git a/src/main/java/RandomNumberGenerator.java b/src/main/java/RandomNumberGenerator.java new file mode 100644 index 00000000..8423f873 --- /dev/null +++ b/src/main/java/RandomNumberGenerator.java @@ -0,0 +1,25 @@ +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +public class RandomNumberGenerator { + + public static int[] generate(int length) { + int[] result = new int[length]; + Set numbers = new HashSet<>(); + while (numbers.size() < length) { + int number = createRandomNumber(); + numbers.add(number); + } + int index = 0; + for (int number : numbers) { + result[index++] = number; + } + return result; + } + + private static int createRandomNumber() { + Random random = new Random(); + return random.nextInt(10); + } +} From d8762139d57522b6de86ab35220ebe1e26401e70 Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 12:49:38 +0900 Subject: [PATCH 25/26] =?UTF-8?q?fix=20Game:=20End=20Command=20if=EB=AC=B8?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=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/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Game.java b/src/main/java/Game.java index e827d526..faa43407 100644 --- a/src/main/java/Game.java +++ b/src/main/java/Game.java @@ -15,7 +15,7 @@ public void run() throws IllegalArgumentException { game(); System.out.println(GameMessageConstant.GAME_RESTART_QUESTION); inputCommand = scanner.next(); - if (Validation.checkEndCommand(inputCommand)) { + if (!Validation.checkEndCommand(inputCommand)) { throw new IllegalArgumentException(); } } while (Integer.parseInt(inputCommand) != GameConstant.END_GAME_NUMBER); From 608c81f9b1ddadf3eef03106aa32cb8d17a4ccf0 Mon Sep 17 00:00:00 2001 From: doyooon Date: Mon, 6 May 2024 12:55:19 +0900 Subject: [PATCH 26/26] =?UTF-8?q?test=20RandomNumberGenerator:=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=203=EC=9E=90=EB=A6=AC=EC=88=98=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EB=8C=80=EB=A1=9C=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++-- src/test/java/RandomNumberGeneratorTest.java | 27 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/test/java/RandomNumberGeneratorTest.java diff --git a/README.md b/README.md index d87cc3f0..7b0fc39e 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,9 @@ ### 테스트 목록 -- [ ] 랜덤 3자리수를 생성하는지 확인 - - [ ] 3자리 숫자를 생성하는지 확인 +- [x] 랜덤 3자리수를 생성하는지 확인 + - [x] 3자리 숫자를 생성하는지 확인 + - [x] 중복이 없는 숫자를 생성하는지 확인 - [x] 사용자가 잘못된 값을 입력한 경우 Validation Class 에서 검증 되는지 확인 - [x] 숫자가 아닌 값을 입력했을 때 - [x] 3자리가 아닌 숫자를 입력했을 때 diff --git a/src/test/java/RandomNumberGeneratorTest.java b/src/test/java/RandomNumberGeneratorTest.java new file mode 100644 index 00000000..ac1e204c --- /dev/null +++ b/src/test/java/RandomNumberGeneratorTest.java @@ -0,0 +1,27 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashSet; +import java.util.Set; +import org.junit.jupiter.api.Test; + +class RandomNumberGeneratorTest { + + @Test + void generate_lengthCheck_true() { + int length = 3; + int[] result = RandomNumberGenerator.generate(length); + assertEquals(result.length, length); + } + + @Test + void generate_duplicateCheck_true() { + int length = 3; + Set numbers = new HashSet<>(); + int[] result = RandomNumberGenerator.generate(length); + for (int i : result) { + numbers.add(i); + } + assertEquals(numbers.size(), length); + } + +} \ No newline at end of file