From 5e5ff7e11d2317516a5ab6b3f85d5387ea3aa378 Mon Sep 17 00:00:00 2001 From: Haebin Date: Thu, 19 Oct 2023 16:55:27 +0900 Subject: [PATCH 01/63] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=B5=9C=EC=B4=88=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..835a460 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,31 @@ +# πŸ“  Precourse-Week1 Mission **[숫자 야ꡬ]** + +## ✨  ν΄λž˜μŠ€ 및 κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ + +| 클래슀 | κ΅¬ν˜„ κΈ°λŠ₯ | +|:--------------------------:|:------------------:| +| [πŸ–₯️ Computer](#-computer) | 숫자둜 랜덀으둜 λ½‘λŠ” κΈ°λŠ₯ | +| [🧝 Player](#-player) | 숫자λ₯Ό μž…λ ₯ν•  μœ μ € κΈ°λŠ₯ | +| [πŸ› οΈ System](#-system) | κ²Œμž„μ„ μ§„ν–‰ν•˜λŠ” 메인 μ‹œμŠ€ν…œ κΈ°λŠ₯ | + +--- + +## μ„ΈλΆ€ λ©”μ†Œλ“œ κ΅¬ν˜„ λͺ©λ‘ +### πŸ–₯ Computer +- `1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. + +### 🧝 Player +- `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. + +### πŸ›  System +- μž…λ ₯κ°’ 검증 + - μž…λ ₯값이 μ„Έ 자리둜 μž…λ ₯λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ 검증 (throw ...) + - 같은 숫자 쀑볡 μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) + - λ¬Έμžμ—΄ μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) + +- 좜λ ₯ 및 κ²Œμž„ μ’…λ£Œ + - λ³Ό 갯수 μ„ΈκΈ° + - 슀트라이크 갯수 μ„ΈκΈ° + - λ‚«μ‹± μ—¬λΆ€ κ²€ν†  + - μœ νš¨ν•œ 힌트 λ„μΆœ + - 힌트 좜λ ₯ From 285df98726b4035b8afe8d24656a8cd294eeefeb Mon Sep 17 00:00:00 2001 From: Haebin Date: Thu, 19 Oct 2023 17:56:06 +0900 Subject: [PATCH 02/63] =?UTF-8?q?feat:=20Couputer=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EB=BD=91=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Computer.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/baseball/Computer.java diff --git a/src/main/java/baseball/Computer.java b/src/main/java/baseball/Computer.java new file mode 100644 index 0000000..289e60e --- /dev/null +++ b/src/main/java/baseball/Computer.java @@ -0,0 +1,20 @@ +package baseball; + +import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; +import static java.util.stream.Collectors.joining; + +import java.util.List; + +public class Computer { + + public String pickTargetNumber(int numLength) { + List pickedInteger = pickUniqueNumbersInRange(1, 9, numLength); + return convertIntegerListToString(pickedInteger); + } + + private String convertIntegerListToString(List pickedInteger) { + return pickedInteger.stream() + .map(Object::toString) + .collect(joining("")); + } +} From 87fa078bd4792240b9627b6c16fea0f3239755f1 Mon Sep 17 00:00:00 2001 From: Haebin Date: Thu, 19 Oct 2023 19:11:50 +0900 Subject: [PATCH 03/63] =?UTF-8?q?feat:=20Player=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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/Player.java | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/baseball/Player.java diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/Player.java new file mode 100644 index 0000000..597999c --- /dev/null +++ b/src/main/java/baseball/Player.java @@ -0,0 +1,38 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; + +public class Player { + + public String inputNumber(final int numLength) { + String number = Console.readLine(); + validateNumber(number); + validateNumberLength(number, numLength); + return number; + } + + private void validateNumber(final String number) { + if (number.isEmpty()) { + throw new IllegalArgumentException("number cannot be empty"); + } + if (!isValidNumber(number)) { + throw new IllegalArgumentException("number cannot contain any letters"); + } + } + + private void validateNumberLength(final String number, final int numLength) { + if (!isValidLength(number, numLength)) { + throw new IllegalArgumentException("number Length is different from the system setting"); + } + } + + private static boolean isValidLength(final String number, int numLength) { + return number.length() == numLength; + } + + private boolean isValidNumber(final String number) { + return number + .chars() + .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); + } +} From 403e53a7dbde4d38eb642f4bd98356750e6bf952 Mon Sep 17 00:00:00 2001 From: Haebin Date: Thu, 19 Oct 2023 19:25:10 +0900 Subject: [PATCH 04/63] =?UTF-8?q?feat:=20Game=20=ED=95=84=EC=88=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20(Player=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20/=20Computer=20=EB=82=9C=EC=88=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 4 +++- src/main/java/baseball/Game.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/Game.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34..1126514 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,9 @@ package baseball; public class Application { + public static void main(String[] args) { - // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ + Game game = new Game(); + game.start(); } } diff --git a/src/main/java/baseball/Game.java b/src/main/java/baseball/Game.java new file mode 100644 index 0000000..b409af1 --- /dev/null +++ b/src/main/java/baseball/Game.java @@ -0,0 +1,18 @@ +package baseball; + +public class Game { + private final static int numberLength = 3; + + public void start() { + String computerNumber, playerNumber; + + Player player = new Player(); + Computer computer = new Computer(); + + playerNumber = player.inputNumber(numberLength); + computerNumber = computer.pickTargetNumber(numberLength); + + System.out.println("computerNumber = " + computerNumber); + System.out.println("playerNumber = " + playerNumber); + } +} From cd65c41d9b893230dc4866a6957ac48c5f59f3fc Mon Sep 17 00:00:00 2001 From: Haebin Date: Thu, 19 Oct 2023 19:27:27 +0900 Subject: [PATCH 05/63] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index 835a460..a879eff 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,30 +2,37 @@ ## ✨  ν΄λž˜μŠ€ 및 κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ -| 클래슀 | κ΅¬ν˜„ κΈ°λŠ₯ | -|:--------------------------:|:------------------:| -| [πŸ–₯️ Computer](#-computer) | 숫자둜 랜덀으둜 λ½‘λŠ” κΈ°λŠ₯ | -| [🧝 Player](#-player) | 숫자λ₯Ό μž…λ ₯ν•  μœ μ € κΈ°λŠ₯ | -| [πŸ› οΈ System](#-system) | κ²Œμž„μ„ μ§„ν–‰ν•˜λŠ” 메인 μ‹œμŠ€ν…œ κΈ°λŠ₯ | +| 클래슀 | κ΅¬ν˜„ κΈ°λŠ₯ | +| :-------------------------: | :------------------------------: | +| [πŸ–₯️ Computer](#-computer) | 숫자둜 랜덀으둜 λ½‘λŠ” κΈ°λŠ₯ | +| [🧝 Player](#-player) | 숫자λ₯Ό μž…λ ₯ν•  μœ μ € κΈ°λŠ₯ | +| [πŸ› οΈ Game](#-game) | κ²Œμž„μ„ μ§„ν–‰ν•˜λŠ” 메인 μ‹œμŠ€ν…œ κΈ°λŠ₯ | --- ## μ„ΈλΆ€ λ©”μ†Œλ“œ κ΅¬ν˜„ λͺ©λ‘ + ### πŸ–₯ Computer + - `1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. ### 🧝 Player -- `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. -### πŸ›  System -- μž…λ ₯κ°’ 검증 +- `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. +- μž…λ ₯κ°’ 검증 (μ›μ‹œκ°’ 포μž₯ μˆ˜μ • μ˜ˆμ •) + - μž…λ ₯값이 μ„Έ 자리둜 μž…λ ₯λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ 검증 (throw ...) - 같은 숫자 쀑볡 μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) - λ¬Έμžμ—΄ μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) - -- 좜λ ₯ 및 κ²Œμž„ μ’…λ£Œ + +### πŸ›  Game + +- κ²Œμž„ μ§„ν–‰ κΈ°λŠ₯ + - Player 객체둜 숫자 μž…λ ₯ λ°›κΈ° + - Computer 객체둜 λ‚œμˆ˜ 생성 ν•˜κΈ° - λ³Ό 갯수 μ„ΈκΈ° - 슀트라이크 갯수 μ„ΈκΈ° - λ‚«μ‹± μ—¬λΆ€ κ²€ν†  - - μœ νš¨ν•œ 힌트 λ„μΆœ - - 힌트 좜λ ₯ + - μœ νš¨ν•œ 힌트 λ„μΆœ (뢄리 μ—¬λΆ€ κ³ λ―Ό) + - 힌트 좜λ ₯ (뢄리 μ—¬λΆ€ κ³ λ―Ό) + From 29a7d8685fda8641a62e54d8b957a93335dee459 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 19:47:49 +0900 Subject: [PATCH 06/63] =?UTF-8?q?feat:=20Hint=20=ED=95=84=EC=88=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20(=EB=B3=BC,=20?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8A=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Hint.java | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/baseball/Hint.java diff --git a/src/main/java/baseball/Hint.java b/src/main/java/baseball/Hint.java new file mode 100644 index 0000000..37509bb --- /dev/null +++ b/src/main/java/baseball/Hint.java @@ -0,0 +1,45 @@ +package baseball; + +import static baseball.Config.NUMBER_LENGTH; + +public class Hint { + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + private int strikeCount; + private int ballCount; + + public Hint updateHint(final String playerNumber, final String computerNumber) { + this.ballCount = 0; + this.strikeCount = 0; + countBallCount(playerNumber, computerNumber); + countStrikeCount(playerNumber, computerNumber); + return this; + } + + private void countStrikeCount(final String playerNumber, final String computerNumber) { + for (int i = 0; i < NUMBER_LENGTH; i++) { + if (playerNumber.charAt(i) == computerNumber.charAt(i)) { + this.strikeCount++; + } + } + } + + private void countBallCount(final String playerNumber, final String computerNumber) { + for (int i = 0; i < playerNumber.length(); i++) { + char playerDigit = playerNumber.charAt(i); + char computerDigit = computerNumber.charAt(i); + + if (playerDigit != computerDigit && computerNumber.contains( + String.valueOf(playerDigit))) { + this.ballCount++; + } + } + } +} From d5e2f95a7a48dd11592e60a5f3449f5afde2d117 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 20:27:42 +0900 Subject: [PATCH 07/63] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20breakPoint?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Game.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/Game.java b/src/main/java/baseball/Game.java index b409af1..0ee9869 100644 --- a/src/main/java/baseball/Game.java +++ b/src/main/java/baseball/Game.java @@ -1,18 +1,28 @@ package baseball; +import static baseball.Config.NUMBER_LENGTH; + public class Game { - private final static int numberLength = 3; + public void start() { String computerNumber, playerNumber; Player player = new Player(); - Computer computer = new Computer(); + ComputerNumber computer = new ComputerNumber(); + Hint hint = new Hint(); + + computerNumber = computer.pickTargetNumber(NUMBER_LENGTH); + + do { + playerNumber = player.inputNumber(NUMBER_LENGTH); - playerNumber = player.inputNumber(numberLength); - computerNumber = computer.pickTargetNumber(numberLength); + hint.reset(); + hint.updateHint(playerNumber, computerNumber); + hint.printHint(); + } while (!hint.checkClear()); + System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); + System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); - System.out.println("computerNumber = " + computerNumber); - System.out.println("playerNumber = " + playerNumber); } } From d01607dd6765badc0999b76c6a0ab71fc4f67b61 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 20:28:15 +0900 Subject: [PATCH 08/63] =?UTF-8?q?refactor:=20Constant=20=EA=B0=92=20Config?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=B6=95=EC=95=BD=20?= =?UTF-8?q?=EB=AC=B8=EB=B2=95=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/Config.java | 6 ++++++ src/main/java/baseball/Player.java | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/main/java/baseball/Config.java diff --git a/src/main/java/baseball/Config.java b/src/main/java/baseball/Config.java new file mode 100644 index 0000000..80435da --- /dev/null +++ b/src/main/java/baseball/Config.java @@ -0,0 +1,6 @@ +package baseball; + +public class Config { + + public static final int NUMBER_LENGTH = 3; +} diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/Player.java index 597999c..64fea79 100644 --- a/src/main/java/baseball/Player.java +++ b/src/main/java/baseball/Player.java @@ -4,10 +4,11 @@ public class Player { - public String inputNumber(final int numLength) { + public String inputNumber(final int numberLength) { + System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); String number = Console.readLine(); validateNumber(number); - validateNumberLength(number, numLength); + validateNumberLength(number, numberLength); return number; } @@ -22,11 +23,12 @@ private void validateNumber(final String number) { private void validateNumberLength(final String number, final int numLength) { if (!isValidLength(number, numLength)) { - throw new IllegalArgumentException("number Length is different from the system setting"); + throw new IllegalArgumentException( + "number Length is different from the system setting"); } } - private static boolean isValidLength(final String number, int numLength) { + private boolean isValidLength(final String number, int numLength) { return number.length() == numLength; } From 45e047362a744a264a5e7de0905ecf8780b3b088 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 20:29:00 +0900 Subject: [PATCH 09/63] =?UTF-8?q?feat:=20=ED=9E=8C=ED=8A=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EB=B0=98=EB=B3=B5=20=EB=A3=A8=ED=94=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Computer.java => ComputerNumber.java} | 2 +- src/main/java/baseball/Hint.java | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) rename src/main/java/baseball/{Computer.java => ComputerNumber.java} (94%) diff --git a/src/main/java/baseball/Computer.java b/src/main/java/baseball/ComputerNumber.java similarity index 94% rename from src/main/java/baseball/Computer.java rename to src/main/java/baseball/ComputerNumber.java index 289e60e..36a7154 100644 --- a/src/main/java/baseball/Computer.java +++ b/src/main/java/baseball/ComputerNumber.java @@ -5,7 +5,7 @@ import java.util.List; -public class Computer { +public class ComputerNumber { public String pickTargetNumber(int numLength) { List pickedInteger = pickUniqueNumbersInRange(1, 9, numLength); diff --git a/src/main/java/baseball/Hint.java b/src/main/java/baseball/Hint.java index 37509bb..6137eda 100644 --- a/src/main/java/baseball/Hint.java +++ b/src/main/java/baseball/Hint.java @@ -4,23 +4,34 @@ public class Hint { - public int getStrikeCount() { - return strikeCount; + private int ballCount; + private int strikeCount; + + public void reset() { + this.strikeCount = 0; + this.ballCount = 0; } - public int getBallCount() { - return ballCount; + public void updateHint(final String playerNumber, final String computerNumber) { + countStrikeCount(playerNumber, computerNumber); + countBallCount(playerNumber, computerNumber); } - private int strikeCount; - private int ballCount; + public boolean checkClear(){ + return strikeCount == NUMBER_LENGTH; + } - public Hint updateHint(final String playerNumber, final String computerNumber) { - this.ballCount = 0; - this.strikeCount = 0; - countBallCount(playerNumber, computerNumber); - countStrikeCount(playerNumber, computerNumber); - return this; + public void printHint() { + if (strikeCount == 0 && ballCount == 0) { + System.out.print("λ‚«μ‹±"); + } + if (ballCount > 0) { + System.out.print(ballCount + "λ³Ό "); + } + if (strikeCount > 0) { + System.out.print(strikeCount + "슀트라이크"); + } + System.out.println(); } private void countStrikeCount(final String playerNumber, final String computerNumber) { From 1447d6ff22d18f826b4d7e47f6e4963482354e82 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 20:36:50 +0900 Subject: [PATCH 10/63] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=A4=91=EB=B3=B5=20=EC=88=AB=EC=9E=90=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Player.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/Player.java index 64fea79..7c7d47f 100644 --- a/src/main/java/baseball/Player.java +++ b/src/main/java/baseball/Player.java @@ -19,6 +19,9 @@ private void validateNumber(final String number) { if (!isValidNumber(number)) { throw new IllegalArgumentException("number cannot contain any letters"); } + if (!isUniqueNumber(number)) { + throw new IllegalArgumentException("number cannot contain duplicated numbers"); + } } private void validateNumberLength(final String number, final int numLength) { @@ -37,4 +40,8 @@ private boolean isValidNumber(final String number) { .chars() .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); } + + private boolean isUniqueNumber(final String number) { + return number.chars().distinct().count() == number.length(); + } } From 02ff44505158a41e68bd0f30c4dfc0171c8cf033 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 20:54:13 +0900 Subject: [PATCH 11/63] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A7=84=ED=96=89=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 55 +++++++++++++++++--------------------------------- 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/docs/README.md b/docs/README.md index a879eff..0f9d7bc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,38 +1,21 @@ # πŸ“  Precourse-Week1 Mission **[숫자 야ꡬ]** -## ✨  ν΄λž˜μŠ€ 및 κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ - -| 클래슀 | κ΅¬ν˜„ κΈ°λŠ₯ | -| :-------------------------: | :------------------------------: | -| [πŸ–₯️ Computer](#-computer) | 숫자둜 랜덀으둜 λ½‘λŠ” κΈ°λŠ₯ | -| [🧝 Player](#-player) | 숫자λ₯Ό μž…λ ₯ν•  μœ μ € κΈ°λŠ₯ | -| [πŸ› οΈ Game](#-game) | κ²Œμž„μ„ μ§„ν–‰ν•˜λŠ” 메인 μ‹œμŠ€ν…œ κΈ°λŠ₯ | - ---- - -## μ„ΈλΆ€ λ©”μ†Œλ“œ κ΅¬ν˜„ λͺ©λ‘ - -### πŸ–₯ Computer - -- `1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. - -### 🧝 Player - -- `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. -- μž…λ ₯κ°’ 검증 (μ›μ‹œκ°’ 포μž₯ μˆ˜μ • μ˜ˆμ •) - - - μž…λ ₯값이 μ„Έ 자리둜 μž…λ ₯λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ 검증 (throw ...) - - 같은 숫자 쀑볡 μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) - - λ¬Έμžμ—΄ μž…λ ₯에 λŒ€ν•œ 검증 (throw ...) - -### πŸ›  Game - -- κ²Œμž„ μ§„ν–‰ κΈ°λŠ₯ - - Player 객체둜 숫자 μž…λ ₯ λ°›κΈ° - - Computer 객체둜 λ‚œμˆ˜ 생성 ν•˜κΈ° - - λ³Ό 갯수 μ„ΈκΈ° - - 슀트라이크 갯수 μ„ΈκΈ° - - λ‚«μ‹± μ—¬λΆ€ κ²€ν†  - - μœ νš¨ν•œ 힌트 λ„μΆœ (뢄리 μ—¬λΆ€ κ³ λ―Ό) - - 힌트 좜λ ₯ (뢄리 μ—¬λΆ€ κ³ λ―Ό) - +## ✨  κΈ°λŠ₯ κ΅¬ν˜„ List <ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μˆœμ„œ> + +- βœ…1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. + - βœ…μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자 3개 +- βœ…κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ : `숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.` +- βœ…μ‚¬μš©μžμ—κ²Œ `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. + - βœ…μž…λ ₯받은 input이 3μžλ¦¬κ°€ 아닐 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - βœ…μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - βœ…μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ +- βœ…μ‚¬μš©μž inputκ³Ό 랜덀 생성 μ •μˆ˜λ₯Ό 비ꡐ해 좜λ ₯ν•  힌트λ₯Ό κ³„μ‚°ν•œλ‹€. + - βœ…λ‹€λ₯Έ 자리 같은 숫자의 갯수 n개 : `nλ³Ό` + - βœ…κ°™μ€ 자리 같은 숫자 n개: `n슀트라이크` + - βœ…μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 같이 μ‘΄μž¬ν•  λ•Œ : `nλ³Ό n슀트라이크` + - βœ…κ°™μ€ μˆ«μžκ°€ 1κ°œλ„ μ—†μœΌλ©΄ : `λ‚«μ‹±` +- βŒκ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ + - ❌3슀트라이크 상황 : `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ + βŒκ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` + - βŒμ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. + - ❌3μŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. From 3cd75ee6676ba1c9bf489efef634ddafb74d2f4e Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 21:03:19 +0900 Subject: [PATCH 12/63] =?UTF-8?q?refactor=20:=20MVC=20=ED=8C=A8=ED=84=B4?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 2 ++ src/main/java/baseball/{ => config}/Config.java | 2 +- src/main/java/baseball/{ => controller}/Game.java | 10 +++++++--- src/main/java/baseball/{ => model}/ComputerNumber.java | 2 +- src/main/java/baseball/{ => model}/Hint.java | 4 ++-- .../baseball/{Player.java => model/PlayerNumber.java} | 4 ++-- 6 files changed, 15 insertions(+), 9 deletions(-) rename src/main/java/baseball/{ => config}/Config.java (74%) rename src/main/java/baseball/{ => controller}/Game.java (74%) rename src/main/java/baseball/{ => model}/ComputerNumber.java (96%) rename src/main/java/baseball/{ => model}/Hint.java (95%) rename src/main/java/baseball/{Player.java => model/PlayerNumber.java} (96%) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 1126514..c82a99f 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,5 +1,7 @@ package baseball; +import baseball.controller.Game; + public class Application { public static void main(String[] args) { diff --git a/src/main/java/baseball/Config.java b/src/main/java/baseball/config/Config.java similarity index 74% rename from src/main/java/baseball/Config.java rename to src/main/java/baseball/config/Config.java index 80435da..cff783e 100644 --- a/src/main/java/baseball/Config.java +++ b/src/main/java/baseball/config/Config.java @@ -1,4 +1,4 @@ -package baseball; +package baseball.config; public class Config { diff --git a/src/main/java/baseball/Game.java b/src/main/java/baseball/controller/Game.java similarity index 74% rename from src/main/java/baseball/Game.java rename to src/main/java/baseball/controller/Game.java index 0ee9869..77785df 100644 --- a/src/main/java/baseball/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,6 +1,10 @@ -package baseball; +package baseball.controller; -import static baseball.Config.NUMBER_LENGTH; +import static baseball.config.Config.NUMBER_LENGTH; + +import baseball.model.ComputerNumber; +import baseball.model.Hint; +import baseball.model.PlayerNumber; public class Game { @@ -8,7 +12,7 @@ public class Game { public void start() { String computerNumber, playerNumber; - Player player = new Player(); + PlayerNumber player = new PlayerNumber(); ComputerNumber computer = new ComputerNumber(); Hint hint = new Hint(); diff --git a/src/main/java/baseball/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java similarity index 96% rename from src/main/java/baseball/ComputerNumber.java rename to src/main/java/baseball/model/ComputerNumber.java index 36a7154..893eaa5 100644 --- a/src/main/java/baseball/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -1,4 +1,4 @@ -package baseball; +package baseball.model; import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; import static java.util.stream.Collectors.joining; diff --git a/src/main/java/baseball/Hint.java b/src/main/java/baseball/model/Hint.java similarity index 95% rename from src/main/java/baseball/Hint.java rename to src/main/java/baseball/model/Hint.java index 6137eda..046547d 100644 --- a/src/main/java/baseball/Hint.java +++ b/src/main/java/baseball/model/Hint.java @@ -1,6 +1,6 @@ -package baseball; +package baseball.model; -import static baseball.Config.NUMBER_LENGTH; +import static baseball.config.Config.NUMBER_LENGTH; public class Hint { diff --git a/src/main/java/baseball/Player.java b/src/main/java/baseball/model/PlayerNumber.java similarity index 96% rename from src/main/java/baseball/Player.java rename to src/main/java/baseball/model/PlayerNumber.java index 7c7d47f..4866834 100644 --- a/src/main/java/baseball/Player.java +++ b/src/main/java/baseball/model/PlayerNumber.java @@ -1,8 +1,8 @@ -package baseball; +package baseball.model; import camp.nextstep.edu.missionutils.Console; -public class Player { +public class PlayerNumber { public String inputNumber(final int numberLength) { System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); From f65861bef67c3db152cde93b1321fa9e1004770b Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 21:10:05 +0900 Subject: [PATCH 13/63] =?UTF-8?q?feat:=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95(Config)=20=EC=A0=9C=EC=95=BD=EC=A1=B0?= =?UTF-8?q?=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 --- src/main/java/baseball/config/Config.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/config/Config.java b/src/main/java/baseball/config/Config.java index cff783e..d3a50cc 100644 --- a/src/main/java/baseball/config/Config.java +++ b/src/main/java/baseball/config/Config.java @@ -1,6 +1,7 @@ package baseball.config; public class Config { - + public static final int NUMBER_MINIMUM_VALUE = 1; + public static final int NUMBER_MAXIMUM_VALUE = 9; public static final int NUMBER_LENGTH = 3; } From 641d1d3a281dc2d2d0bbfe18f324fb7275a1eaa0 Mon Sep 17 00:00:00 2001 From: Haebin Date: Fri, 20 Oct 2023 21:50:22 +0900 Subject: [PATCH 14/63] =?UTF-8?q?refactor:=20Model=20Layer=20/=20View=20La?= =?UTF-8?q?yer=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/baseball/model/Hint.java | 16 ++++++++------ src/main/java/baseball/view/InputView.java | 11 ++++++++++ src/main/java/baseball/view/OutputView.java | 24 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/main/java/baseball/view/InputView.java create mode 100644 src/main/java/baseball/view/OutputView.java diff --git a/src/main/java/baseball/model/Hint.java b/src/main/java/baseball/model/Hint.java index 046547d..8dce7f8 100644 --- a/src/main/java/baseball/model/Hint.java +++ b/src/main/java/baseball/model/Hint.java @@ -1,6 +1,9 @@ package baseball.model; import static baseball.config.Config.NUMBER_LENGTH; +import static java.lang.String.valueOf; + +import baseball.view.OutputView; public class Hint { @@ -17,21 +20,21 @@ public void updateHint(final String playerNumber, final String computerNumber) { countBallCount(playerNumber, computerNumber); } - public boolean checkClear(){ + public boolean checkClear() { return strikeCount == NUMBER_LENGTH; } public void printHint() { if (strikeCount == 0 && ballCount == 0) { - System.out.print("λ‚«μ‹±"); + OutputView.printNothing(); } if (ballCount > 0) { - System.out.print(ballCount + "λ³Ό "); + OutputView.printBall(ballCount); } if (strikeCount > 0) { - System.out.print(strikeCount + "슀트라이크"); + OutputView.printStrike(strikeCount); } - System.out.println(); + OutputView.printEmptyLine(); } private void countStrikeCount(final String playerNumber, final String computerNumber) { @@ -47,8 +50,7 @@ private void countBallCount(final String playerNumber, final String computerNumb char playerDigit = playerNumber.charAt(i); char computerDigit = computerNumber.charAt(i); - if (playerDigit != computerDigit && computerNumber.contains( - String.valueOf(playerDigit))) { + if (playerDigit != computerDigit && computerNumber.contains(valueOf(playerDigit))) { this.ballCount++; } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 0000000..2ee36aa --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,11 @@ +package baseball.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + + public static String requestUserNumber() { + System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); + return Console.readLine(); + } +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 0000000..c9fb427 --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,24 @@ +package baseball.view; + +public class OutputView { + + public static void printGameStart() { + System.out.println("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); + } + + public static void printNothing() { + System.out.print("λ‚«μ‹±"); + } + + public static void printBall(int ballCount) { + System.out.print(ballCount + "λ³Ό "); + } + + public static void printStrike(int strikeCount) { + System.out.print(strikeCount + "슀트라이크"); + } + + public static void printEmptyLine() { + System.out.println(); + } +} From dbcdc54b43186638492e54389cafd797e0ad6cd4 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 01:00:50 +0900 Subject: [PATCH 15/63] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=83=88=EB=A1=9C=EC=8B=9C=EC=9E=91=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=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/controller/Game.java | 21 ++++++++++--------- .../java/baseball/model/ComputerNumber.java | 9 +++++++- src/main/java/baseball/view/InputView.java | 8 ++++++- src/main/java/baseball/view/OutputView.java | 13 ++++++++++++ 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 77785df..c22f0eb 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -5,6 +5,8 @@ import baseball.model.ComputerNumber; import baseball.model.Hint; import baseball.model.PlayerNumber; +import baseball.view.InputView; +import java.util.Objects; public class Game { @@ -16,17 +18,16 @@ public void start() { ComputerNumber computer = new ComputerNumber(); Hint hint = new Hint(); - computerNumber = computer.pickTargetNumber(NUMBER_LENGTH); - do { - playerNumber = player.inputNumber(NUMBER_LENGTH); - - hint.reset(); - hint.updateHint(playerNumber, computerNumber); - hint.printHint(); - } while (!hint.checkClear()); - System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); - System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + computerNumber = computer.pickRandomNumber(NUMBER_LENGTH); + do { + playerNumber = player.inputNumber(NUMBER_LENGTH); + + hint.reset(); + hint.updateHint(playerNumber, computerNumber); + hint.printHint(); + } while (!hint.checkClear()); + } while (Objects.equals(InputView.requestRestartOrExit(), "1")); } } diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java index 893eaa5..034dcf9 100644 --- a/src/main/java/baseball/model/ComputerNumber.java +++ b/src/main/java/baseball/model/ComputerNumber.java @@ -1,5 +1,6 @@ package baseball.model; +import static baseball.config.Config.NUMBER_LENGTH; import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; import static java.util.stream.Collectors.joining; @@ -7,7 +8,13 @@ public class ComputerNumber { - public String pickTargetNumber(int numLength) { + private String computerNumber; + + public ComputerNumber() { + this.computerNumber = pickRandomNumber(NUMBER_LENGTH); + } + + public String pickRandomNumber(int numLength) { List pickedInteger = pickUniqueNumbersInRange(1, 9, numLength); return convertIntegerListToString(pickedInteger); } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 2ee36aa..4c6573b 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -5,7 +5,13 @@ public class InputView { public static String requestUserNumber() { - System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); + OutputView.printRequestNumber(); return Console.readLine(); } + + public static String requestRestartOrExit() { + OutputView.printRequestRestartOrExit(); + String input = Console.readLine(); + return input; + } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index c9fb427..3f2ce94 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -6,6 +6,14 @@ public static void printGameStart() { System.out.println("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); } + public static void printRequestNumber() { + System.out.println("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); + } + + public static void printRequestRestartOrExit() { + System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + } + public static void printNothing() { System.out.print("λ‚«μ‹±"); } @@ -21,4 +29,9 @@ public static void printStrike(int strikeCount) { public static void printEmptyLine() { System.out.println(); } + + public static void printGameOver() { + System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); + System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + } } From 2bd8d97d8f0fcd1490d863494e13e904e0aa9107 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 01:08:48 +0900 Subject: [PATCH 16/63] =?UTF-8?q?fix:=20=EC=88=AB=EC=9E=90=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B0=84=20=EA=B0=9C=ED=96=89=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=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/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 3f2ce94..1e70965 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -7,7 +7,7 @@ public static void printGameStart() { } public static void printRequestNumber() { - System.out.println("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); + System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); } public static void printRequestRestartOrExit() { From 8306983356a7d4871a2056ac63dde221f61065f2 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 01:27:05 +0900 Subject: [PATCH 17/63] =?UTF-8?q?feat:=20PlayerNumber=20/=20ComputerNumber?= =?UTF-8?q?=EB=A5=BC=20Number=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/model/ComputerNumber.java | 27 ------------- .../model/{PlayerNumber.java => Number.java} | 40 +++++++++++++++---- 2 files changed, 33 insertions(+), 34 deletions(-) delete mode 100644 src/main/java/baseball/model/ComputerNumber.java rename src/main/java/baseball/model/{PlayerNumber.java => Number.java} (52%) diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java deleted file mode 100644 index 034dcf9..0000000 --- a/src/main/java/baseball/model/ComputerNumber.java +++ /dev/null @@ -1,27 +0,0 @@ -package baseball.model; - -import static baseball.config.Config.NUMBER_LENGTH; -import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; -import static java.util.stream.Collectors.joining; - -import java.util.List; - -public class ComputerNumber { - - private String computerNumber; - - public ComputerNumber() { - this.computerNumber = pickRandomNumber(NUMBER_LENGTH); - } - - public String pickRandomNumber(int numLength) { - List pickedInteger = pickUniqueNumbersInRange(1, 9, numLength); - return convertIntegerListToString(pickedInteger); - } - - private String convertIntegerListToString(List pickedInteger) { - return pickedInteger.stream() - .map(Object::toString) - .collect(joining("")); - } -} diff --git a/src/main/java/baseball/model/PlayerNumber.java b/src/main/java/baseball/model/Number.java similarity index 52% rename from src/main/java/baseball/model/PlayerNumber.java rename to src/main/java/baseball/model/Number.java index 4866834..8388bd0 100644 --- a/src/main/java/baseball/model/PlayerNumber.java +++ b/src/main/java/baseball/model/Number.java @@ -1,15 +1,41 @@ package baseball.model; -import camp.nextstep.edu.missionutils.Console; +import static baseball.config.Config.NUMBER_LENGTH; +import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; +import static java.util.stream.Collectors.joining; -public class PlayerNumber { +import baseball.view.InputView; +import java.util.List; - public String inputNumber(final int numberLength) { - System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); - String number = Console.readLine(); +public class Number { + + private String number; + + private Number(String number) { validateNumber(number); - validateNumberLength(number, numberLength); - return number; + validateNumberLength(number, NUMBER_LENGTH); + this.number = number; + } + + /** + * Static Factory Method - 랜덀 숫자 생성 + * @param numberLength + */ + public static Number generateRandomNumber(final int numberLength) { + List pickedInteger = pickUniqueNumbersInRange(1, 9, numberLength); + String number = convertIntegerListToString(pickedInteger); + return new Number(number); + } + + public static Number inputPlayerNumber() { + String number = InputView.requestUserNumber(); + return new Number(number); + } + + private static String convertIntegerListToString(List pickedInteger) { + return pickedInteger.stream() + .map(Object::toString) + .collect(joining("")); } private void validateNumber(final String number) { From f8375422baa5147bc0c8dce384b0707c3b018653 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 02:21:25 +0900 Subject: [PATCH 18/63] =?UTF-8?q?refactor:=20Hint=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=A3=BC=EB=8F=84=20=EC=84=A4?= =?UTF-8?q?=EA=B3=84=EB=A1=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 29 ++++++------ src/main/java/baseball/model/Hint.java | 31 ++----------- src/main/java/baseball/model/Number.java | 46 ++++++------------- .../baseball/validator/NumberValidator.java | 37 +++++++++++++++ 4 files changed, 67 insertions(+), 76 deletions(-) create mode 100644 src/main/java/baseball/validator/NumberValidator.java diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index c22f0eb..4cf621e 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -2,32 +2,29 @@ import static baseball.config.Config.NUMBER_LENGTH; -import baseball.model.ComputerNumber; import baseball.model.Hint; -import baseball.model.PlayerNumber; +import baseball.model.Number; import baseball.view.InputView; import java.util.Objects; public class Game { + private Number computerNumber; + private Number playerNumber; public void start() { - String computerNumber, playerNumber; - - PlayerNumber player = new PlayerNumber(); - ComputerNumber computer = new ComputerNumber(); - Hint hint = new Hint(); - do { - computerNumber = computer.pickRandomNumber(NUMBER_LENGTH); - do { - playerNumber = player.inputNumber(NUMBER_LENGTH); - - hint.reset(); - hint.updateHint(playerNumber, computerNumber); - hint.printHint(); - } while (!hint.checkClear()); + computerNumber = Number.generateRandomNumber(NUMBER_LENGTH); + play(); } while (Objects.equals(InputView.requestRestartOrExit(), "1")); + } + private void play() { + Hint hint = new Hint(); + do { + playerNumber = Number.inputPlayerNumber(); + hint.updateHint(playerNumber, computerNumber); + hint.printHint(); + } while (!hint.checkClear()); } } diff --git a/src/main/java/baseball/model/Hint.java b/src/main/java/baseball/model/Hint.java index 8dce7f8..ac350c5 100644 --- a/src/main/java/baseball/model/Hint.java +++ b/src/main/java/baseball/model/Hint.java @@ -1,7 +1,6 @@ package baseball.model; import static baseball.config.Config.NUMBER_LENGTH; -import static java.lang.String.valueOf; import baseball.view.OutputView; @@ -10,14 +9,9 @@ public class Hint { private int ballCount; private int strikeCount; - public void reset() { - this.strikeCount = 0; - this.ballCount = 0; - } - - public void updateHint(final String playerNumber, final String computerNumber) { - countStrikeCount(playerNumber, computerNumber); - countBallCount(playerNumber, computerNumber); + public void updateHint(final Number playerNumber, final Number computerNumber) { + this.ballCount = playerNumber.countBallCount(computerNumber); + this.strikeCount = playerNumber.countStrikeCount(computerNumber); } public boolean checkClear() { @@ -36,23 +30,4 @@ public void printHint() { } OutputView.printEmptyLine(); } - - private void countStrikeCount(final String playerNumber, final String computerNumber) { - for (int i = 0; i < NUMBER_LENGTH; i++) { - if (playerNumber.charAt(i) == computerNumber.charAt(i)) { - this.strikeCount++; - } - } - } - - private void countBallCount(final String playerNumber, final String computerNumber) { - for (int i = 0; i < playerNumber.length(); i++) { - char playerDigit = playerNumber.charAt(i); - char computerDigit = computerNumber.charAt(i); - - if (playerDigit != computerDigit && computerNumber.contains(valueOf(playerDigit))) { - this.ballCount++; - } - } - } } diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index 8388bd0..ae45800 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -1,6 +1,8 @@ package baseball.model; import static baseball.config.Config.NUMBER_LENGTH; +import static baseball.validator.NumberValidator.validateNumber; +import static baseball.validator.NumberValidator.validateNumberLength; import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; import static java.util.stream.Collectors.joining; @@ -19,6 +21,7 @@ private Number(String number) { /** * Static Factory Method - 랜덀 숫자 생성 + * * @param numberLength */ public static Number generateRandomNumber(final int numberLength) { @@ -27,47 +30,26 @@ public static Number generateRandomNumber(final int numberLength) { return new Number(number); } + /** + * Static Factory Method - μ‚¬μš©μž 숫자 μž…λ ₯ + */ public static Number inputPlayerNumber() { String number = InputView.requestUserNumber(); return new Number(number); } - private static String convertIntegerListToString(List pickedInteger) { - return pickedInteger.stream() - .map(Object::toString) - .collect(joining("")); - } - - private void validateNumber(final String number) { - if (number.isEmpty()) { - throw new IllegalArgumentException("number cannot be empty"); - } - if (!isValidNumber(number)) { - throw new IllegalArgumentException("number cannot contain any letters"); - } - if (!isUniqueNumber(number)) { - throw new IllegalArgumentException("number cannot contain duplicated numbers"); - } + public int countBallCount(final Number coumputerNumber) { + return 1; } - private void validateNumberLength(final String number, final int numLength) { - if (!isValidLength(number, numLength)) { - throw new IllegalArgumentException( - "number Length is different from the system setting"); - } + public int countStrikeCount(final Number computerNumber) { + return 1; } - private boolean isValidLength(final String number, int numLength) { - return number.length() == numLength; - } - - private boolean isValidNumber(final String number) { - return number - .chars() - .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); - } + private static String convertIntegerListToString(List pickedInteger) { + return pickedInteger.stream() + .map(Object::toString) + .collect(joining("")); - private boolean isUniqueNumber(final String number) { - return number.chars().distinct().count() == number.length(); } } diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java new file mode 100644 index 0000000..62aed98 --- /dev/null +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -0,0 +1,37 @@ +package baseball.validator; + +public class NumberValidator { + + public static void validateNumber(final String number) { + if (number.isEmpty()) { + throw new IllegalArgumentException("number cannot be empty"); + } + if (!isValidNumber(number)) { + throw new IllegalArgumentException("number cannot contain any letters"); + } + if (!isUniqueNumber(number)) { + throw new IllegalArgumentException("number cannot contain duplicated numbers"); + } + } + + public static void validateNumberLength(final String number, final int numLength) { + if (!isValidLength(number, numLength)) { + throw new IllegalArgumentException( + "number Length is different from the system setting"); + } + } + + private static boolean isValidLength(final String number, int numLength) { + return number.length() == numLength; + } + + private static boolean isValidNumber(final String number) { + return number + .chars() + .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); + } + + private static boolean isUniqueNumber(final String number) { + return number.chars().distinct().count() == number.length(); + } +} From daad19eaedbad6ef3705a50ca3b3dbd4ac85620a Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 02:30:35 +0900 Subject: [PATCH 19/63] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=ED=95=9C=EC=9E=90=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/Hint.java | 11 +++++++---- src/main/java/baseball/model/Number.java | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/model/Hint.java b/src/main/java/baseball/model/Hint.java index ac350c5..c581cd7 100644 --- a/src/main/java/baseball/model/Hint.java +++ b/src/main/java/baseball/model/Hint.java @@ -9,16 +9,19 @@ public class Hint { private int ballCount; private int strikeCount; - public void updateHint(final Number playerNumber, final Number computerNumber) { - this.ballCount = playerNumber.countBallCount(computerNumber); - this.strikeCount = playerNumber.countStrikeCount(computerNumber); + protected Hint() { + } + + public void update(final Number playerNumber, final Number computerNumber) { + ballCount = playerNumber.countBallCount(computerNumber); + strikeCount = playerNumber.countStrikeCount(computerNumber); } public boolean checkClear() { return strikeCount == NUMBER_LENGTH; } - public void printHint() { + public void print() { if (strikeCount == 0 && ballCount == 0) { OutputView.printNothing(); } diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index ae45800..7b52143 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -13,6 +13,10 @@ public class Number { private String number; + protected Number() { + + } + private Number(String number) { validateNumber(number); validateNumberLength(number, NUMBER_LENGTH); From e16b264cba8e457fbadee573247e00dcc925359b Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 02:30:54 +0900 Subject: [PATCH 20/63] =?UTF-8?q?refactor:=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EC=A7=81=EA=B4=80=EC=A0=81=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/controller/Game.java | 6 +++--- src/main/java/baseball/view/InputView.java | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 4cf621e..1f2c995 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -11,6 +11,7 @@ public class Game { private Number computerNumber; private Number playerNumber; + private Hint hint; public void start() { do { @@ -20,11 +21,10 @@ public void start() { } private void play() { - Hint hint = new Hint(); do { playerNumber = Number.inputPlayerNumber(); - hint.updateHint(playerNumber, computerNumber); - hint.printHint(); + hint.update(playerNumber, computerNumber); + hint.print(); } while (!hint.checkClear()); } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 4c6573b..f18dddc 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -11,7 +11,6 @@ public static String requestUserNumber() { public static String requestRestartOrExit() { OutputView.printRequestRestartOrExit(); - String input = Console.readLine(); - return input; + return Console.readLine(); } } From 058853ec06c725e875c0e381e3cbdf8be1ca27fd Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 03:08:49 +0900 Subject: [PATCH 21/63] =?UTF-8?q?refactor:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EB=B0=8F=20MVC=20=ED=8C=A8=ED=84=B4=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 13 +++-- src/main/java/baseball/model/Number.java | 49 ++++++++++++------- .../baseball/model/{Hint.java => Result.java} | 15 +++--- .../baseball/validator/NumberValidator.java | 18 ++++--- 4 files changed, 58 insertions(+), 37 deletions(-) rename src/main/java/baseball/model/{Hint.java => Result.java} (71%) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 1f2c995..36d19d5 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -2,7 +2,7 @@ import static baseball.config.Config.NUMBER_LENGTH; -import baseball.model.Hint; +import baseball.model.Result; import baseball.model.Number; import baseball.view.InputView; import java.util.Objects; @@ -10,8 +10,7 @@ public class Game { private Number computerNumber; - private Number playerNumber; - private Hint hint; + private Result result; public void start() { do { @@ -22,9 +21,9 @@ public void start() { private void play() { do { - playerNumber = Number.inputPlayerNumber(); - hint.update(playerNumber, computerNumber); - hint.print(); - } while (!hint.checkClear()); + Number playerNumber = Number.inputPlayerNumber(); + result = Result.create(playerNumber, computerNumber); + result.print(); + } while (!result.checkGameOver()); } } diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index 7b52143..9e82e68 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -2,8 +2,8 @@ import static baseball.config.Config.NUMBER_LENGTH; import static baseball.validator.NumberValidator.validateNumber; -import static baseball.validator.NumberValidator.validateNumberLength; import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; +import static java.lang.String.valueOf; import static java.util.stream.Collectors.joining; import baseball.view.InputView; @@ -13,41 +13,49 @@ public class Number { private String number; - protected Number() { - - } - private Number(String number) { validateNumber(number); - validateNumberLength(number, NUMBER_LENGTH); this.number = number; } - /** - * Static Factory Method - 랜덀 숫자 생성 - * - * @param numberLength - */ public static Number generateRandomNumber(final int numberLength) { List pickedInteger = pickUniqueNumbersInRange(1, 9, numberLength); String number = convertIntegerListToString(pickedInteger); return new Number(number); } - /** - * Static Factory Method - μ‚¬μš©μž 숫자 μž…λ ₯ - */ public static Number inputPlayerNumber() { String number = InputView.requestUserNumber(); return new Number(number); } - public int countBallCount(final Number coumputerNumber) { - return 1; + public int countBallCount(final Number computerNumber) { + int ret = 0; + String playerNumber = this.getNumber(); + String compareNumber = computerNumber.getNumber(); + + for (int i = 0; i < playerNumber.length(); i++) { + char playerDigit = playerNumber.charAt(i); + char compareDigit = compareNumber.charAt(i); + + if (playerDigit != compareDigit && compareNumber.contains(valueOf(playerDigit))) { + ret++; + } + } + return ret; } public int countStrikeCount(final Number computerNumber) { - return 1; + int strikeCount = 0; + String playerNumber = this.getNumber(); + String compareNumber = computerNumber.getNumber(); + + for (int i = 0; i < NUMBER_LENGTH; i++) { + if (playerNumber.charAt(i) == compareNumber.charAt(i)) { + strikeCount++; + } + } + return strikeCount; } private static String convertIntegerListToString(List pickedInteger) { @@ -56,4 +64,11 @@ private static String convertIntegerListToString(List pickedInteger) { .collect(joining("")); } + + /** + * getNumber() μ™ΈλΆ€ κ°μ²΄μ—μ„œ 값을 κΊΌλ‚΄μ§€ λͺ»ν•˜λ„둝 private둜 μ œν•œ + */ + private String getNumber() { + return number; + } } diff --git a/src/main/java/baseball/model/Hint.java b/src/main/java/baseball/model/Result.java similarity index 71% rename from src/main/java/baseball/model/Hint.java rename to src/main/java/baseball/model/Result.java index c581cd7..8062cac 100644 --- a/src/main/java/baseball/model/Hint.java +++ b/src/main/java/baseball/model/Result.java @@ -4,21 +4,18 @@ import baseball.view.OutputView; -public class Hint { +public class Result { private int ballCount; private int strikeCount; - protected Hint() { - } - - public void update(final Number playerNumber, final Number computerNumber) { + private Result(final Number playerNumber, final Number computerNumber) { ballCount = playerNumber.countBallCount(computerNumber); strikeCount = playerNumber.countStrikeCount(computerNumber); } - public boolean checkClear() { - return strikeCount == NUMBER_LENGTH; + public static Result create(final Number playerNumber, final Number computerNumber) { + return new Result(playerNumber, computerNumber); } public void print() { @@ -33,4 +30,8 @@ public void print() { } OutputView.printEmptyLine(); } + + public boolean checkGameOver() { + return strikeCount == NUMBER_LENGTH; + } } diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index 62aed98..428f286 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -1,7 +1,16 @@ package baseball.validator; +import static baseball.config.Config.NUMBER_LENGTH; + public class NumberValidator { + /** + * validateNumber μœ νš¨ν•œ 숫자 μΈμžμΈμ§€ κ²€μ¦ν•˜λŠ” λ©”μ†Œλ“œ + * - number 객체가 λΉ„μ–΄μžˆλŠ”μ§€ 검증 -> λΉ„μ–΄μžˆλ‹€λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. + * - number 객체가 숫자만 ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ 검증 -> μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. + * - number 객체가 μ€‘λ³΅λœ 숫자λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ 검증 -> μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. + * @param number + */ public static void validateNumber(final String number) { if (number.isEmpty()) { throw new IllegalArgumentException("number cannot be empty"); @@ -12,17 +21,14 @@ public static void validateNumber(final String number) { if (!isUniqueNumber(number)) { throw new IllegalArgumentException("number cannot contain duplicated numbers"); } - } - - public static void validateNumberLength(final String number, final int numLength) { - if (!isValidLength(number, numLength)) { + if (!isValidLength(number)) { throw new IllegalArgumentException( "number Length is different from the system setting"); } } - private static boolean isValidLength(final String number, int numLength) { - return number.length() == numLength; + private static boolean isValidLength(final String number) { + return number.length() == NUMBER_LENGTH; } private static boolean isValidNumber(final String number) { From c6720221a27bdc0d6c2461a2091d9201ab21a0a3 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 10:47:11 +0900 Subject: [PATCH 22/63] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=A7=81(=EB=A9=94=EC=86=8C=EB=93=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 --- src/main/java/baseball/controller/Game.java | 8 +++++--- src/main/java/baseball/model/Number.java | 18 ++++++++++++------ src/main/java/baseball/model/Result.java | 14 +++++++------- src/main/java/baseball/view/InputView.java | 1 + src/main/java/baseball/view/OutputView.java | 11 +++++++---- src/test/java/baseball/ApplicationTest.java | 6 +++--- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 36d19d5..eb28aca 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -2,14 +2,15 @@ import static baseball.config.Config.NUMBER_LENGTH; -import baseball.model.Result; import baseball.model.Number; +import baseball.model.Result; import baseball.view.InputView; +import baseball.view.OutputView; import java.util.Objects; public class Game { - private Number computerNumber; + private Number playerNumber; private Result result; public void start() { @@ -20,8 +21,9 @@ public void start() { } private void play() { + OutputView.printGameStart(); do { - Number playerNumber = Number.inputPlayerNumber(); + playerNumber = Number.inputPlayerNumber(); result = Result.create(playerNumber, computerNumber); result.print(); } while (!result.checkGameOver()); diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index 9e82e68..ce6f893 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -2,11 +2,12 @@ import static baseball.config.Config.NUMBER_LENGTH; import static baseball.validator.NumberValidator.validateNumber; -import static camp.nextstep.edu.missionutils.Randoms.pickUniqueNumbersInRange; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; import static java.lang.String.valueOf; import static java.util.stream.Collectors.joining; import baseball.view.InputView; +import java.util.ArrayList; import java.util.List; public class Number { @@ -19,7 +20,13 @@ private Number(String number) { } public static Number generateRandomNumber(final int numberLength) { - List pickedInteger = pickUniqueNumbersInRange(1, 9, numberLength); + List pickedInteger = new ArrayList<>(); + while (pickedInteger.size() < numberLength) { + int number = pickNumberInRange(1, 9); + if (!pickedInteger.contains(number)) { + pickedInteger.add(number); + } + } String number = convertIntegerListToString(pickedInteger); return new Number(number); } @@ -60,15 +67,14 @@ public int countStrikeCount(final Number computerNumber) { private static String convertIntegerListToString(List pickedInteger) { return pickedInteger.stream() - .map(Object::toString) - .collect(joining("")); - + .map(Object::toString) + .collect(joining("")); } /** * getNumber() μ™ΈλΆ€ κ°μ²΄μ—μ„œ 값을 κΊΌλ‚΄μ§€ λͺ»ν•˜λ„둝 private둜 μ œν•œ */ - private String getNumber() { + public String getNumber() { return number; } } diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java index 8062cac..7d0338c 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -19,14 +19,14 @@ public static Result create(final Number playerNumber, final Number computerNumb } public void print() { - if (strikeCount == 0 && ballCount == 0) { + if (ballCount == 0 && strikeCount == 0) { OutputView.printNothing(); - } - if (ballCount > 0) { - OutputView.printBall(ballCount); - } - if (strikeCount > 0) { - OutputView.printStrike(strikeCount); + } else if (ballCount > 0 && strikeCount > 0) { + OutputView.printBallAndStrikeCount(ballCount, strikeCount); + } else if (ballCount > 0) { + OutputView.printBallCount(ballCount); + } else if (strikeCount > 0) { + OutputView.printStrikeCount(strikeCount); } OutputView.printEmptyLine(); } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index f18dddc..e7e1170 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -10,6 +10,7 @@ public static String requestUserNumber() { } public static String requestRestartOrExit() { + OutputView.printGameOver(); OutputView.printRequestRestartOrExit(); return Console.readLine(); } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 1e70965..93431c3 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -18,13 +18,17 @@ public static void printNothing() { System.out.print("λ‚«μ‹±"); } - public static void printBall(int ballCount) { - System.out.print(ballCount + "λ³Ό "); + public static void printBallCount(int ballCount) { + System.out.print(ballCount + "λ³Ό"); } - public static void printStrike(int strikeCount) { + public static void printStrikeCount(int strikeCount) { System.out.print(strikeCount + "슀트라이크"); } + + public static void printBallAndStrikeCount(int ballCount, int strikeCount) { + System.out.print(ballCount + "λ³Ό " + strikeCount + "슀트라이크"); + } public static void printEmptyLine() { System.out.println(); @@ -32,6 +36,5 @@ public static void printEmptyLine() { public static void printGameOver() { System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); - System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); } } diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 3fa29fa..fcd4cde 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -1,13 +1,13 @@ package baseball; -import camp.nextstep.edu.missionutils.test.NsTest; -import org.junit.jupiter.api.Test; - import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import camp.nextstep.edu.missionutils.test.NsTest; +import org.junit.jupiter.api.Test; + class ApplicationTest extends NsTest { @Test void κ²Œμž„μ’…λ£Œ_ν›„_μž¬μ‹œμž‘() { From dd8cba7c764b18e559175bd1742a66b4902c23db Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 10:56:10 +0900 Subject: [PATCH 23/63] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=A8=20=EC=A2=85=EB=A3=8C=20=ED=94=8C=EB=9E=98=EA=B7=B8=20?= =?UTF-8?q?=EC=83=81=EC=88=98=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index eb28aca..612fd2e 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -9,6 +9,8 @@ import java.util.Objects; public class Game { + private static final String GAME_EXIT_FLAG = "1"; + private Number computerNumber; private Number playerNumber; private Result result; @@ -17,7 +19,7 @@ public void start() { do { computerNumber = Number.generateRandomNumber(NUMBER_LENGTH); play(); - } while (Objects.equals(InputView.requestRestartOrExit(), "1")); + } while (Objects.equals(InputView.requestRestartOrExit(), GAME_EXIT_FLAG)); } private void play() { From 990b7c79b888b7f741b4a0f7cc46f33a36c25740 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 11:31:03 +0900 Subject: [PATCH 24/63] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20Enum=EC=9C=BC=EB=A1=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/config/Config.java | 7 ---- .../java/baseball/config/NumberConfig.java | 15 +++++++++ .../baseball/config/OutputViewConfig.java | 21 ++++++++++++ src/main/java/baseball/controller/Game.java | 9 +++--- src/main/java/baseball/model/Number.java | 32 +++++++++++-------- src/main/java/baseball/model/Result.java | 5 +-- src/main/java/baseball/view/OutputView.java | 28 ++++++++++------ 7 files changed, 78 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/baseball/config/Config.java create mode 100644 src/main/java/baseball/config/NumberConfig.java create mode 100644 src/main/java/baseball/config/OutputViewConfig.java diff --git a/src/main/java/baseball/config/Config.java b/src/main/java/baseball/config/Config.java deleted file mode 100644 index d3a50cc..0000000 --- a/src/main/java/baseball/config/Config.java +++ /dev/null @@ -1,7 +0,0 @@ -package baseball.config; - -public class Config { - public static final int NUMBER_MINIMUM_VALUE = 1; - public static final int NUMBER_MAXIMUM_VALUE = 9; - public static final int NUMBER_LENGTH = 3; -} diff --git a/src/main/java/baseball/config/NumberConfig.java b/src/main/java/baseball/config/NumberConfig.java new file mode 100644 index 0000000..a7c2a14 --- /dev/null +++ b/src/main/java/baseball/config/NumberConfig.java @@ -0,0 +1,15 @@ +package baseball.config; + +public enum NumberConfig { + NUMBER_LENGTH(3); + + private final int value; + + NumberConfig(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/baseball/config/OutputViewConfig.java b/src/main/java/baseball/config/OutputViewConfig.java new file mode 100644 index 0000000..0d2c4ce --- /dev/null +++ b/src/main/java/baseball/config/OutputViewConfig.java @@ -0,0 +1,21 @@ +package baseball.config; + +public enum OutputViewConfig { + GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."), + REQUEST_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), + REQUEST_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."), + NOTHING("λ‚«μ‹±"), + + ; + + + private final String message; + + OutputViewConfig(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 612fd2e..735af51 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,6 +1,6 @@ package baseball.controller; -import static baseball.config.Config.NUMBER_LENGTH; +import static baseball.config.NumberConfig.NUMBER_LENGTH; import baseball.model.Number; import baseball.model.Result; @@ -9,21 +9,20 @@ import java.util.Objects; public class Game { - private static final String GAME_EXIT_FLAG = "1"; private Number computerNumber; private Number playerNumber; private Result result; public void start() { + OutputView.printGameStart(); do { - computerNumber = Number.generateRandomNumber(NUMBER_LENGTH); + computerNumber = Number.generateRandomNumber(NUMBER_LENGTH.getValue()); play(); - } while (Objects.equals(InputView.requestRestartOrExit(), GAME_EXIT_FLAG)); + } while (Objects.equals(InputView.requestRestartOrExit(), "1")); } private void play() { - OutputView.printGameStart(); do { playerNumber = Number.inputPlayerNumber(); result = Result.create(playerNumber, computerNumber); diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index ce6f893..7212603 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -1,7 +1,10 @@ package baseball.model; -import static baseball.config.Config.NUMBER_LENGTH; -import static baseball.validator.NumberValidator.validateNumber; +import static baseball.config.NumberConfig.NUMBER_LENGTH; +import static baseball.validator.NumberValidator.validateContainDuplicatedNumber; +import static baseball.validator.NumberValidator.validateContainOnlyNumber; +import static baseball.validator.NumberValidator.validateEmpty; +import static baseball.validator.NumberValidator.validateNumberLength; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; import static java.lang.String.valueOf; import static java.util.stream.Collectors.joining; @@ -12,11 +15,14 @@ public class Number { - private String number; + private final String value; - private Number(String number) { - validateNumber(number); - this.number = number; + private Number(String value) { + validateEmpty(value); + validateNumberLength(value); + validateContainOnlyNumber(value); + validateContainDuplicatedNumber(value); + this.value = value; } public static Number generateRandomNumber(final int numberLength) { @@ -38,8 +44,8 @@ public static Number inputPlayerNumber() { public int countBallCount(final Number computerNumber) { int ret = 0; - String playerNumber = this.getNumber(); - String compareNumber = computerNumber.getNumber(); + String playerNumber = this.getValue(); + String compareNumber = computerNumber.getValue(); for (int i = 0; i < playerNumber.length(); i++) { char playerDigit = playerNumber.charAt(i); @@ -54,10 +60,10 @@ public int countBallCount(final Number computerNumber) { public int countStrikeCount(final Number computerNumber) { int strikeCount = 0; - String playerNumber = this.getNumber(); - String compareNumber = computerNumber.getNumber(); + String playerNumber = this.getValue(); + String compareNumber = computerNumber.getValue(); - for (int i = 0; i < NUMBER_LENGTH; i++) { + for (int i = 0; i < NUMBER_LENGTH.getValue(); i++) { if (playerNumber.charAt(i) == compareNumber.charAt(i)) { strikeCount++; } @@ -74,7 +80,7 @@ private static String convertIntegerListToString(List pickedInteger) { /** * getNumber() μ™ΈλΆ€ κ°μ²΄μ—μ„œ 값을 κΊΌλ‚΄μ§€ λͺ»ν•˜λ„둝 private둜 μ œν•œ */ - public String getNumber() { - return number; + public String getValue() { + return value; } } diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java index 7d0338c..429625c 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -1,7 +1,5 @@ package baseball.model; -import static baseball.config.Config.NUMBER_LENGTH; - import baseball.view.OutputView; public class Result { @@ -28,10 +26,9 @@ public void print() { } else if (strikeCount > 0) { OutputView.printStrikeCount(strikeCount); } - OutputView.printEmptyLine(); } public boolean checkGameOver() { - return strikeCount == NUMBER_LENGTH; + return strikeCount == 3; } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 93431c3..4379165 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,33 +1,41 @@ package baseball.view; +import static baseball.config.OutputViewConfig.GAME_START; +import static baseball.config.OutputViewConfig.NOTHING; +import static baseball.config.OutputViewConfig.REQUEST_PLAYER_NUMBER; +import static baseball.config.OutputViewConfig.REQUEST_RESTART_OR_EXIT; + public class OutputView { + public static void printRequestNumber() { + System.out.print(REQUEST_PLAYER_NUMBER.getMessage()); + } public static void printGameStart() { - System.out.println("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); + System.out.println(GAME_START.getMessage()); } - public static void printRequestNumber() { - System.out.print("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); - } public static void printRequestRestartOrExit() { - System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + System.out.println(REQUEST_RESTART_OR_EXIT.getMessage()); } public static void printNothing() { - System.out.print("λ‚«μ‹±"); + System.out.println(NOTHING.getMessage()); } public static void printBallCount(int ballCount) { - System.out.print(ballCount + "λ³Ό"); + String result = String.format("%dλ³Ό", ballCount); + System.out.println(result); } public static void printStrikeCount(int strikeCount) { - System.out.print(strikeCount + "슀트라이크"); + String result = String.format("%d슀트라이크", strikeCount); + System.out.println(result); } - + public static void printBallAndStrikeCount(int ballCount, int strikeCount) { - System.out.print(ballCount + "λ³Ό " + strikeCount + "슀트라이크"); + String result = String.format("%dλ³Ό %d슀트라이크", ballCount, strikeCount); + System.out.println(result); } public static void printEmptyLine() { From f5fa1bce362a2b0b1358f79ae438349799a55152 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 11:31:21 +0900 Subject: [PATCH 25/63] =?UTF-8?q?refactor:=20validator=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/validator/NumberValidator.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index 428f286..81fd1f7 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -1,43 +1,47 @@ package baseball.validator; -import static baseball.config.Config.NUMBER_LENGTH; + +import static baseball.config.NumberConfig.NUMBER_LENGTH; public class NumberValidator { - /** - * validateNumber μœ νš¨ν•œ 숫자 μΈμžμΈμ§€ κ²€μ¦ν•˜λŠ” λ©”μ†Œλ“œ - * - number 객체가 λΉ„μ–΄μžˆλŠ”μ§€ 검증 -> λΉ„μ–΄μžˆλ‹€λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. - * - number 객체가 숫자만 ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ 검증 -> μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. - * - number 객체가 μ€‘λ³΅λœ 숫자λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ 검증 -> μ•„λ‹ˆλΌλ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. - * @param number - */ - public static void validateNumber(final String number) { - if (number.isEmpty()) { - throw new IllegalArgumentException("number cannot be empty"); - } - if (!isValidNumber(number)) { - throw new IllegalArgumentException("number cannot contain any letters"); + public static void validateNumberLength(final String number) { + if (!isValidLength(number)) { + throw new IllegalArgumentException("number Length is different from the system setting"); } + } + + public static void validateContainDuplicatedNumber(final String number) { if (!isUniqueNumber(number)) { throw new IllegalArgumentException("number cannot contain duplicated numbers"); } - if (!isValidLength(number)) { - throw new IllegalArgumentException( - "number Length is different from the system setting"); + } + + public static void validateContainOnlyNumber(final String number) { + if (!isValidNumber(number)) { + throw new IllegalArgumentException("number cannot contain any letters"); + } + } + + public static void validateEmpty(final String number) { + if (number.isEmpty()) { + throw new IllegalArgumentException("number cannot be empty"); } } private static boolean isValidLength(final String number) { - return number.length() == NUMBER_LENGTH; + return number.length() == NUMBER_LENGTH.getValue(); } private static boolean isValidNumber(final String number) { return number - .chars() - .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); + .chars() + .allMatch(c -> Character.isDigit(c) && c >= '1' && c <= '9'); } private static boolean isUniqueNumber(final String number) { - return number.chars().distinct().count() == number.length(); + return number.chars() + .distinct() + .count() == number.length(); } } From 3e8430728f78371da3c851a8fba0ead7dbc0e162 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 11:32:02 +0900 Subject: [PATCH 26/63] =?UTF-8?q?refactor:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/OutputView.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 4379165..f69feec 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -38,10 +38,6 @@ public static void printBallAndStrikeCount(int ballCount, int strikeCount) { System.out.println(result); } - public static void printEmptyLine() { - System.out.println(); - } - public static void printGameOver() { System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); } From 6a46e8c62c181761ecee4cdf7ba27167f1d450a2 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 11:52:12 +0900 Subject: [PATCH 27/63] =?UTF-8?q?refactor:=20Enum=EC=9D=84=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EB=B6=88=EB=B3=80=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/config/GameConfig.java | 15 +++++++++++++++ src/main/java/baseball/config/NumberConfig.java | 4 +++- .../java/baseball/config/OutputViewConfig.java | 3 +-- src/main/java/baseball/controller/Game.java | 11 +++++++---- src/main/java/baseball/model/Number.java | 8 +++++--- src/main/java/baseball/model/Result.java | 4 +++- src/main/java/baseball/view/OutputView.java | 9 +++++---- 7 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 src/main/java/baseball/config/GameConfig.java diff --git a/src/main/java/baseball/config/GameConfig.java b/src/main/java/baseball/config/GameConfig.java new file mode 100644 index 0000000..ae0c26c --- /dev/null +++ b/src/main/java/baseball/config/GameConfig.java @@ -0,0 +1,15 @@ +package baseball.config; + +public enum GameConfig { + GAME_RESTART_FLAG("2"); + + private final String value; + + GameConfig(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/baseball/config/NumberConfig.java b/src/main/java/baseball/config/NumberConfig.java index a7c2a14..7878652 100644 --- a/src/main/java/baseball/config/NumberConfig.java +++ b/src/main/java/baseball/config/NumberConfig.java @@ -1,7 +1,9 @@ package baseball.config; public enum NumberConfig { - NUMBER_LENGTH(3); + NUMBER_LENGTH(3), + NUMBER_MINIMUM_INCLUSIVE(1), + NUMBER_MAXIMUM_INCLUSIVE(9); private final int value; diff --git a/src/main/java/baseball/config/OutputViewConfig.java b/src/main/java/baseball/config/OutputViewConfig.java index 0d2c4ce..83214c4 100644 --- a/src/main/java/baseball/config/OutputViewConfig.java +++ b/src/main/java/baseball/config/OutputViewConfig.java @@ -5,8 +5,7 @@ public enum OutputViewConfig { REQUEST_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), REQUEST_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."), NOTHING("λ‚«μ‹±"), - - ; + GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); private final String message; diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 735af51..22686cc 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,6 +1,6 @@ package baseball.controller; -import static baseball.config.NumberConfig.NUMBER_LENGTH; +import static baseball.config.GameConfig.GAME_RESTART_FLAG; import baseball.model.Number; import baseball.model.Result; @@ -9,7 +9,6 @@ import java.util.Objects; public class Game { - private Number computerNumber; private Number playerNumber; private Result result; @@ -17,9 +16,9 @@ public class Game { public void start() { OutputView.printGameStart(); do { - computerNumber = Number.generateRandomNumber(NUMBER_LENGTH.getValue()); + computerNumber = Number.generateRandomNumber(); play(); - } while (Objects.equals(InputView.requestRestartOrExit(), "1")); + } while (!isRestart()); } private void play() { @@ -29,4 +28,8 @@ private void play() { result.print(); } while (!result.checkGameOver()); } + + private static boolean isRestart() { + return Objects.equals(InputView.requestRestartOrExit(), GAME_RESTART_FLAG.getValue()); + } } diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index 7212603..ee568c5 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -1,6 +1,8 @@ package baseball.model; import static baseball.config.NumberConfig.NUMBER_LENGTH; +import static baseball.config.NumberConfig.NUMBER_MAXIMUM_INCLUSIVE; +import static baseball.config.NumberConfig.NUMBER_MINIMUM_INCLUSIVE; import static baseball.validator.NumberValidator.validateContainDuplicatedNumber; import static baseball.validator.NumberValidator.validateContainOnlyNumber; import static baseball.validator.NumberValidator.validateEmpty; @@ -25,10 +27,10 @@ private Number(String value) { this.value = value; } - public static Number generateRandomNumber(final int numberLength) { + public static Number generateRandomNumber() { List pickedInteger = new ArrayList<>(); - while (pickedInteger.size() < numberLength) { - int number = pickNumberInRange(1, 9); + while (pickedInteger.size() < NUMBER_LENGTH.getValue()) { + int number = pickNumberInRange(NUMBER_MINIMUM_INCLUSIVE.getValue(), NUMBER_MAXIMUM_INCLUSIVE.getValue()); if (!pickedInteger.contains(number)) { pickedInteger.add(number); } diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java index 429625c..cf8fe47 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -1,5 +1,7 @@ package baseball.model; +import static baseball.config.NumberConfig.NUMBER_LENGTH; + import baseball.view.OutputView; public class Result { @@ -29,6 +31,6 @@ public void print() { } public boolean checkGameOver() { - return strikeCount == 3; + return strikeCount == NUMBER_LENGTH.getValue(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index f69feec..a267e3a 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,5 +1,6 @@ package baseball.view; +import static baseball.config.OutputViewConfig.GAME_OVER; import static baseball.config.OutputViewConfig.GAME_START; import static baseball.config.OutputViewConfig.NOTHING; import static baseball.config.OutputViewConfig.REQUEST_PLAYER_NUMBER; @@ -23,6 +24,10 @@ public static void printNothing() { System.out.println(NOTHING.getMessage()); } + public static void printGameOver() { + System.out.println(GAME_OVER.getMessage()); + } + public static void printBallCount(int ballCount) { String result = String.format("%dλ³Ό", ballCount); System.out.println(result); @@ -37,8 +42,4 @@ public static void printBallAndStrikeCount(int ballCount, int strikeCount) { String result = String.format("%dλ³Ό %d슀트라이크", ballCount, strikeCount); System.out.println(result); } - - public static void printGameOver() { - System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); - } } From 04d922912a90096bc5ad38928bb783ba0e81aef1 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 13:31:47 +0900 Subject: [PATCH 28/63] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20-=20=EC=83=81=EC=88=98=20=EC=84=A0=EC=96=B8=EB=B6=80=20?= =?UTF-8?q?=EA=B0=9C=ED=96=89=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 1 - src/main/java/baseball/model/Number.java | 1 - src/main/java/baseball/model/Result.java | 1 - src/main/java/baseball/validator/NumberValidator.java | 1 - src/main/java/baseball/view/InputView.java | 1 - 5 files changed, 5 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index c82a99f..0443ab5 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -3,7 +3,6 @@ import baseball.controller.Game; public class Application { - public static void main(String[] args) { Game game = new Game(); game.start(); diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index ee568c5..b4b6efe 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -16,7 +16,6 @@ import java.util.List; public class Number { - private final String value; private Number(String value) { diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java index cf8fe47..8b6a539 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -5,7 +5,6 @@ import baseball.view.OutputView; public class Result { - private int ballCount; private int strikeCount; diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index 81fd1f7..d084c02 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -4,7 +4,6 @@ import static baseball.config.NumberConfig.NUMBER_LENGTH; public class NumberValidator { - public static void validateNumberLength(final String number) { if (!isValidLength(number)) { throw new IllegalArgumentException("number Length is different from the system setting"); diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index e7e1170..9b2a49e 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,7 +3,6 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - public static String requestUserNumber() { OutputView.printRequestNumber(); return Console.readLine(); From 5e9b6c2767626e335c457d933f1637f4db92ca8b Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 16:24:21 +0900 Subject: [PATCH 29/63] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0f9d7bc..a93984b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,19 +3,19 @@ ## ✨  κΈ°λŠ₯ κ΅¬ν˜„ List <ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μˆœμ„œ> - βœ…1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. - - βœ…μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자 3개 + - βœ…μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자 3개 - βœ…κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ : `숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.` - βœ…μ‚¬μš©μžμ—κ²Œ `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. - - βœ…μž…λ ₯받은 input이 3μžλ¦¬κ°€ 아닐 경우 μ˜ˆμ™Έμ²˜λ¦¬ - - βœ…μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ - - βœ…μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - βœ…μž…λ ₯받은 input이 3μžλ¦¬κ°€ 아닐 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - βœ…μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - βœ…μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ - βœ…μ‚¬μš©μž inputκ³Ό 랜덀 생성 μ •μˆ˜λ₯Ό 비ꡐ해 좜λ ₯ν•  힌트λ₯Ό κ³„μ‚°ν•œλ‹€. - - βœ…λ‹€λ₯Έ 자리 같은 숫자의 갯수 n개 : `nλ³Ό` - - βœ…κ°™μ€ 자리 같은 숫자 n개: `n슀트라이크` - - βœ…μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 같이 μ‘΄μž¬ν•  λ•Œ : `nλ³Ό n슀트라이크` - - βœ…κ°™μ€ μˆ«μžκ°€ 1κ°œλ„ μ—†μœΌλ©΄ : `λ‚«μ‹±` -- βŒκ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ - - ❌3슀트라이크 상황 : `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ - βŒκ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` - - βŒμ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. - - ❌3μŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. + - βœ…λ‹€λ₯Έ 자리 같은 숫자의 갯수 n개 : `nλ³Ό` + - βœ…κ°™μ€ 자리 같은 숫자 n개: `n슀트라이크` + - βœ…μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 같이 μ‘΄μž¬ν•  λ•Œ : `nλ³Ό n슀트라이크` + - βœ…κ°™μ€ μˆ«μžκ°€ 1κ°œλ„ μ—†μœΌλ©΄ : `λ‚«μ‹±` +- βœ…κ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ + - βœ…3슀트라이크 상황 : `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ + βœ…κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` + - βœ…μ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. + - βœ…3μŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. From 8962557b0ad74f78e966e334fe9c27010e24300b Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 16:42:00 +0900 Subject: [PATCH 30/63] =?UTF-8?q?feat:=20Result=20=EB=A9=A4=EB=B2=84?= =?UTF-8?q?=EB=B3=80=EC=88=98=20final=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/Result.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java index 8b6a539..6063e5e 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/model/Result.java @@ -1,12 +1,12 @@ package baseball.model; -import static baseball.config.NumberConfig.NUMBER_LENGTH; - import baseball.view.OutputView; +import static baseball.config.NumberConfig.NUMBER_LENGTH; + public class Result { - private int ballCount; - private int strikeCount; + private final int ballCount; + private final int strikeCount; private Result(final Number playerNumber, final Number computerNumber) { ballCount = playerNumber.countBallCount(computerNumber); From b84f7801a2c4c15b7bf43dc2f526d68ede1bbde1 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sat, 21 Oct 2023 16:42:24 +0900 Subject: [PATCH 31/63] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/Number.java | 27 ++++++++------------- src/main/java/baseball/view/OutputView.java | 9 ++----- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/model/Number.java index b4b6efe..55e6ffc 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/model/Number.java @@ -1,20 +1,16 @@ package baseball.model; -import static baseball.config.NumberConfig.NUMBER_LENGTH; -import static baseball.config.NumberConfig.NUMBER_MAXIMUM_INCLUSIVE; -import static baseball.config.NumberConfig.NUMBER_MINIMUM_INCLUSIVE; -import static baseball.validator.NumberValidator.validateContainDuplicatedNumber; -import static baseball.validator.NumberValidator.validateContainOnlyNumber; -import static baseball.validator.NumberValidator.validateEmpty; -import static baseball.validator.NumberValidator.validateNumberLength; -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; -import static java.lang.String.valueOf; -import static java.util.stream.Collectors.joining; - import baseball.view.InputView; + import java.util.ArrayList; import java.util.List; +import static baseball.config.NumberConfig.*; +import static baseball.validator.NumberValidator.*; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; +import static java.lang.String.valueOf; +import static java.util.stream.Collectors.joining; + public class Number { private final String value; @@ -44,7 +40,7 @@ public static Number inputPlayerNumber() { } public int countBallCount(final Number computerNumber) { - int ret = 0; + int ballCount = 0; String playerNumber = this.getValue(); String compareNumber = computerNumber.getValue(); @@ -53,10 +49,10 @@ public int countBallCount(final Number computerNumber) { char compareDigit = compareNumber.charAt(i); if (playerDigit != compareDigit && compareNumber.contains(valueOf(playerDigit))) { - ret++; + ballCount++; } } - return ret; + return ballCount; } public int countStrikeCount(final Number computerNumber) { @@ -78,9 +74,6 @@ private static String convertIntegerListToString(List pickedInteger) { .collect(joining("")); } - /** - * getNumber() μ™ΈλΆ€ κ°μ²΄μ—μ„œ 값을 κΊΌλ‚΄μ§€ λͺ»ν•˜λ„둝 private둜 μ œν•œ - */ public String getValue() { return value; } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index a267e3a..0fdf057 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,10 +1,6 @@ package baseball.view; -import static baseball.config.OutputViewConfig.GAME_OVER; -import static baseball.config.OutputViewConfig.GAME_START; -import static baseball.config.OutputViewConfig.NOTHING; -import static baseball.config.OutputViewConfig.REQUEST_PLAYER_NUMBER; -import static baseball.config.OutputViewConfig.REQUEST_RESTART_OR_EXIT; +import static baseball.config.OutputViewConfig.*; public class OutputView { public static void printRequestNumber() { @@ -14,8 +10,7 @@ public static void printRequestNumber() { public static void printGameStart() { System.out.println(GAME_START.getMessage()); } - - + public static void printRequestRestartOrExit() { System.out.println(REQUEST_RESTART_OR_EXIT.getMessage()); } From 7acc36b9c7318aeebafe0261a81f903a40a01164 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 11:47:15 +0900 Subject: [PATCH 32/63] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20(model=20->=20domain)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 9 +++++---- src/main/java/baseball/{model => domain}/Number.java | 2 +- src/main/java/baseball/{model => domain}/Result.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) rename src/main/java/baseball/{model => domain}/Number.java (99%) rename src/main/java/baseball/{model => domain}/Result.java (97%) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 22686cc..f0b0ffb 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,13 +1,14 @@ package baseball.controller; -import static baseball.config.GameConfig.GAME_RESTART_FLAG; - -import baseball.model.Number; -import baseball.model.Result; +import baseball.domain.Number; +import baseball.domain.Result; import baseball.view.InputView; import baseball.view.OutputView; + import java.util.Objects; +import static baseball.config.GameConfig.GAME_RESTART_FLAG; + public class Game { private Number computerNumber; private Number playerNumber; diff --git a/src/main/java/baseball/model/Number.java b/src/main/java/baseball/domain/Number.java similarity index 99% rename from src/main/java/baseball/model/Number.java rename to src/main/java/baseball/domain/Number.java index 55e6ffc..85b4e20 100644 --- a/src/main/java/baseball/model/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -1,4 +1,4 @@ -package baseball.model; +package baseball.domain; import baseball.view.InputView; diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/domain/Result.java similarity index 97% rename from src/main/java/baseball/model/Result.java rename to src/main/java/baseball/domain/Result.java index 6063e5e..96bc4b7 100644 --- a/src/main/java/baseball/model/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -1,4 +1,4 @@ -package baseball.model; +package baseball.domain; import baseball.view.OutputView; From ba6bd2c6b65e771b8c69383214515f660fed0681 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 13:14:53 +0900 Subject: [PATCH 33/63] =?UTF-8?q?feat:=20Number=20=EC=9D=BC=EA=B8=89=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 10 +-- src/main/java/baseball/domain/Number.java | 80 -------------------- src/main/java/baseball/domain/Numbers.java | 81 +++++++++++++++++++++ src/main/java/baseball/domain/Result.java | 4 +- src/main/java/baseball/view/InputView.java | 2 +- 5 files changed, 89 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/baseball/domain/Number.java create mode 100644 src/main/java/baseball/domain/Numbers.java diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index f0b0ffb..d9dca43 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,6 +1,6 @@ package baseball.controller; -import baseball.domain.Number; +import baseball.domain.Numbers; import baseball.domain.Result; import baseball.view.InputView; import baseball.view.OutputView; @@ -10,21 +10,21 @@ import static baseball.config.GameConfig.GAME_RESTART_FLAG; public class Game { - private Number computerNumber; - private Number playerNumber; + private Numbers computerNumber; + private Numbers playerNumber; private Result result; public void start() { OutputView.printGameStart(); do { - computerNumber = Number.generateRandomNumber(); + computerNumber = Numbers.generateRandomNumbers(); play(); } while (!isRestart()); } private void play() { do { - playerNumber = Number.inputPlayerNumber(); + playerNumber = Numbers.inputPlayerNumbers(); result = Result.create(playerNumber, computerNumber); result.print(); } while (!result.checkGameOver()); diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java deleted file mode 100644 index 85b4e20..0000000 --- a/src/main/java/baseball/domain/Number.java +++ /dev/null @@ -1,80 +0,0 @@ -package baseball.domain; - -import baseball.view.InputView; - -import java.util.ArrayList; -import java.util.List; - -import static baseball.config.NumberConfig.*; -import static baseball.validator.NumberValidator.*; -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; -import static java.lang.String.valueOf; -import static java.util.stream.Collectors.joining; - -public class Number { - private final String value; - - private Number(String value) { - validateEmpty(value); - validateNumberLength(value); - validateContainOnlyNumber(value); - validateContainDuplicatedNumber(value); - this.value = value; - } - - public static Number generateRandomNumber() { - List pickedInteger = new ArrayList<>(); - while (pickedInteger.size() < NUMBER_LENGTH.getValue()) { - int number = pickNumberInRange(NUMBER_MINIMUM_INCLUSIVE.getValue(), NUMBER_MAXIMUM_INCLUSIVE.getValue()); - if (!pickedInteger.contains(number)) { - pickedInteger.add(number); - } - } - String number = convertIntegerListToString(pickedInteger); - return new Number(number); - } - - public static Number inputPlayerNumber() { - String number = InputView.requestUserNumber(); - return new Number(number); - } - - public int countBallCount(final Number computerNumber) { - int ballCount = 0; - String playerNumber = this.getValue(); - String compareNumber = computerNumber.getValue(); - - for (int i = 0; i < playerNumber.length(); i++) { - char playerDigit = playerNumber.charAt(i); - char compareDigit = compareNumber.charAt(i); - - if (playerDigit != compareDigit && compareNumber.contains(valueOf(playerDigit))) { - ballCount++; - } - } - return ballCount; - } - - public int countStrikeCount(final Number computerNumber) { - int strikeCount = 0; - String playerNumber = this.getValue(); - String compareNumber = computerNumber.getValue(); - - for (int i = 0; i < NUMBER_LENGTH.getValue(); i++) { - if (playerNumber.charAt(i) == compareNumber.charAt(i)) { - strikeCount++; - } - } - return strikeCount; - } - - private static String convertIntegerListToString(List pickedInteger) { - return pickedInteger.stream() - .map(Object::toString) - .collect(joining("")); - } - - public String getValue() { - return value; - } -} diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java new file mode 100644 index 0000000..23533a3 --- /dev/null +++ b/src/main/java/baseball/domain/Numbers.java @@ -0,0 +1,81 @@ +package baseball.domain; + +import baseball.view.InputView; + +import java.util.ArrayList; +import java.util.List; + +import static baseball.config.NumberConfig.*; +import static baseball.validator.NumberValidator.*; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; +import static java.lang.String.valueOf; + +public class Numbers { + private final List number; + + // Player Number Constructor + private Numbers(String input) { + validateEmpty(input); + validateNumberLength(input); + validateContainOnlyNumber(input); + validateContainDuplicatedNumber(input); + + this.number = convertInputNumbers(input); + } + + // Computer Number Constructor + private Numbers(List computerNumber) { + this.number = computerNumber; + } + + // Player Number Static Factory Method + public static Numbers inputPlayerNumbers() { + String playerNumbers = InputView.requestUserNumbers(); + return new Numbers(playerNumbers); + } + + // Computer Number Static Factory Method + public static Numbers generateRandomNumbers() { + List randomNumbers = new ArrayList<>(); + while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { + int number = pickNumberInRange(NUMBER_MINIMUM_INCLUSIVE.getValue(), NUMBER_MAXIMUM_INCLUSIVE.getValue()); + if (!randomNumbers.contains(number)) { + randomNumbers.add(number); + } + } + return new Numbers(randomNumbers); + } + + public int countBallCount(final Numbers computerNumbers) { + int ballCount = 0; + for (int i = 0; i < playerNumber.length(); i++) { + char playerDigit = playerNumber.charAt(i); + char compareDigit = compareNumber.charAt(i); + + if (playerDigit != compareDigit && compareNumber.contains(valueOf(playerDigit))) { + ballCount++; + } + } + return ballCount; + } + + public int countStrikeCount(final Numbers computerNumber) { + int strikeCount = 0; + String playerNumber = this.getInput(); + String compareNumber = computerNumber.getInput(); + + for (int i = 0; i < NUMBER_LENGTH.getValue(); i++) { + if (playerNumber.charAt(i) == compareNumber.charAt(i)) { + strikeCount++; + } + } + return strikeCount; + } + + private List convertInputNumbers(String input) { + return input.chars() + .filter(Character::isDigit) + .mapToObj(Character::getNumericValue) + .toList(); + } +} diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 96bc4b7..2bd80d2 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -8,12 +8,12 @@ public class Result { private final int ballCount; private final int strikeCount; - private Result(final Number playerNumber, final Number computerNumber) { + private Result(final Numbers playerNumber, final Numbers computerNumber) { ballCount = playerNumber.countBallCount(computerNumber); strikeCount = playerNumber.countStrikeCount(computerNumber); } - public static Result create(final Number playerNumber, final Number computerNumber) { + public static Result create(final Numbers playerNumber, final Numbers computerNumber) { return new Result(playerNumber, computerNumber); } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 9b2a49e..ea257ba 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,7 +3,7 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - public static String requestUserNumber() { + public static String requestUserNumbers() { OutputView.printRequestNumber(); return Console.readLine(); } From b1dd4e1d1e063453682041044dca3a274db513d7 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 14:33:11 +0900 Subject: [PATCH 34/63] =?UTF-8?q?fix:=20BallCount=20/=20StrikeCount?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EC=B9=B4=EC=9A=B4?= =?UTF-8?q?=ED=8A=B8=20=ED=95=98=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88=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/controller/Game.java | 10 +-- src/main/java/baseball/domain/Number.java | 83 +++++++++++++++++++ src/main/java/baseball/domain/Result.java | 10 +-- .../baseball/validator/NumberValidator.java | 4 +- 4 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 src/main/java/baseball/domain/Number.java diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index d9dca43..419824d 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -1,6 +1,6 @@ package baseball.controller; -import baseball.domain.Numbers; +import baseball.domain.Number; import baseball.domain.Result; import baseball.view.InputView; import baseball.view.OutputView; @@ -10,21 +10,21 @@ import static baseball.config.GameConfig.GAME_RESTART_FLAG; public class Game { - private Numbers computerNumber; - private Numbers playerNumber; + private Number computerNumber; + private Number playerNumber; private Result result; public void start() { OutputView.printGameStart(); do { - computerNumber = Numbers.generateRandomNumbers(); + computerNumber = Number.generateRandomNumbers(); play(); } while (!isRestart()); } private void play() { do { - playerNumber = Numbers.inputPlayerNumbers(); + playerNumber = Number.inputPlayerNumbers(); result = Result.create(playerNumber, computerNumber); result.print(); } while (!result.checkGameOver()); diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java new file mode 100644 index 0000000..74d10b7 --- /dev/null +++ b/src/main/java/baseball/domain/Number.java @@ -0,0 +1,83 @@ +package baseball.domain; + +import baseball.view.InputView; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import static baseball.validator.NumberValidator.*; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; + +public class Number { + private static final int RANDOM_NUMBER_MINIMUM = 1; + private static final int RANDOM_NUMBER_MAXIMUM = 9; + private static final int NUMBER_LENGTH = 3; + + private final List numbers; + + // Player Number Constructor + private Number(String input) { + validateEmpty(input); + validateNumberLength(input); + validateContainOnlyNumber(input); + validateContainDuplicatedNumber(input); + + this.numbers = convertInputNumber(input); + } + + // Computer Number Constructor + private Number(List computerNumber) { + this.numbers = computerNumber; + } + + // Player Number Static Factory Method + public static Number inputPlayerNumbers() { + String playerNumbers = InputView.requestUserNumbers(); + return new Number(playerNumbers); + } + + // Computer Number Static Factory Method + public static Number generateRandomNumbers() { + List randomNumbers = new ArrayList<>(); + while (randomNumbers.size() < NUMBER_LENGTH) { + int number = pickNumberInRange(RANDOM_NUMBER_MINIMUM, RANDOM_NUMBER_MAXIMUM); + if (!randomNumbers.contains(number)) { + randomNumbers.add(number); + } + } + return new Number(randomNumbers); + } + + private List convertInputNumber(String input) { + return input.chars() + .mapToObj(Character::getNumericValue) + .toList(); + } + + public int countBallCount(final Number comparableNumber) { + return (int) IntStream.range(0, numbers.size()) + .filter(i -> comparableNumber.isBall(numbers.get(i), i)) + .count(); + } + + public int countStrikeCount(final Number comparableNumber) { + return (int) IntStream.range(0, numbers.size()) + .filter(i -> comparableNumber.isStrike(numbers.get(i), i)) + .count(); + } + + // Ball : Contain their number at other position + private boolean isBall(int number, int digit) { + return !isStrike(number, digit) && numbers.contains(number); + } + + // Strike : Contain their number at same digit + private boolean isStrike(int number, int digit) { + return number == numbers.get(digit); + } + + public List getNumbers() { + return numbers; + } +} diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 2bd80d2..5e98b8d 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -2,18 +2,18 @@ import baseball.view.OutputView; -import static baseball.config.NumberConfig.NUMBER_LENGTH; - public class Result { + private static final int NUMBER_LENGTH = 3; + private final int ballCount; private final int strikeCount; - private Result(final Numbers playerNumber, final Numbers computerNumber) { + private Result(final Number playerNumber, final Number computerNumber) { ballCount = playerNumber.countBallCount(computerNumber); strikeCount = playerNumber.countStrikeCount(computerNumber); } - public static Result create(final Numbers playerNumber, final Numbers computerNumber) { + public static Result create(final Number playerNumber, final Number computerNumber) { return new Result(playerNumber, computerNumber); } @@ -30,6 +30,6 @@ public void print() { } public boolean checkGameOver() { - return strikeCount == NUMBER_LENGTH.getValue(); + return strikeCount == NUMBER_LENGTH; } } diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index d084c02..bad0630 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -1,8 +1,6 @@ package baseball.validator; -import static baseball.config.NumberConfig.NUMBER_LENGTH; - public class NumberValidator { public static void validateNumberLength(final String number) { if (!isValidLength(number)) { @@ -29,7 +27,7 @@ public static void validateEmpty(final String number) { } private static boolean isValidLength(final String number) { - return number.length() == NUMBER_LENGTH.getValue(); + return number.length() == 3; } private static boolean isValidNumber(final String number) { From fa90c35a1cbc4f829e8d0a3b918c22f3cc5b93d8 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 14:33:31 +0900 Subject: [PATCH 35/63] =?UTF-8?q?refactor:=20=EC=A0=84=EC=97=AD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A0=EC=96=B8=EB=90=98=EC=96=B4=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20Config=20=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/config/NumberConfig.java | 17 ---- src/main/java/baseball/domain/Numbers.java | 81 ------------------- 2 files changed, 98 deletions(-) delete mode 100644 src/main/java/baseball/config/NumberConfig.java delete mode 100644 src/main/java/baseball/domain/Numbers.java diff --git a/src/main/java/baseball/config/NumberConfig.java b/src/main/java/baseball/config/NumberConfig.java deleted file mode 100644 index 7878652..0000000 --- a/src/main/java/baseball/config/NumberConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package baseball.config; - -public enum NumberConfig { - NUMBER_LENGTH(3), - NUMBER_MINIMUM_INCLUSIVE(1), - NUMBER_MAXIMUM_INCLUSIVE(9); - - private final int value; - - NumberConfig(int value) { - this.value = value; - } - - public int getValue() { - return value; - } -} diff --git a/src/main/java/baseball/domain/Numbers.java b/src/main/java/baseball/domain/Numbers.java deleted file mode 100644 index 23533a3..0000000 --- a/src/main/java/baseball/domain/Numbers.java +++ /dev/null @@ -1,81 +0,0 @@ -package baseball.domain; - -import baseball.view.InputView; - -import java.util.ArrayList; -import java.util.List; - -import static baseball.config.NumberConfig.*; -import static baseball.validator.NumberValidator.*; -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; -import static java.lang.String.valueOf; - -public class Numbers { - private final List number; - - // Player Number Constructor - private Numbers(String input) { - validateEmpty(input); - validateNumberLength(input); - validateContainOnlyNumber(input); - validateContainDuplicatedNumber(input); - - this.number = convertInputNumbers(input); - } - - // Computer Number Constructor - private Numbers(List computerNumber) { - this.number = computerNumber; - } - - // Player Number Static Factory Method - public static Numbers inputPlayerNumbers() { - String playerNumbers = InputView.requestUserNumbers(); - return new Numbers(playerNumbers); - } - - // Computer Number Static Factory Method - public static Numbers generateRandomNumbers() { - List randomNumbers = new ArrayList<>(); - while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { - int number = pickNumberInRange(NUMBER_MINIMUM_INCLUSIVE.getValue(), NUMBER_MAXIMUM_INCLUSIVE.getValue()); - if (!randomNumbers.contains(number)) { - randomNumbers.add(number); - } - } - return new Numbers(randomNumbers); - } - - public int countBallCount(final Numbers computerNumbers) { - int ballCount = 0; - for (int i = 0; i < playerNumber.length(); i++) { - char playerDigit = playerNumber.charAt(i); - char compareDigit = compareNumber.charAt(i); - - if (playerDigit != compareDigit && compareNumber.contains(valueOf(playerDigit))) { - ballCount++; - } - } - return ballCount; - } - - public int countStrikeCount(final Numbers computerNumber) { - int strikeCount = 0; - String playerNumber = this.getInput(); - String compareNumber = computerNumber.getInput(); - - for (int i = 0; i < NUMBER_LENGTH.getValue(); i++) { - if (playerNumber.charAt(i) == compareNumber.charAt(i)) { - strikeCount++; - } - } - return strikeCount; - } - - private List convertInputNumbers(String input) { - return input.chars() - .filter(Character::isDigit) - .mapToObj(Character::getNumericValue) - .toList(); - } -} From 3f7bb2e3e8172e8802e13af54ad5075526931955 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 14:35:39 +0900 Subject: [PATCH 36/63] =?UTF-8?q?feat:=20Getter=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Number.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 74d10b7..89d2f5b 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -76,8 +76,4 @@ private boolean isBall(int number, int digit) { private boolean isStrike(int number, int digit) { return number == numbers.get(digit); } - - public List getNumbers() { - return numbers; - } } From 7f7d7e8eaa8c64557e95ac1f634f2f3a2cb95fa2 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 15:08:13 +0900 Subject: [PATCH 37/63] =?UTF-8?q?refactor:=20=EC=A7=80=EC=97=AD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=9E=AC=EC=B0=B8=EC=A1=B0=20=EC=9D=B4=EC=8A=88=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=9D=84=20=EC=9C=84=ED=95=B4=20do-while?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 22 ++++++++++----------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 419824d..3f3c20d 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -10,24 +10,22 @@ import static baseball.config.GameConfig.GAME_RESTART_FLAG; public class Game { - private Number computerNumber; - private Number playerNumber; - private Result result; - public void start() { - OutputView.printGameStart(); + OutputView.printInitialGameStart(); do { - computerNumber = Number.generateRandomNumbers(); - play(); + play(Number.generateRandomNumbers()); } while (!isRestart()); } - private void play() { - do { - playerNumber = Number.inputPlayerNumbers(); - result = Result.create(playerNumber, computerNumber); + private void play(Number computerNumber) { + while (true) { + Number playerNumber = Number.inputPlayerNumbers(); + Result result = Result.create(playerNumber, computerNumber); result.print(); - } while (!result.checkGameOver()); + if (result.checkGameOver()) { + break; + } + } } private static boolean isRestart() { From ac8b5bdbee0fd493afa4c7bc06b1b01daf718ee2 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 15:08:25 +0900 Subject: [PATCH 38/63] =?UTF-8?q?refactor:=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EC=A7=81=EA=B4=80=EC=A0=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/OutputView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 0fdf057..ad50035 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -7,10 +7,10 @@ public static void printRequestNumber() { System.out.print(REQUEST_PLAYER_NUMBER.getMessage()); } - public static void printGameStart() { + public static void printInitialGameStart() { System.out.println(GAME_START.getMessage()); } - + public static void printRequestRestartOrExit() { System.out.println(REQUEST_RESTART_OR_EXIT.getMessage()); } From 4a033754e25288cdc9a561bb9b6f84bebf66d717 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 15:09:47 +0900 Subject: [PATCH 39/63] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=ED=94=8C=EB=9E=98=EA=B7=B8=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=EB=B3=80=EC=88=98=EB=A1=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/baseball/config/GameConfig.java | 15 --------------- src/main/java/baseball/controller/Game.java | 6 +++--- 2 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 src/main/java/baseball/config/GameConfig.java diff --git a/src/main/java/baseball/config/GameConfig.java b/src/main/java/baseball/config/GameConfig.java deleted file mode 100644 index ae0c26c..0000000 --- a/src/main/java/baseball/config/GameConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package baseball.config; - -public enum GameConfig { - GAME_RESTART_FLAG("2"); - - private final String value; - - GameConfig(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 3f3c20d..c0b809a 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -7,9 +7,9 @@ import java.util.Objects; -import static baseball.config.GameConfig.GAME_RESTART_FLAG; - public class Game { + private static final String GAME_RESTART_FLAG = "2"; + public void start() { OutputView.printInitialGameStart(); do { @@ -29,6 +29,6 @@ private void play(Number computerNumber) { } private static boolean isRestart() { - return Objects.equals(InputView.requestRestartOrExit(), GAME_RESTART_FLAG.getValue()); + return Objects.equals(InputView.requestRestartOrExit(), GAME_RESTART_FLAG); } } From febd594338102b9f565728b9decf58c3cfebb1fc Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 15:25:18 +0900 Subject: [PATCH 40/63] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=20viewConfig=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/config/OutputViewConfig.java | 20 ------------------- src/main/java/baseball/view/OutputView.java | 18 ++++++++++------- 2 files changed, 11 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/baseball/config/OutputViewConfig.java diff --git a/src/main/java/baseball/config/OutputViewConfig.java b/src/main/java/baseball/config/OutputViewConfig.java deleted file mode 100644 index 83214c4..0000000 --- a/src/main/java/baseball/config/OutputViewConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package baseball.config; - -public enum OutputViewConfig { - GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."), - REQUEST_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), - REQUEST_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."), - NOTHING("λ‚«μ‹±"), - GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); - - - private final String message; - - OutputViewConfig(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index ad50035..ffbc9d3 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,26 +1,30 @@ package baseball.view; -import static baseball.config.OutputViewConfig.*; - public class OutputView { + private static final String GAME_START = "숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."; + private static final String REQUEST_PLAYER_NUMBER = "숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "; + private static final String REQUEST_RESTART_OR_EXIT = "κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."; + private static final String NOTHING = "λ‚«μ‹±"; + private static final String GAME_OVER = "3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"; + public static void printRequestNumber() { - System.out.print(REQUEST_PLAYER_NUMBER.getMessage()); + System.out.print(REQUEST_PLAYER_NUMBER); } public static void printInitialGameStart() { - System.out.println(GAME_START.getMessage()); + System.out.println(GAME_START); } public static void printRequestRestartOrExit() { - System.out.println(REQUEST_RESTART_OR_EXIT.getMessage()); + System.out.println(REQUEST_RESTART_OR_EXIT); } public static void printNothing() { - System.out.println(NOTHING.getMessage()); + System.out.println(NOTHING); } public static void printGameOver() { - System.out.println(GAME_OVER.getMessage()); + System.out.println(GAME_OVER); } public static void printBallCount(int ballCount) { From 1999b2cf4eea14f5acd03611b890b59ac4162246 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 15:32:58 +0900 Subject: [PATCH 41/63] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98,=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=AA=85=20=EC=A7=81=EA=B4=80?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EA=B0=9C=EC=84=A0=20(request=20-?= =?UTF-8?q?>=20ask)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 9 +++++++-- src/main/java/baseball/domain/Number.java | 12 ++++-------- src/main/java/baseball/view/InputView.java | 8 ++++---- src/main/java/baseball/view/OutputView.java | 12 ++++++------ 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index c0b809a..5a2850a 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -8,12 +8,17 @@ import java.util.Objects; public class Game { + private static final int RANDOM_NUMBER_MINIMUM = 1; + private static final int RANDOM_NUMBER_MAXIMUM = 9; + private static final int NUMBER_LENGTH = 3; private static final String GAME_RESTART_FLAG = "2"; public void start() { OutputView.printInitialGameStart(); do { - play(Number.generateRandomNumbers()); + play(Number.generateRandomNumbers( + RANDOM_NUMBER_MINIMUM, RANDOM_NUMBER_MAXIMUM, NUMBER_LENGTH + )); } while (!isRestart()); } @@ -29,6 +34,6 @@ private void play(Number computerNumber) { } private static boolean isRestart() { - return Objects.equals(InputView.requestRestartOrExit(), GAME_RESTART_FLAG); + return Objects.equals(InputView.askRestartOrExit(), GAME_RESTART_FLAG); } } diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 89d2f5b..dc5c8eb 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -10,10 +10,6 @@ import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; public class Number { - private static final int RANDOM_NUMBER_MINIMUM = 1; - private static final int RANDOM_NUMBER_MAXIMUM = 9; - private static final int NUMBER_LENGTH = 3; - private final List numbers; // Player Number Constructor @@ -33,15 +29,15 @@ private Number(List computerNumber) { // Player Number Static Factory Method public static Number inputPlayerNumbers() { - String playerNumbers = InputView.requestUserNumbers(); + String playerNumbers = InputView.askUserNumbers(); return new Number(playerNumbers); } // Computer Number Static Factory Method - public static Number generateRandomNumbers() { + public static Number generateRandomNumbers(int a, int b, int c) { List randomNumbers = new ArrayList<>(); - while (randomNumbers.size() < NUMBER_LENGTH) { - int number = pickNumberInRange(RANDOM_NUMBER_MINIMUM, RANDOM_NUMBER_MAXIMUM); + while (randomNumbers.size() < c) { + int number = pickNumberInRange(a, b); if (!randomNumbers.contains(number)) { randomNumbers.add(number); } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index ea257ba..afff7ec 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,14 +3,14 @@ import camp.nextstep.edu.missionutils.Console; public class InputView { - public static String requestUserNumbers() { - OutputView.printRequestNumber(); + public static String askUserNumbers() { + OutputView.printAskNumber(); return Console.readLine(); } - public static String requestRestartOrExit() { + public static String askRestartOrExit() { OutputView.printGameOver(); - OutputView.printRequestRestartOrExit(); + OutputView.printAskRestartOrExit(); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index ffbc9d3..0d9cf73 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -2,21 +2,21 @@ public class OutputView { private static final String GAME_START = "숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."; - private static final String REQUEST_PLAYER_NUMBER = "숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "; - private static final String REQUEST_RESTART_OR_EXIT = "κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."; + private static final String ASK_PLAYER_NUMBER = "숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "; + private static final String ASK_RESTART_OR_EXIT = "κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."; private static final String NOTHING = "λ‚«μ‹±"; private static final String GAME_OVER = "3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"; - public static void printRequestNumber() { - System.out.print(REQUEST_PLAYER_NUMBER); + public static void printAskNumber() { + System.out.print(ASK_PLAYER_NUMBER); } public static void printInitialGameStart() { System.out.println(GAME_START); } - public static void printRequestRestartOrExit() { - System.out.println(REQUEST_RESTART_OR_EXIT); + public static void printAskRestartOrExit() { + System.out.println(ASK_RESTART_OR_EXIT); } public static void printNothing() { From 99aa21941ac4835b925597ea3547d04e335d03ef Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 16:00:53 +0900 Subject: [PATCH 42/63] =?UTF-8?q?refactor:=20Result=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=20=EB=B0=A9=EC=8B=9D=20=EA=B0=9C=EC=84=A0=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20Enum=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/config/GlobalConfig.java | 23 +++++++++++++++++++ .../java/baseball/config/ResultStatus.java | 19 +++++++++++++++ src/main/java/baseball/controller/Game.java | 13 ++++------- src/main/java/baseball/domain/Number.java | 7 +++--- src/main/java/baseball/domain/Result.java | 8 +++---- 5 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 src/main/java/baseball/config/GlobalConfig.java create mode 100644 src/main/java/baseball/config/ResultStatus.java diff --git a/src/main/java/baseball/config/GlobalConfig.java b/src/main/java/baseball/config/GlobalConfig.java new file mode 100644 index 0000000..6c2e3f0 --- /dev/null +++ b/src/main/java/baseball/config/GlobalConfig.java @@ -0,0 +1,23 @@ +package baseball.config; + +public enum GlobalConfig { + NUMBER_LENGTH(3), + RANDOM_NUMBER_MINIMUM(1), + RANDOM_NUMBER_MAXIMUM(9), + GAME_RESTART_FLAG(2); + + private final int value; + + GlobalConfig(int value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/baseball/config/ResultStatus.java b/src/main/java/baseball/config/ResultStatus.java new file mode 100644 index 0000000..cbb071d --- /dev/null +++ b/src/main/java/baseball/config/ResultStatus.java @@ -0,0 +1,19 @@ +package baseball.config; + +public enum ResultStatus { + + NOTHING("λ‚«μ‹±"), + ONLY_BALL("%dλ³Ό"), + ONLY_STRIKE("%d슀트라이크"), + BALL_AND_STRIKE("%dλ³Ό %슀트라이크"); + + private final String value; + + ResultStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 5a2850a..2aedfe4 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -7,18 +7,13 @@ import java.util.Objects; -public class Game { - private static final int RANDOM_NUMBER_MINIMUM = 1; - private static final int RANDOM_NUMBER_MAXIMUM = 9; - private static final int NUMBER_LENGTH = 3; - private static final String GAME_RESTART_FLAG = "2"; +import static baseball.config.GlobalConfig.GAME_RESTART_FLAG; +public class Game { public void start() { OutputView.printInitialGameStart(); do { - play(Number.generateRandomNumbers( - RANDOM_NUMBER_MINIMUM, RANDOM_NUMBER_MAXIMUM, NUMBER_LENGTH - )); + play(Number.generateRandomNumbers()); } while (!isRestart()); } @@ -34,6 +29,6 @@ private void play(Number computerNumber) { } private static boolean isRestart() { - return Objects.equals(InputView.askRestartOrExit(), GAME_RESTART_FLAG); + return Objects.equals(InputView.askRestartOrExit(), GAME_RESTART_FLAG.toString()); } } diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index dc5c8eb..07f0e77 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.IntStream; +import static baseball.config.GlobalConfig.*; import static baseball.validator.NumberValidator.*; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; @@ -34,10 +35,10 @@ public static Number inputPlayerNumbers() { } // Computer Number Static Factory Method - public static Number generateRandomNumbers(int a, int b, int c) { + public static Number generateRandomNumbers() { List randomNumbers = new ArrayList<>(); - while (randomNumbers.size() < c) { - int number = pickNumberInRange(a, b); + while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { + int number = pickNumberInRange(RANDOM_NUMBER_MAXIMUM.getValue(), RANDOM_NUMBER_MINIMUM.getValue()); if (!randomNumbers.contains(number)) { randomNumbers.add(number); } diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 5e98b8d..840fea0 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -2,9 +2,9 @@ import baseball.view.OutputView; -public class Result { - private static final int NUMBER_LENGTH = 3; +import static baseball.config.GlobalConfig.NUMBER_LENGTH; +public class Result { private final int ballCount; private final int strikeCount; @@ -16,7 +16,7 @@ private Result(final Number playerNumber, final Number computerNumber) { public static Result create(final Number playerNumber, final Number computerNumber) { return new Result(playerNumber, computerNumber); } - + public void print() { if (ballCount == 0 && strikeCount == 0) { OutputView.printNothing(); @@ -30,6 +30,6 @@ public void print() { } public boolean checkGameOver() { - return strikeCount == NUMBER_LENGTH; + return strikeCount == NUMBER_LENGTH.getValue(); } } From 22f1aef1b9228b74914e3b6b08394bb4bc3f9f34 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 16:38:13 +0900 Subject: [PATCH 43/63] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=9E=AC=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=84=B1=20=ED=99=95=EC=9E=A5=20=EB=B0=8F=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=97=B4=EA=B1=B0=ED=98=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=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/baseball/controller/Game.java | 3 +- src/main/java/baseball/domain/Result.java | 46 +++++++++++++++---- .../constants/ResultType.java} | 8 ++-- src/main/java/baseball/view/InputView.java | 8 ++-- src/main/java/baseball/view/OutputView.java | 43 +++-------------- .../baseball/view/constants/PrintMessage.java | 18 ++++++++ 6 files changed, 71 insertions(+), 55 deletions(-) rename src/main/java/baseball/{config/ResultStatus.java => domain/constants/ResultType.java} (60%) create mode 100644 src/main/java/baseball/view/constants/PrintMessage.java diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 2aedfe4..c25a68d 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -8,10 +8,11 @@ import java.util.Objects; import static baseball.config.GlobalConfig.GAME_RESTART_FLAG; +import static baseball.view.constants.PrintMessage.GAME_START; public class Game { public void start() { - OutputView.printInitialGameStart(); + OutputView.printGameInformation(GAME_START); do { play(Number.generateRandomNumbers()); } while (!isRestart()); diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 840fea0..2208ab8 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -1,8 +1,11 @@ package baseball.domain; +import baseball.domain.constants.ResultType; import baseball.view.OutputView; import static baseball.config.GlobalConfig.NUMBER_LENGTH; +import static baseball.domain.constants.ResultType.*; +import static java.lang.String.format; public class Result { private final int ballCount; @@ -16,17 +19,40 @@ private Result(final Number playerNumber, final Number computerNumber) { public static Result create(final Number playerNumber, final Number computerNumber) { return new Result(playerNumber, computerNumber); } - - public void print() { - if (ballCount == 0 && strikeCount == 0) { - OutputView.printNothing(); - } else if (ballCount > 0 && strikeCount > 0) { - OutputView.printBallAndStrikeCount(ballCount, strikeCount); - } else if (ballCount > 0) { - OutputView.printBallCount(ballCount); - } else if (strikeCount > 0) { - OutputView.printStrikeCount(strikeCount); + + private ResultType inspectResultType() { + if (!hasBall() && !hasStrike()) { + return NOTHING; + } else if (hasBall() && hasStrike()) { + return BALL_AND_STRIKE; + } else if (hasBall()) { + return ONLY_BALL; + } else if (hasStrike()) { + return ONLY_STRIKE; } + throw new IllegalArgumentException("result type error"); + } + + private String generateResultMessage(ResultType resultType) { + return switch (resultType) { + case NOTHING -> resultType.getValue(); + case BALL_AND_STRIKE -> format(BALL_AND_STRIKE.getValue(), ballCount, strikeCount); + case ONLY_BALL -> format(ONLY_BALL.getValue(), ballCount); + case ONLY_STRIKE -> format(ONLY_STRIKE.getValue(), strikeCount); + }; + } + + public void print() { + ResultType resultType = inspectResultType(); + OutputView.printResult(generateResultMessage(resultType)); + } + + public boolean hasBall() { + return ballCount > 0; + } + + public boolean hasStrike() { + return strikeCount > 0; } public boolean checkGameOver() { diff --git a/src/main/java/baseball/config/ResultStatus.java b/src/main/java/baseball/domain/constants/ResultType.java similarity index 60% rename from src/main/java/baseball/config/ResultStatus.java rename to src/main/java/baseball/domain/constants/ResultType.java index cbb071d..7f17806 100644 --- a/src/main/java/baseball/config/ResultStatus.java +++ b/src/main/java/baseball/domain/constants/ResultType.java @@ -1,15 +1,15 @@ -package baseball.config; +package baseball.domain.constants; -public enum ResultStatus { +public enum ResultType { NOTHING("λ‚«μ‹±"), ONLY_BALL("%dλ³Ό"), ONLY_STRIKE("%d슀트라이크"), - BALL_AND_STRIKE("%dλ³Ό %슀트라이크"); + BALL_AND_STRIKE("%dλ³Ό %d슀트라이크"); private final String value; - ResultStatus(String value) { + ResultType(String value) { this.value = value; } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index afff7ec..8ca2ef9 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -2,15 +2,17 @@ import camp.nextstep.edu.missionutils.Console; +import static baseball.view.constants.PrintMessage.*; + public class InputView { public static String askUserNumbers() { - OutputView.printAskNumber(); + OutputView.printGameInformation(ASK_PLAYER_NUMBER); return Console.readLine(); } public static String askRestartOrExit() { - OutputView.printGameOver(); - OutputView.printAskRestartOrExit(); + OutputView.printGameInformation(GAME_OVER); + OutputView.printGameInformation(ASK_RESTART_OR_EXIT); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 0d9cf73..42b28d5 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,44 +1,13 @@ package baseball.view; -public class OutputView { - private static final String GAME_START = "숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."; - private static final String ASK_PLAYER_NUMBER = "숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "; - private static final String ASK_RESTART_OR_EXIT = "κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."; - private static final String NOTHING = "λ‚«μ‹±"; - private static final String GAME_OVER = "3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"; - - public static void printAskNumber() { - System.out.print(ASK_PLAYER_NUMBER); - } - - public static void printInitialGameStart() { - System.out.println(GAME_START); - } - - public static void printAskRestartOrExit() { - System.out.println(ASK_RESTART_OR_EXIT); - } +import baseball.view.constants.PrintMessage; - public static void printNothing() { - System.out.println(NOTHING); - } - - public static void printGameOver() { - System.out.println(GAME_OVER); - } - - public static void printBallCount(int ballCount) { - String result = String.format("%dλ³Ό", ballCount); - System.out.println(result); - } - - public static void printStrikeCount(int strikeCount) { - String result = String.format("%d슀트라이크", strikeCount); - System.out.println(result); +public class OutputView { + public static void printGameInformation(PrintMessage message) { + System.out.print(message.getMessage()); } - public static void printBallAndStrikeCount(int ballCount, int strikeCount) { - String result = String.format("%dλ³Ό %d슀트라이크", ballCount, strikeCount); - System.out.println(result); + public static void printResult(String resultMessage) { + System.out.println(resultMessage); } } diff --git a/src/main/java/baseball/view/constants/PrintMessage.java b/src/main/java/baseball/view/constants/PrintMessage.java new file mode 100644 index 0000000..ec09f2e --- /dev/null +++ b/src/main/java/baseball/view/constants/PrintMessage.java @@ -0,0 +1,18 @@ +package baseball.view.constants; + +public enum PrintMessage { + GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."), + ASK_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), + ASK_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."), + GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); + + private final String message; + + PrintMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} From 575e4a562e9304b42425e6b21c7443fd455364d9 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 16:45:16 +0900 Subject: [PATCH 44/63] =?UTF-8?q?refactor:=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=20=EB=B3=80=EA=B2=BD(printGameInformation?= =?UTF-8?q?=20->=20printInformation)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 2 +- src/main/java/baseball/domain/Result.java | 3 ++- src/main/java/baseball/view/InputView.java | 6 +++--- src/main/java/baseball/view/OutputView.java | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index c25a68d..ffdd0ea 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -12,7 +12,7 @@ public class Game { public void start() { - OutputView.printGameInformation(GAME_START); + OutputView.printInformation(GAME_START); do { play(Number.generateRandomNumbers()); } while (!isRestart()); diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 2208ab8..8de101b 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -44,7 +44,8 @@ private String generateResultMessage(ResultType resultType) { public void print() { ResultType resultType = inspectResultType(); - OutputView.printResult(generateResultMessage(resultType)); + String message = generateResultMessage(resultType); + OutputView.printResult(message); } public boolean hasBall() { diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 8ca2ef9..ce401a3 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -6,13 +6,13 @@ public class InputView { public static String askUserNumbers() { - OutputView.printGameInformation(ASK_PLAYER_NUMBER); + OutputView.printInformation(ASK_PLAYER_NUMBER); return Console.readLine(); } public static String askRestartOrExit() { - OutputView.printGameInformation(GAME_OVER); - OutputView.printGameInformation(ASK_RESTART_OR_EXIT); + OutputView.printInformation(GAME_OVER); + OutputView.printInformation(ASK_RESTART_OR_EXIT); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 42b28d5..982c8fa 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -3,7 +3,7 @@ import baseball.view.constants.PrintMessage; public class OutputView { - public static void printGameInformation(PrintMessage message) { + public static void printInformation(PrintMessage message) { System.out.print(message.getMessage()); } From a1780f0f2dba374de00b0ace2c967a83bece1d41 Mon Sep 17 00:00:00 2001 From: Haebin Date: Sun, 22 Oct 2023 17:38:20 +0900 Subject: [PATCH 45/63] =?UTF-8?q?docs:=20README.md=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EA=B0=9C=EC=9A=94=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 | 91 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index a93984b..24fbfea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,89 @@ -# πŸ“  Precourse-Week1 Mission **[숫자 야ꡬ]** +# ⚾  Precourse-Week1 Mission **[숫자 야ꡬ]** -## ✨  κΈ°λŠ₯ κ΅¬ν˜„ List <ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μˆœμ„œ> +## πŸ’Œ  λͺ©μ°¨ + +- [πŸ’Œ  λͺ©μ°¨](#λͺ©μ°¨) +- [πŸ“¦  νŒ¨ν‚€μ§€ ꡬ쑰](#νŒ¨ν‚€μ§€-ꡬ쑰) +- [✨  κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘](#κΈ°λŠ₯-κ΅¬ν˜„-λͺ©λ‘) + +--- + +## πŸ“¦  νŒ¨ν‚€μ§€ ꡬ쑰 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageClassDescription
πŸ“ƒ  configGlobalConfigμ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum 파일
πŸ•Ή  controllerGameκ²Œμž„ λ‘œμ§μ„ λ©”μΈμœΌλ‘œ λ™μž‘ν•˜λŠ” 컨트둀러 클래슀
πŸ’»  domainNumberμ‚¬μš©μžμ—κ²Œ μž…λ ₯λ°›λŠ” μˆ«μžμ™€, 컴퓨터가 μƒμ„±ν•˜λŠ” 숫자 클래슀 +
ResultBall Count와 Strike Count에 λŒ€ν•œ κ²°κ³Ό 클래슀
ResultTypeλ³Ό, 슀트라이크, λ³Ό&슀트라이크 상황에 λŒ€ν•œ
좜λ ₯ 방법이 μ •μ˜λœ Enum 클래슀
βœ…  validatorNumberValidatorμ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” μˆ«μžμ— λŒ€ν•œ μ œμ•½μ‘°κ±΄ 클래슀
πŸ’¬  viewInputViewμ‚¬μš©μž μš”μ²­μ„ λ°›κΈ° μœ„ν•œ Input View 클래슀
OutputViewμ‚¬μš©μžμ—κ²Œ λ‹€μ–‘ν•œ 응닡을 좜λ ₯ν•˜κΈ° μœ„ν•œ Output View 클래슀
PrintMessageμ‚¬μš©μžμ—κ²Œ 응닡할 정적 λ©”μ„Έμ§€λ₯Ό 담은 μ—΄κ±°ν˜• Enum 클래슀
Image
+
+ +--- + +## ✨  κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ - βœ…1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. - βœ…μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자 3개 -- βœ…κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ : `숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.` +- βœ…κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ + - `숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.` - βœ…μ‚¬μš©μžμ—κ²Œ `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. + - βœ…μž…λ ₯받은 input이 λΉ„μ–΄μžˆμ„ 경우(isEmpty) - βœ…μž…λ ₯받은 input이 3μžλ¦¬κ°€ 아닐 경우 μ˜ˆμ™Έμ²˜λ¦¬ - βœ…μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ - βœ…μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ @@ -15,7 +93,8 @@ - βœ…μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 같이 μ‘΄μž¬ν•  λ•Œ : `nλ³Ό n슀트라이크` - βœ…κ°™μ€ μˆ«μžκ°€ 1κ°œλ„ μ—†μœΌλ©΄ : `λ‚«μ‹±` - βœ…κ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ - - βœ…3슀트라이크 상황 : `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ - βœ…κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` - - βœ…μ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ μ§„ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. + - βœ…3슀트라이크 상황 λ©”μ‹œμ§€ 좜λ ₯: + - `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ` + - `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` + - βœ…μ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ 반볡 μ‹€ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. - βœ…3μŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. From 26561ff4a2d7674de5c8f24f92187f231747623b Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:21:43 +0900 Subject: [PATCH 46/63] =?UTF-8?q?fix:=20=EB=B9=8C=EB=93=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC,=20=EA=B0=9C=ED=96=89=EC=9D=84=20=EC=A0=95=EC=83=81?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Number.java | 2 +- src/main/java/baseball/view/constants/PrintMessage.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 07f0e77..747d163 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -38,7 +38,7 @@ public static Number inputPlayerNumbers() { public static Number generateRandomNumbers() { List randomNumbers = new ArrayList<>(); while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { - int number = pickNumberInRange(RANDOM_NUMBER_MAXIMUM.getValue(), RANDOM_NUMBER_MINIMUM.getValue()); + int number = pickNumberInRange(RANDOM_NUMBER_MINIMUM.getValue(), RANDOM_NUMBER_MAXIMUM.getValue()); if (!randomNumbers.contains(number)) { randomNumbers.add(number); } diff --git a/src/main/java/baseball/view/constants/PrintMessage.java b/src/main/java/baseball/view/constants/PrintMessage.java index ec09f2e..d50f1ab 100644 --- a/src/main/java/baseball/view/constants/PrintMessage.java +++ b/src/main/java/baseball/view/constants/PrintMessage.java @@ -1,10 +1,10 @@ package baseball.view.constants; public enum PrintMessage { - GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."), + GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.\n"), ASK_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), - ASK_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."), - GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); + ASK_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.\n"), + GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ\n"); private final String message; From 7ac0f5810480d69402a004ef14f71eca02e0bb66 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:22:27 +0900 Subject: [PATCH 47/63] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD=20(config=20->=20global)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 2 +- src/main/java/baseball/domain/Number.java | 2 +- src/main/java/baseball/domain/Result.java | 2 +- .../{config/GlobalConfig.java => global/GameConfig.java} | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/baseball/{config/GlobalConfig.java => global/GameConfig.java} (79%) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index ffdd0ea..2e59854 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -7,7 +7,7 @@ import java.util.Objects; -import static baseball.config.GlobalConfig.GAME_RESTART_FLAG; +import static baseball.global.GameConfig.GAME_RESTART_FLAG; import static baseball.view.constants.PrintMessage.GAME_START; public class Game { diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 747d163..651aafc 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.stream.IntStream; -import static baseball.config.GlobalConfig.*; +import static baseball.global.GameConfig.*; import static baseball.validator.NumberValidator.*; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 8de101b..af6ce36 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -3,8 +3,8 @@ import baseball.domain.constants.ResultType; import baseball.view.OutputView; -import static baseball.config.GlobalConfig.NUMBER_LENGTH; import static baseball.domain.constants.ResultType.*; +import static baseball.global.GameConfig.NUMBER_LENGTH; import static java.lang.String.format; public class Result { diff --git a/src/main/java/baseball/config/GlobalConfig.java b/src/main/java/baseball/global/GameConfig.java similarity index 79% rename from src/main/java/baseball/config/GlobalConfig.java rename to src/main/java/baseball/global/GameConfig.java index 6c2e3f0..79e294c 100644 --- a/src/main/java/baseball/config/GlobalConfig.java +++ b/src/main/java/baseball/global/GameConfig.java @@ -1,6 +1,6 @@ -package baseball.config; +package baseball.global; -public enum GlobalConfig { +public enum GameConfig { NUMBER_LENGTH(3), RANDOM_NUMBER_MINIMUM(1), RANDOM_NUMBER_MAXIMUM(9), @@ -8,7 +8,7 @@ public enum GlobalConfig { private final int value; - GlobalConfig(int value) { + GameConfig(int value) { this.value = value; } From 473e3cd142dcd7afdf67a951d35201900a16305b Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:23:00 +0900 Subject: [PATCH 48/63] =?UTF-8?q?docs:=20README.md=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EB=8F=99=EC=82=AC=ED=95=AD=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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 24fbfea..e75c644 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,8 +18,8 @@ Description - πŸ“ƒ  config - GlobalConfig + πŸ“ƒ  global + GameConfig μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum 파일 @@ -65,7 +65,7 @@ -
Image
+ Image From ab42278b428a367b27e07d771bfb5a4497ea1a57 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:45:36 +0900 Subject: [PATCH 49/63] =?UTF-8?q?refactor:=20model=20<->=20view=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=20=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 2e59854..7832d24 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -8,13 +8,14 @@ import java.util.Objects; import static baseball.global.GameConfig.GAME_RESTART_FLAG; -import static baseball.view.constants.PrintMessage.GAME_START; +import static baseball.view.constants.StaticNotice.GAME_START; public class Game { public void start() { - OutputView.printInformation(GAME_START); + OutputView.printStaticNotice(GAME_START); do { - play(Number.generateRandomNumbers()); + Number computerNumber = Number.generateRandomNumbers(); + play(computerNumber); } while (!isRestart()); } @@ -22,7 +23,7 @@ private void play(Number computerNumber) { while (true) { Number playerNumber = Number.inputPlayerNumbers(); Result result = Result.create(playerNumber, computerNumber); - result.print(); + OutputView.printMessage(result.createResultMessage()); if (result.checkGameOver()) { break; } From 075555433a993a3a938a2eee06ed72e8f74aa171 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:46:00 +0900 Subject: [PATCH 50/63] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EC=A7=81=EA=B4=80=EC=A0=81=20=EA=B0=9C=EC=84=A0=20(PrintMes?= =?UTF-8?q?sage=20->=20StaticNotice)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Result.java | 6 ++---- src/main/java/baseball/view/InputView.java | 8 ++++---- src/main/java/baseball/view/OutputView.java | 10 +++++----- .../constants/{PrintMessage.java => StaticNotice.java} | 4 ++-- 4 files changed, 13 insertions(+), 15 deletions(-) rename src/main/java/baseball/view/constants/{PrintMessage.java => StaticNotice.java} (88%) diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index af6ce36..311a6bd 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -1,7 +1,6 @@ package baseball.domain; import baseball.domain.constants.ResultType; -import baseball.view.OutputView; import static baseball.domain.constants.ResultType.*; import static baseball.global.GameConfig.NUMBER_LENGTH; @@ -42,10 +41,9 @@ private String generateResultMessage(ResultType resultType) { }; } - public void print() { + public String createResultMessage() { ResultType resultType = inspectResultType(); - String message = generateResultMessage(resultType); - OutputView.printResult(message); + return generateResultMessage(resultType); } public boolean hasBall() { diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index ce401a3..7d4b13e 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -2,17 +2,17 @@ import camp.nextstep.edu.missionutils.Console; -import static baseball.view.constants.PrintMessage.*; +import static baseball.view.constants.StaticNotice.*; public class InputView { public static String askUserNumbers() { - OutputView.printInformation(ASK_PLAYER_NUMBER); + OutputView.printStaticNotice(ASK_PLAYER_NUMBER); return Console.readLine(); } public static String askRestartOrExit() { - OutputView.printInformation(GAME_OVER); - OutputView.printInformation(ASK_RESTART_OR_EXIT); + OutputView.printStaticNotice(GAME_OVER); + OutputView.printStaticNotice(ASK_RESTART_OR_EXIT); return Console.readLine(); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 982c8fa..cdf550e 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,13 +1,13 @@ package baseball.view; -import baseball.view.constants.PrintMessage; +import baseball.view.constants.StaticNotice; public class OutputView { - public static void printInformation(PrintMessage message) { - System.out.print(message.getMessage()); + public static void printStaticNotice(StaticNotice notice) { + System.out.print(notice.getMessage()); } - public static void printResult(String resultMessage) { - System.out.println(resultMessage); + public static void printMessage(String message) { + System.out.println(message); } } diff --git a/src/main/java/baseball/view/constants/PrintMessage.java b/src/main/java/baseball/view/constants/StaticNotice.java similarity index 88% rename from src/main/java/baseball/view/constants/PrintMessage.java rename to src/main/java/baseball/view/constants/StaticNotice.java index d50f1ab..fa3ab89 100644 --- a/src/main/java/baseball/view/constants/PrintMessage.java +++ b/src/main/java/baseball/view/constants/StaticNotice.java @@ -1,6 +1,6 @@ package baseball.view.constants; -public enum PrintMessage { +public enum StaticNotice { GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.\n"), ASK_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), ASK_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.\n"), @@ -8,7 +8,7 @@ public enum PrintMessage { private final String message; - PrintMessage(String message) { + StaticNotice(String message) { this.message = message; } From c56887c2632eb9d0731e598b758e69a336f26670 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:56:15 +0900 Subject: [PATCH 51/63] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=BB=A4?= =?UTF-8?q?=EC=8A=A4=ED=85=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/exception/BaseballException.java | 11 +++++++++++ .../domain/exception/ErrorMessage.java | 18 ++++++++++++++++++ .../baseball/validator/NumberValidator.java | 18 +++++++++++++----- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/main/java/baseball/domain/exception/BaseballException.java create mode 100644 src/main/java/baseball/domain/exception/ErrorMessage.java diff --git a/src/main/java/baseball/domain/exception/BaseballException.java b/src/main/java/baseball/domain/exception/BaseballException.java new file mode 100644 index 0000000..040da56 --- /dev/null +++ b/src/main/java/baseball/domain/exception/BaseballException.java @@ -0,0 +1,11 @@ +package baseball.domain.exception; + +public class BaseballException extends IllegalArgumentException { + private BaseballException(ErrorMessage errorMessage) { + super(errorMessage.getMessage()); + } + + public static BaseballException of(ErrorMessage errorMessage) { + return new BaseballException(errorMessage); + } +} diff --git a/src/main/java/baseball/domain/exception/ErrorMessage.java b/src/main/java/baseball/domain/exception/ErrorMessage.java new file mode 100644 index 0000000..defe569 --- /dev/null +++ b/src/main/java/baseball/domain/exception/ErrorMessage.java @@ -0,0 +1,18 @@ +package baseball.domain.exception; + +public enum ErrorMessage { + INVALID_LENGTH("The input length cannot be different from length configured by the game."), + DUPLICATED_NUMBER("The input cannot contain duplicated numbers."), + CONTAIN_LETTER("The input cannot contain letters."), + EMPTY_NUMBER("The input cannot be empty."); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index bad0630..564dcda 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -1,31 +1,39 @@ package baseball.validator; +import baseball.domain.exception.BaseballException; + +import static baseball.domain.exception.ErrorMessage.*; + public class NumberValidator { public static void validateNumberLength(final String number) { if (!isValidLength(number)) { - throw new IllegalArgumentException("number Length is different from the system setting"); + throw BaseballException.of(INVALID_LENGTH); } } public static void validateContainDuplicatedNumber(final String number) { if (!isUniqueNumber(number)) { - throw new IllegalArgumentException("number cannot contain duplicated numbers"); + throw BaseballException.of(DUPLICATED_NUMBER); } } public static void validateContainOnlyNumber(final String number) { if (!isValidNumber(number)) { - throw new IllegalArgumentException("number cannot contain any letters"); + throw BaseballException.of(CONTAIN_LETTER); } } public static void validateEmpty(final String number) { - if (number.isEmpty()) { - throw new IllegalArgumentException("number cannot be empty"); + if (isEmpty(number)) { + throw BaseballException.of(EMPTY_NUMBER); } } + private static boolean isEmpty(String number) { + return number.isEmpty(); + } + private static boolean isValidLength(final String number) { return number.length() == 3; } From a1307d62b6920eb0f527e1fef6b5d05017ca209a Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 17:59:20 +0900 Subject: [PATCH 52/63] =?UTF-8?q?refactor:=20BaseballException.of=20?= =?UTF-8?q?=ED=98=95=ED=83=9C=20=EC=A0=81=EC=9A=A9=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Result.java | 4 +++- src/main/java/baseball/domain/exception/ErrorMessage.java | 3 ++- src/main/java/baseball/validator/NumberValidator.java | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 311a6bd..61ca6aa 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -1,8 +1,10 @@ package baseball.domain; import baseball.domain.constants.ResultType; +import baseball.domain.exception.BaseballException; import static baseball.domain.constants.ResultType.*; +import static baseball.domain.exception.ErrorMessage.SYSTEM_ERROR; import static baseball.global.GameConfig.NUMBER_LENGTH; import static java.lang.String.format; @@ -29,7 +31,7 @@ private ResultType inspectResultType() { } else if (hasStrike()) { return ONLY_STRIKE; } - throw new IllegalArgumentException("result type error"); + throw BaseballException.of(SYSTEM_ERROR); } private String generateResultMessage(ResultType resultType) { diff --git a/src/main/java/baseball/domain/exception/ErrorMessage.java b/src/main/java/baseball/domain/exception/ErrorMessage.java index defe569..fdf0a44 100644 --- a/src/main/java/baseball/domain/exception/ErrorMessage.java +++ b/src/main/java/baseball/domain/exception/ErrorMessage.java @@ -4,7 +4,8 @@ public enum ErrorMessage { INVALID_LENGTH("The input length cannot be different from length configured by the game."), DUPLICATED_NUMBER("The input cannot contain duplicated numbers."), CONTAIN_LETTER("The input cannot contain letters."), - EMPTY_NUMBER("The input cannot be empty."); + EMPTY_NUMBER("The input cannot be empty."), + SYSTEM_ERROR("The game system has crashed"); private final String message; diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index 564dcda..4331ffe 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -30,6 +30,7 @@ public static void validateEmpty(final String number) { } } + private static boolean isEmpty(String number) { return number.isEmpty(); } From 9de442bf11bdaa1b6e6b8c0035e2cf33e7c096b3 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 18:00:03 +0900 Subject: [PATCH 53/63] =?UTF-8?q?fix:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20(player,=20user=20->=20player)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Number.java | 2 +- src/main/java/baseball/view/InputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 651aafc..8fcf79d 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -30,7 +30,7 @@ private Number(List computerNumber) { // Player Number Static Factory Method public static Number inputPlayerNumbers() { - String playerNumbers = InputView.askUserNumbers(); + String playerNumbers = InputView.askPlayerNumbers(); return new Number(playerNumbers); } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 7d4b13e..abf17de 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -5,7 +5,7 @@ import static baseball.view.constants.StaticNotice.*; public class InputView { - public static String askUserNumbers() { + public static String askPlayerNumbers() { OutputView.printStaticNotice(ASK_PLAYER_NUMBER); return Console.readLine(); } From fecb933960297730352ed96aff199fd24d52fe03 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 18:02:36 +0900 Subject: [PATCH 54/63] =?UTF-8?q?refactor:=20static=20import=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EA=B0=84?= =?UTF-8?q?=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/Game.java | 3 ++- src/main/java/baseball/view/InputView.java | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index 7832d24..f314ea6 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -8,11 +8,12 @@ import java.util.Objects; import static baseball.global.GameConfig.GAME_RESTART_FLAG; +import static baseball.view.OutputView.printStaticNotice; import static baseball.view.constants.StaticNotice.GAME_START; public class Game { public void start() { - OutputView.printStaticNotice(GAME_START); + printStaticNotice(GAME_START); do { Number computerNumber = Number.generateRandomNumbers(); play(computerNumber); diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index abf17de..a4216b1 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,18 +1,18 @@ package baseball.view; -import camp.nextstep.edu.missionutils.Console; - +import static baseball.view.OutputView.printStaticNotice; import static baseball.view.constants.StaticNotice.*; +import static camp.nextstep.edu.missionutils.Console.readLine; public class InputView { public static String askPlayerNumbers() { - OutputView.printStaticNotice(ASK_PLAYER_NUMBER); - return Console.readLine(); + printStaticNotice(ASK_PLAYER_NUMBER); + return readLine(); } public static String askRestartOrExit() { - OutputView.printStaticNotice(GAME_OVER); - OutputView.printStaticNotice(ASK_RESTART_OR_EXIT); - return Console.readLine(); + printStaticNotice(GAME_OVER); + printStaticNotice(ASK_RESTART_OR_EXIT); + return readLine(); } } From 2b505a095dd5d1daf2fe5173382534b52bc2c2f3 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 19:12:36 +0900 Subject: [PATCH 55/63] =?UTF-8?q?refactor:=20SRP=20=EC=A4=80=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=B4=EC=84=9C=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Result.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 61ca6aa..7bb23d3 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -1,11 +1,11 @@ package baseball.domain; import baseball.domain.constants.ResultType; -import baseball.domain.exception.BaseballException; +import baseball.global.exception.BaseballException; import static baseball.domain.constants.ResultType.*; -import static baseball.domain.exception.ErrorMessage.SYSTEM_ERROR; import static baseball.global.GameConfig.NUMBER_LENGTH; +import static baseball.global.exception.ErrorMessage.SYSTEM_ERROR; import static java.lang.String.format; public class Result { @@ -22,9 +22,9 @@ public static Result create(final Number playerNumber, final Number computerNumb } private ResultType inspectResultType() { - if (!hasBall() && !hasStrike()) { + if (isNothing()) { return NOTHING; - } else if (hasBall() && hasStrike()) { + } else if (hasBallAndStrike()) { return BALL_AND_STRIKE; } else if (hasBall()) { return ONLY_BALL; @@ -34,6 +34,14 @@ private ResultType inspectResultType() { throw BaseballException.of(SYSTEM_ERROR); } + private boolean hasBallAndStrike() { + return hasBall() && hasStrike(); + } + + private boolean isNothing() { + return !hasBall() && !hasStrike(); + } + private String generateResultMessage(ResultType resultType) { return switch (resultType) { case NOTHING -> resultType.getValue(); From f9a297c9e2f85f3e7c85f38629a7e32bdc433c0c Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 19:12:53 +0900 Subject: [PATCH 56/63] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=EB=B3=80?= =?UTF-8?q?=EC=88=98=EA=B0=80=20=EC=97=86=EB=8A=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/validator/NumberValidator.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/NumberValidator.java index 4331ffe..4fbda89 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/NumberValidator.java @@ -1,11 +1,14 @@ package baseball.validator; -import baseball.domain.exception.BaseballException; +import baseball.global.exception.BaseballException; -import static baseball.domain.exception.ErrorMessage.*; +import static baseball.global.exception.ErrorMessage.*; public class NumberValidator { + protected NumberValidator() { + } + public static void validateNumberLength(final String number) { if (!isValidLength(number)) { throw BaseballException.of(INVALID_LENGTH); @@ -29,7 +32,6 @@ public static void validateEmpty(final String number) { throw BaseballException.of(EMPTY_NUMBER); } } - private static boolean isEmpty(String number) { return number.isEmpty(); From 5fdb512ca0af7425aba7001cc1b43d2e764358c4 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 19:13:23 +0900 Subject: [PATCH 57/63] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(domain/exception=20->=20global/exception)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{domain => global}/exception/BaseballException.java | 2 +- .../baseball/{domain => global}/exception/ErrorMessage.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/baseball/{domain => global}/exception/BaseballException.java (89%) rename src/main/java/baseball/{domain => global}/exception/ErrorMessage.java (93%) diff --git a/src/main/java/baseball/domain/exception/BaseballException.java b/src/main/java/baseball/global/exception/BaseballException.java similarity index 89% rename from src/main/java/baseball/domain/exception/BaseballException.java rename to src/main/java/baseball/global/exception/BaseballException.java index 040da56..77c784a 100644 --- a/src/main/java/baseball/domain/exception/BaseballException.java +++ b/src/main/java/baseball/global/exception/BaseballException.java @@ -1,4 +1,4 @@ -package baseball.domain.exception; +package baseball.global.exception; public class BaseballException extends IllegalArgumentException { private BaseballException(ErrorMessage errorMessage) { diff --git a/src/main/java/baseball/domain/exception/ErrorMessage.java b/src/main/java/baseball/global/exception/ErrorMessage.java similarity index 93% rename from src/main/java/baseball/domain/exception/ErrorMessage.java rename to src/main/java/baseball/global/exception/ErrorMessage.java index fdf0a44..5956708 100644 --- a/src/main/java/baseball/domain/exception/ErrorMessage.java +++ b/src/main/java/baseball/global/exception/ErrorMessage.java @@ -1,4 +1,4 @@ -package baseball.domain.exception; +package baseball.global.exception; public enum ErrorMessage { INVALID_LENGTH("The input length cannot be different from length configured by the game."), From 3fc9cd25f6dd6b97ee3d071611eaa90006be2f92 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 19:13:34 +0900 Subject: [PATCH 58/63] =?UTF-8?q?docs:=20README.md=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/docs/README.md b/docs/README.md index e75c644..b4166a1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,53 +19,64 @@ πŸ“ƒ  global - GameConfig - μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum 파일 + GameConfig + μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum + + +    β†˜οΈ  exception + BaseballException + μ „μ—­μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έμƒν™©μ— λŒ€ν•œ Exception 클래슀
+ + + ErrorMessage + 각 μ˜ˆμ™Έ μƒν™©μ—μ„œ μ „μ—­μœΌλ‘œ 던져질 μ˜ˆμ™Έμ˜ λ©”μ„Έμ§€ Enum πŸ•Ή  controller - Game + Game κ²Œμž„ λ‘œμ§μ„ λ©”μΈμœΌλ‘œ λ™μž‘ν•˜λŠ” 컨트둀러 클래슀 - πŸ’»  domain - Number + πŸ’»  domain + Number μ‚¬μš©μžμ—κ²Œ μž…λ ₯λ°›λŠ” μˆ«μžμ™€, 컴퓨터가 μƒμ„±ν•˜λŠ” 숫자 클래슀 - Result + Result Ball Count와 Strike Count에 λŒ€ν•œ κ²°κ³Ό 클래슀 - ResultType - λ³Ό, 슀트라이크, λ³Ό&슀트라이크 상황에 λŒ€ν•œ
좜λ ₯ 방법이 μ •μ˜λœ Enum 클래슀 +    β†˜οΈ  exception + ResultType + λ³Ό, 슀트라이크, λ³Ό&슀트라이크 상황에 λŒ€ν•œ
좜λ ₯ 방법이 μ •μ˜λœ μ—΄κ±°ν˜• 클래슀 βœ…  validator - NumberValidator + NumberValidator μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” μˆ«μžμ— λŒ€ν•œ μ œμ•½μ‘°κ±΄ 클래슀 - πŸ’¬  view - InputView + πŸ’¬  view + InputView μ‚¬μš©μž μš”μ²­μ„ λ°›κΈ° μœ„ν•œ Input View 클래슀 - OutputView + OutputView μ‚¬μš©μžμ—κ²Œ λ‹€μ–‘ν•œ 응닡을 좜λ ₯ν•˜κΈ° μœ„ν•œ Output View 클래슀 - PrintMessage - μ‚¬μš©μžμ—κ²Œ 응닡할 정적 λ©”μ„Έμ§€λ₯Ό 담은 μ—΄κ±°ν˜• Enum 클래슀 +    β†˜οΈ  constants + StaticNotice + μ‚¬μš©μžμ—κ²Œ 응닡할 정적 λ©”μ„Έμ§€λ₯Ό 담은 μ—΄κ±°ν˜• 클래슀 - Image + Image From caa0bd32670bf92adeffb4c867237ac4f1027961 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 19:53:21 +0900 Subject: [PATCH 59/63] =?UTF-8?q?feat:=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20else-if=EB=AC=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=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/baseball/domain/Number.java | 6 +++++- src/main/java/baseball/domain/Result.java | 9 ++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 8fcf79d..17a0497 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -39,13 +39,17 @@ public static Number generateRandomNumbers() { List randomNumbers = new ArrayList<>(); while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { int number = pickNumberInRange(RANDOM_NUMBER_MINIMUM.getValue(), RANDOM_NUMBER_MAXIMUM.getValue()); - if (!randomNumbers.contains(number)) { + if (!hasDuplicatedNumber(randomNumbers, number)) { randomNumbers.add(number); } } return new Number(randomNumbers); } + private static boolean hasDuplicatedNumber(List randomNumbers, int number) { + return randomNumbers.contains(number); + } + private List convertInputNumber(String input) { return input.chars() .mapToObj(Character::getNumericValue) diff --git a/src/main/java/baseball/domain/Result.java b/src/main/java/baseball/domain/Result.java index 7bb23d3..8d5195d 100644 --- a/src/main/java/baseball/domain/Result.java +++ b/src/main/java/baseball/domain/Result.java @@ -24,11 +24,14 @@ public static Result create(final Number playerNumber, final Number computerNumb private ResultType inspectResultType() { if (isNothing()) { return NOTHING; - } else if (hasBallAndStrike()) { + } + if (hasBallAndStrike()) { return BALL_AND_STRIKE; - } else if (hasBall()) { + } + if (hasBall()) { return ONLY_BALL; - } else if (hasStrike()) { + } + if (hasStrike()) { return ONLY_STRIKE; } throw BaseballException.of(SYSTEM_ERROR); From 1fa1b0b109f894496e1d5556914128de3463099b Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 20:22:43 +0900 Subject: [PATCH 60/63] =?UTF-8?q?feat:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=A2=85=EB=A3=8C=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(1,=202=20=EC=99=B8=EC=9D=98=20=EA=B0=92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 41 ++++++++++--------- src/main/java/baseball/controller/Game.java | 11 +++-- src/main/java/baseball/domain/Number.java | 2 +- src/main/java/baseball/global/GameConfig.java | 4 +- .../global/exception/ErrorMessage.java | 1 + ...mberValidator.java => InputValidator.java} | 28 +++++++++++-- 6 files changed, 57 insertions(+), 30 deletions(-) rename src/main/java/baseball/validator/{NumberValidator.java => InputValidator.java} (65%) diff --git a/docs/README.md b/docs/README.md index b4166a1..378ca48 100644 --- a/docs/README.md +++ b/docs/README.md @@ -89,23 +89,26 @@ ## ✨  κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ -- βœ…1~9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. - - βœ…μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 숫자 3개 -- βœ…κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ - - `숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.` -- βœ…μ‚¬μš©μžμ—κ²Œ `1-9 μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ 3자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›κ³  μ €μž₯ν•œλ‹€. - - βœ…μž…λ ₯받은 input이 λΉ„μ–΄μžˆμ„ 경우(isEmpty) - - βœ…μž…λ ₯받은 input이 3μžλ¦¬κ°€ 아닐 경우 μ˜ˆμ™Έμ²˜λ¦¬ - - βœ…μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ - - βœ…μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ -- βœ…μ‚¬μš©μž inputκ³Ό 랜덀 생성 μ •μˆ˜λ₯Ό 비ꡐ해 좜λ ₯ν•  힌트λ₯Ό κ³„μ‚°ν•œλ‹€. - - βœ…λ‹€λ₯Έ 자리 같은 숫자의 갯수 n개 : `nλ³Ό` - - βœ…κ°™μ€ 자리 같은 숫자 n개: `n슀트라이크` - - βœ…μŠ€νŠΈλΌμ΄ν¬μ™€ 볼이 같이 μ‘΄μž¬ν•  λ•Œ : `nλ³Ό n슀트라이크` - - βœ…κ°™μ€ μˆ«μžκ°€ 1κ°œλ„ μ—†μœΌλ©΄ : `λ‚«μ‹±` -- βœ…κ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ - - βœ…3슀트라이크 상황 λ©”μ‹œμ§€ 좜λ ₯: - - `3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ` +- βœ… `a ~ b` μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ `n자리`의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. + - Default Setting : `1 ~ 9`μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ `3자리`의 μ •μˆ˜ +- βœ… κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ +- βœ… μ‚¬μš©μžμ—κ²Œ `a ~ b μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ n자리의 μ •μˆ˜`λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. + - μž…λ ₯받은 input이 λΉ„μ–΄μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - μž…λ ₯받은 input이 μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 포함될 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - μž…λ ₯받은 input에 μ€‘λ³΅λœ μˆ«μžκ°€ μžˆμ„ 경우 μ˜ˆμ™Έμ²˜λ¦¬ +- βœ… μ‚¬μš©μž input μˆ«μžμ™€ 랜덀 생성 μ •μˆ˜μ˜ 자리수λ₯Ό 비ꡐ해 좜λ ₯ν•  힌트λ₯Ό κ³„μ‚°ν•œλ‹€. + - 숫자의 값은 κ°™μ§€λ§Œ μžλ¦¬μˆ˜κ°€ λ‹€λ₯Έ 경우의 수 n개 : `nλ³Ό` + - 숫자의 κ°’κ³Ό μžλ¦¬μˆ˜κ°€ λͺ¨λ‘ 같은 경우의 수 m개 : `n슀트라이크` +- βœ…κ³„μ‚°λœ 힌트λ₯Ό μ•„λž˜ μ–‘μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€ + - λ³Ό n개, 슀트라이크 0κ°œκ°€ μ‘΄μž¬ν•  λ•Œ : `nλ³Ό` + - λ³Ό 0개, 슀트라이크 nκ°œκ°€ μ‘΄μž¬ν•  λ•Œ : `n슀트라이크` + - λ³Ό n개, 슀트라이크 mκ°œκ°€ μ‘΄μž¬ν•  λ•Œ : `nλ³Ό m슀트라이크` + - λ³Ό 0개, 슀트라이크 0κ°œκ°€ μ‘΄μž¬ν•  λ•Œ : `λ‚«μ‹±` + +- βœ… κ²Œμž„ 클리어 μ—¬λΆ€ νŒλ‹¨ + - `nμŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄`, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. + - `n슀트라이크λ₯Ό λ§žμΆ”μ—ˆλ‹€λ©΄`, μ•„λž˜ λ©”μ„Έμ§€λ₯Ό 좜λ ₯ν•˜κ³  μ‚¬μš©μžμ—κ²Œ ν”Œλž˜κ·Έλ₯Ό μž…λ ₯λ°›λŠ”λ‹€. + - `n개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ` - `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` - - βœ…μ‚¬μš©μžμ—κ²Œ κ²Œμž„ μž¬μ‹œμž‘ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›κ³ , μž…λ ₯값에 따라 ν”„λ‘œκ·Έλž¨ 반볡 μ‹€ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€. - - βœ…3μŠ€νŠΈλΌμ΄ν¬κ°€ μ•„λ‹ˆλΌλ©΄, λ‹€μ‹œ μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 숫자λ₯Ό λ°›κ³ , 힌트λ₯Ό 좜λ ₯ν•œλ‹€. + - μž…λ ₯받은 input이 1κ³Ό 2κ°€ μ•„λ‹Œ 숫자일 경우 μ˜ˆμ™Έμ²˜λ¦¬ + - μž…λ ₯값에 따라 κ²Œμž„μ„ μž¬μ‹œμž‘ν•˜κ±°λ‚˜ μ’…λ£Œν•œλ‹€. diff --git a/src/main/java/baseball/controller/Game.java b/src/main/java/baseball/controller/Game.java index f314ea6..3ef9dec 100644 --- a/src/main/java/baseball/controller/Game.java +++ b/src/main/java/baseball/controller/Game.java @@ -2,12 +2,10 @@ import baseball.domain.Number; import baseball.domain.Result; +import baseball.validator.InputValidator; import baseball.view.InputView; import baseball.view.OutputView; -import java.util.Objects; - -import static baseball.global.GameConfig.GAME_RESTART_FLAG; import static baseball.view.OutputView.printStaticNotice; import static baseball.view.constants.StaticNotice.GAME_START; @@ -17,7 +15,7 @@ public void start() { do { Number computerNumber = Number.generateRandomNumbers(); play(computerNumber); - } while (!isRestart()); + } while (!askRestartOrExit()); } private void play(Number computerNumber) { @@ -31,7 +29,8 @@ private void play(Number computerNumber) { } } - private static boolean isRestart() { - return Objects.equals(InputView.askRestartOrExit(), GAME_RESTART_FLAG.toString()); + private boolean askRestartOrExit() { + String input = InputView.askRestartOrExit(); + return InputValidator.isValidRestartFlag(input); } } diff --git a/src/main/java/baseball/domain/Number.java b/src/main/java/baseball/domain/Number.java index 17a0497..df619ae 100644 --- a/src/main/java/baseball/domain/Number.java +++ b/src/main/java/baseball/domain/Number.java @@ -7,7 +7,7 @@ import java.util.stream.IntStream; import static baseball.global.GameConfig.*; -import static baseball.validator.NumberValidator.*; +import static baseball.validator.InputValidator.*; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; public class Number { diff --git a/src/main/java/baseball/global/GameConfig.java b/src/main/java/baseball/global/GameConfig.java index 79e294c..6952f68 100644 --- a/src/main/java/baseball/global/GameConfig.java +++ b/src/main/java/baseball/global/GameConfig.java @@ -4,7 +4,9 @@ public enum GameConfig { NUMBER_LENGTH(3), RANDOM_NUMBER_MINIMUM(1), RANDOM_NUMBER_MAXIMUM(9), - GAME_RESTART_FLAG(2); + + EXIT_FLAG(1), + RESTART_FLAG(2); private final int value; diff --git a/src/main/java/baseball/global/exception/ErrorMessage.java b/src/main/java/baseball/global/exception/ErrorMessage.java index 5956708..30e4f0b 100644 --- a/src/main/java/baseball/global/exception/ErrorMessage.java +++ b/src/main/java/baseball/global/exception/ErrorMessage.java @@ -5,6 +5,7 @@ public enum ErrorMessage { DUPLICATED_NUMBER("The input cannot contain duplicated numbers."), CONTAIN_LETTER("The input cannot contain letters."), EMPTY_NUMBER("The input cannot be empty."), + INVALID_FLAG("The input cannot be different flag from configured by the game."), SYSTEM_ERROR("The game system has crashed"); private final String message; diff --git a/src/main/java/baseball/validator/NumberValidator.java b/src/main/java/baseball/validator/InputValidator.java similarity index 65% rename from src/main/java/baseball/validator/NumberValidator.java rename to src/main/java/baseball/validator/InputValidator.java index 4fbda89..3a7ec10 100644 --- a/src/main/java/baseball/validator/NumberValidator.java +++ b/src/main/java/baseball/validator/InputValidator.java @@ -3,12 +3,34 @@ import baseball.global.exception.BaseballException; +import static baseball.global.GameConfig.EXIT_FLAG; +import static baseball.global.GameConfig.RESTART_FLAG; import static baseball.global.exception.ErrorMessage.*; -public class NumberValidator { - protected NumberValidator() { +public class InputValidator { + protected InputValidator() { } + public static boolean isValidRestartFlag(String flag) { + validateGameFlag(flag); + return flag.equals(RESTART_FLAG.toString()); + } + + private static void validateGameFlag(final String flag) { + if (!isExitFlag(flag) && !isRestartFlag(flag)) { + throw BaseballException.of(INVALID_FLAG); + } + } + + private static boolean isExitFlag(String flag) { + return flag.equals(EXIT_FLAG.toString()); + } + + private static boolean isRestartFlag(String flag) { + return flag.equals(RESTART_FLAG.toString()); + } + + public static void validateNumberLength(final String number) { if (!isValidLength(number)) { throw BaseballException.of(INVALID_LENGTH); @@ -32,7 +54,7 @@ public static void validateEmpty(final String number) { throw BaseballException.of(EMPTY_NUMBER); } } - + private static boolean isEmpty(String number) { return number.isEmpty(); } From 0422d7bcf750caae5bf7374f06e52e2cf3d05912 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 21:22:35 +0900 Subject: [PATCH 61/63] =?UTF-8?q?feat:=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EC=9D=B4=20GameConfig=20=EC=A0=84=EC=97=AD?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=EC=97=90=20=EC=9D=98=EC=A1=B4=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=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/validator/InputValidator.java | 5 ++--- src/main/java/baseball/view/constants/StaticNotice.java | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/validator/InputValidator.java b/src/main/java/baseball/validator/InputValidator.java index 3a7ec10..12d7cd5 100644 --- a/src/main/java/baseball/validator/InputValidator.java +++ b/src/main/java/baseball/validator/InputValidator.java @@ -3,8 +3,7 @@ import baseball.global.exception.BaseballException; -import static baseball.global.GameConfig.EXIT_FLAG; -import static baseball.global.GameConfig.RESTART_FLAG; +import static baseball.global.GameConfig.*; import static baseball.global.exception.ErrorMessage.*; public class InputValidator { @@ -60,7 +59,7 @@ private static boolean isEmpty(String number) { } private static boolean isValidLength(final String number) { - return number.length() == 3; + return number.length() == NUMBER_LENGTH.getValue(); } private static boolean isValidNumber(final String number) { diff --git a/src/main/java/baseball/view/constants/StaticNotice.java b/src/main/java/baseball/view/constants/StaticNotice.java index fa3ab89..6bc269d 100644 --- a/src/main/java/baseball/view/constants/StaticNotice.java +++ b/src/main/java/baseball/view/constants/StaticNotice.java @@ -1,10 +1,13 @@ package baseball.view.constants; +import static baseball.global.GameConfig.NUMBER_LENGTH; +import static java.lang.String.format; + public enum StaticNotice { GAME_START("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.\n"), ASK_PLAYER_NUMBER("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "), ASK_RESTART_OR_EXIT("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.\n"), - GAME_OVER("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ\n"); + GAME_OVER(format("%d개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ%n", NUMBER_LENGTH.getValue())); private final String message; From a51764b0c9b952de23689217d389289b378a7605 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 21:22:46 +0900 Subject: [PATCH 62/63] =?UTF-8?q?docs:=20README.md=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 64 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/docs/README.md b/docs/README.md index 378ca48..06a7ff3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ ## πŸ’Œ  λͺ©μ°¨ -- [πŸ’Œ  λͺ©μ°¨](#λͺ©μ°¨) - [πŸ“¦  νŒ¨ν‚€μ§€ ꡬ쑰](#νŒ¨ν‚€μ§€-ꡬ쑰) - [✨  κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘](#κΈ°λŠ₯-κ΅¬ν˜„-λͺ©λ‘) +- [🎨  κ΅¬ν˜„ κ°„ κ³ λ―Όν–ˆλ˜ λ‚΄μš©λ“€](#κ΅¬ν˜„-κ°„-κ³ λ―Όν–ˆλ˜-λ‚΄μš©λ“€) --- @@ -17,21 +17,6 @@ Class Description - - πŸ“ƒ  global - GameConfig - μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum - - -    β†˜οΈ  exception - BaseballException - μ „μ—­μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έμƒν™©μ— λŒ€ν•œ Exception 클래슀
- - - ErrorMessage - 각 μ˜ˆμ™Έ μƒν™©μ—μ„œ μ „μ—­μœΌλ‘œ 던져질 μ˜ˆμ™Έμ˜ λ©”μ„Έμ§€ Enum - - πŸ•Ή  controller Game @@ -49,14 +34,29 @@ Ball Count와 Strike Count에 λŒ€ν•œ κ²°κ³Ό 클래슀 -    β†˜οΈ  exception +     β†˜οΈ  / constants ResultType λ³Ό, 슀트라이크, λ³Ό&슀트라이크 상황에 λŒ€ν•œ
좜λ ₯ 방법이 μ •μ˜λœ μ—΄κ±°ν˜• 클래슀 + + πŸ“ƒ  global + GameConfig + μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum + + +     β†˜οΈ  / exception + BaseballException + μ „μ—­μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έμƒν™©μ— λŒ€ν•œ Exception 클래슀
+ + + ErrorMessage + 각 μ˜ˆμ™Έ μƒν™©μ—μ„œ μ „μ—­μœΌλ‘œ 던져질 μ˜ˆμ™Έμ˜ λ©”μ„Έμ§€ Enum + + βœ…  validator - NumberValidator + InputValidator μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” μˆ«μžμ— λŒ€ν•œ μ œμ•½μ‘°κ±΄ 클래슀 @@ -70,7 +70,7 @@ μ‚¬μš©μžμ—κ²Œ λ‹€μ–‘ν•œ 응닡을 좜λ ₯ν•˜κΈ° μœ„ν•œ Output View 클래슀 -    β†˜οΈ  constants +     β†˜οΈ  / constants StaticNotice μ‚¬μš©μžμ—κ²Œ 응닡할 정적 λ©”μ„Έμ§€λ₯Ό 담은 μ—΄κ±°ν˜• 클래슀 @@ -79,7 +79,7 @@ Image - + @@ -112,3 +112,27 @@ - `κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”.` - μž…λ ₯받은 input이 1κ³Ό 2κ°€ μ•„λ‹Œ 숫자일 경우 μ˜ˆμ™Έμ²˜λ¦¬ - μž…λ ₯값에 따라 κ²Œμž„μ„ μž¬μ‹œμž‘ν•˜κ±°λ‚˜ μ’…λ£Œν•œλ‹€. + +--- + +## 🎨  κ΅¬ν˜„ κ°„ κ³ λ―Όν–ˆλ˜ λ‚΄μš©λ“€ + +- (μœ μ—°ν•œ 섀계) input 숫자의 λ²”μœ„κ°€ λ³€ν•˜λ”λΌλ„(1~9), μžλ¦¬μˆ˜κ°€ λ³€ν•˜λ”λΌλ„ λŒ€μ‘μ΄ μ†μ‰½κ²Œ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
+ `GameConfig` νŒŒμΌμ—μ„œ `NUMBER_LENGTH` λ³€μˆ˜μ˜ valueλ₯Ό λ³€κ²½ν•΄ μ†μ‰½κ²Œ 변경이 κ°€λŠ₯ν•˜λ‹€. + +
+ + + + + + + + + + + + +
숫자 3자리(Default)숫자 4자리숫자 5자리
+ +--- From 5d9eaf2763e71bca30faa7e4f27fbc69be02dd26 Mon Sep 17 00:00:00 2001 From: Haebin Date: Mon, 23 Oct 2023 23:57:45 +0900 Subject: [PATCH 63/63] =?UTF-8?q?docs:=20README.md=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 90 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/docs/README.md b/docs/README.md index 06a7ff3..3941799 100644 --- a/docs/README.md +++ b/docs/README.md @@ -36,13 +36,13 @@     β†˜οΈ  / constants ResultType - λ³Ό, 슀트라이크, λ³Ό&슀트라이크 상황에 λŒ€ν•œ
좜λ ₯ 방법이 μ •μ˜λœ μ—΄κ±°ν˜• 클래슀 + 각 결과에 따라 λ‹€λ₯Έ 좜λ ₯ 방법에 λŒ€ν•΄ μ •μ˜λœ Enum πŸ“ƒ  global GameConfig - μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •
(숫자 길이 μ œμ•½, 뽑을 숫자 λ²”μœ„) Enum + μ „μ—­μœΌλ‘œ μž‘μš©ν•˜λŠ” μ„€μ •κ³Ό μ œμ•½μ‘°κ±΄μ— λŒ€ν•œ Enum     β†˜οΈ  / exception @@ -63,11 +63,11 @@ πŸ’¬  view InputView - μ‚¬μš©μž μš”μ²­μ„ λ°›κΈ° μœ„ν•œ Input View 클래슀 + μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 클래슀 OutputView - μ‚¬μš©μžμ—κ²Œ λ‹€μ–‘ν•œ 응닡을 좜λ ₯ν•˜κΈ° μœ„ν•œ Output View 클래슀 + μ‚¬μš©μžμ—κ²Œ 응닡을 좜λ ₯ν•˜λŠ” 클래슀     β†˜οΈ  / constants @@ -76,7 +76,7 @@ - Image + Package Structure Overview @@ -89,6 +89,8 @@ ## ✨  κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ +### + - βœ… `a ~ b` μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ `n자리`의 μ •μˆ˜λ₯Ό 랜덀으둜 μƒμ„±ν•œλ‹€. - Default Setting : `1 ~ 9`μ‚¬μ΄μ˜ μ„œλ‘œ 값이 λ‹€λ₯Έ `3자리`의 μ •μˆ˜ - βœ… κ²Œμž„ μ‹œμž‘ 문ꡬ 좜λ ₯ @@ -113,18 +115,21 @@ - μž…λ ₯받은 input이 1κ³Ό 2κ°€ μ•„λ‹Œ 숫자일 경우 μ˜ˆμ™Έμ²˜λ¦¬ - μž…λ ₯값에 따라 κ²Œμž„μ„ μž¬μ‹œμž‘ν•˜κ±°λ‚˜ μ’…λ£Œν•œλ‹€. ---- +-------------------------------------------------------- ## 🎨  κ΅¬ν˜„ κ°„ κ³ λ―Όν–ˆλ˜ λ‚΄μš©λ“€ -- (μœ μ—°ν•œ 섀계) input 숫자의 λ²”μœ„κ°€ λ³€ν•˜λ”λΌλ„(1~9), μžλ¦¬μˆ˜κ°€ λ³€ν•˜λ”λΌλ„ λŒ€μ‘μ΄ μ†μ‰½κ²Œ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
- `GameConfig` νŒŒμΌμ—μ„œ `NUMBER_LENGTH` λ³€μˆ˜μ˜ valueλ₯Ό λ³€κ²½ν•΄ μ†μ‰½κ²Œ 변경이 κ°€λŠ₯ν•˜λ‹€. +### 1️⃣   ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆλŠ” OCP 섀계 -
+- input 숫자의 λ²”μœ„κ°€ λ³€ν•˜λ”λΌλ„(1~9), μžλ¦¬μˆ˜κ°€ λ³€ν•˜λ”λΌλ„ λŒ€μ‘μ΄ μ†μ‰½κ²Œ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
+ `GameConfig` νŒŒμΌμ—μ„œ `NUMBER_LENGTH` λ³€μˆ˜μ˜ valueλ₯Ό λ³€κ²½ν•΄ μ†μ‰½κ²Œ 변경이 κ°€λŠ₯ν•˜λ‹€.
+ 개발 μš”κ΅¬μ‚¬ν•­μ—μ„œ 자릿수 μš”μ²­κΉŒμ§€ μ²˜λ¦¬ν•˜λŠ” λ¬Έμ œμ˜€λ‹€λ©΄, λ”μš± OCPλ₯Ό μ€€μˆ˜ν•˜λŠ” μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν–ˆμ„ 것 κ°™λ‹€. + +
- + @@ -134,5 +139,68 @@
숫자 3자리(Default)숫자 3자리 숫자 4자리 숫자 5자리
+ + +-------------------------------------------------------- + +### 2️⃣ 4번의 λŒ€κ·œλͺ¨ λ¦¬νŒ©ν† λ§, 그리고 μ–»μ–΄λ‚Έ κ°’μ§„ `Number` + +- μ˜κ°μ„ μ–»κ²Œ ν•΄μ€¬λ˜ ν•œ λ§ˆλ”” + ```bash + κ°μ²΄λŠ” '자율적인 쑴재'λΌλŠ” 점을 λͺ…μ‹¬ν•˜λΌ. + < μ€‘λž΅ > + κ°μ²΄λŠ” 슀슀둜의 행동에 μ˜ν•΄μ„œλ§Œ μƒνƒœκ°€ λ³€κ²½λ˜λŠ” 것을 보μž₯ν•¨μœΌλ‘œμ¨ 객체의 μžμœ¨μ„±μ„ 보μž₯ν•œλ‹€. + + - 객체지ν–₯의 사싀과 μ˜€ν•΄ δΈ­ + ``` + +- First-class collection + Static Factory Method ν™œμš© + ```java + public class Number { + private final List numbers; + + // Player Input Number Constructor + private Number(String input) { + validateEmpty(input); + validateNumberLength(input); + validateContainOnlyNumber(input); + validateContainDuplicatedNumber(input); + + this.numbers = convertInputNumber(input); + } + + // Computer Generated Number Constructor + private Number(List computerNumber) { + this.numbers = computerNumber; + } + } + ``` + +- 일급 μ»¬λ ‰μ…˜κ³Ό μƒμ„±μž 검증을 μ‚¬μš©ν•΄ `numbers`에 μœ νš¨ν•˜κ²Œ 검증이 λλ‚œ 숫자만 λ“€μ–΄μ˜€λ„λ‘ 섀계 +- playerNumber와, computerNumber의 μƒμ„±μžλŠ” μ„œλ‘œ λ‹€λ₯Έ νŒŒλΌλ―Έν„°λ₯Ό μ§€λ‹ˆκΈ° λ•Œλ¬Έμ—, κ°œλ°œμžκ°€ μ‚¬μš© κ°„ ν˜Όλ™ κ°€λŠ₯
+ ν•΄λ‹Ή 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, μƒμ„±μžλ₯Ό `private`으둜 μ œν•œν•˜κ³ , μ˜λ―ΈμžˆλŠ” λ©”μ†Œλ“œλ‘œλ§Œ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ„λ‘ 섀계 + + ```java + // Computer Generated Number Constructor + public static Number generateRandomNumbers() { + List randomNumbers = new ArrayList<>(); + while (randomNumbers.size() < NUMBER_LENGTH.getValue()) { + int number = pickNumberInRange(RANDOM_NUMBER_MINIMUM.getValue(), RANDOM_NUMBER_MAXIMUM.getValue()); + if (!hasDuplicatedNumber(randomNumbers, number)) { + randomNumbers.add(number); + } + } + return new Number(randomNumbers); + } + + // Player Number Static Factory Method + public static Number inputPlayerNumbers() { + String playerNumbers = InputView.askPlayerNumbers(); + return new Number(playerNumbers); + } + ``` +- 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ λͺ…에 의미λ₯Ό λΆ€μ—¬ν•˜κ³ , κ°œλ°œμžκ°€ μ§κ΄€μ μœΌλ‘œ 해석할 수 μžˆλ„λ‘ ν–ˆκ³ ,
+ 일급 μ»¬λ ‰μ…˜μ„ ν™œμš©ν•΄ 검증이 λλ‚œ μœ νš¨ν•œ κ°’λ§Œ λ¦¬μŠ€νŠΈμ— 담을 수 있게 λ˜μ—ˆλ‹€! + +- ----