From 630aa2e52fb1aa26e97b391ca85c50893ad177e1 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Mon, 18 Nov 2024 23:12:42 +0900 Subject: [PATCH 01/16] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 139 +++++++++++------------------------------------------- 1 file changed, 28 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index e7af80b..f058ea7 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,61 @@ # 미션 - 숫자 야구 -## 🔍 진행 방식 +### 구현할 기능목록 -- 미션은 **기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항** 세 가지로 구성되어 있다. -- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만든다. -- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. +**3자리수 생성** -## 📮 미션 제출 방법 +- [ ] 1에서 9까지의 서로 다른 수로 이루어진 3자리 숫자를 생성한다. -- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다. - - GitHub을 활용한 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고해 - 제출한다. -- GitHub에 미션을 제출한 후 [우아한테크코스 지원](https://apply.techcourse.co.kr) 사이트에 접속하여 프리코스 과제를 제출한다. - - 자세한 방법은 [제출 가이드](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 참고 - - **Pull Request만 보내고 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.** +**사용자 입력** -## 🚨 과제 제출 전 체크 리스트 - 0점 방지 +- [ ] 사용자에게 중복없는 세자리 숫자를 입력 받는다 -- 기능 구현을 모두 정상적으로 했더라도 **요구 사항에 명시된 출력값 형식을 지키지 않을 경우 0점으로 처리**한다. -- 기능 구현을 완료한 뒤 아래 가이드에 따라 테스트를 실행했을 때 모든 테스트가 성공하는지 확인한다. -- **테스트가 실패할 경우 0점으로 처리**되므로, 반드시 확인 후 제출한다. +**야구 게임 진행** -### 테스트 실행 가이드 +- [ ] 랜덤 생성한 세자리 숫자와 사용자에게 입력받은 세자리 숫자를 비교한다. +- [ ] 같은 숫자가 같은 자리에 있을 때 스트라이크를 출력한다 +- [ ] 같은 숫자이지만 다른 자리에 있을 때 볼을 출력한다 +- [ ] 일치하는 숫자가 하나도 없을 경우 낫싱을 출력한다 -- 터미널에서 `java -version`을 실행하여 Java 버전이 17인지 확인한다. - Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 17로 실행되는지 확인한다. -- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행하고, - Windows 사용자의 경우 `gradlew.bat clean test` 또는 `./gradlew.bat clean test` 명령을 실행할 때 모든 테스트가 아래와 같이 통과하는지 확인한다. +예시: ``` -BUILD SUCCESSFUL in 0s -``` - ---- - -## 🚀 기능 요구 사항 - -기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. - -- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. - - 예) 상대방(컴퓨터)의 수가 425일 때 - - 123을 제시한 경우 : 1스트라이크 - - 456을 제시한 경우 : 1볼 1스트라이크 - - 789를 제시한 경우 : 낫싱 -- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 - 결과를 출력한다. -- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. -- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. - -### 입출력 요구 사항 - -#### 입력 +낫싱 -- 서로 다른 3자리의 수 -- 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수 +``` -#### 출력 +- [ ] 볼과 스트라이크과 동시에 있을 경우 볼 스트라이크 순서로 출력한다 -- 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 +예시: ``` 1볼 1스트라이크 -``` - -- 하나도 없는 경우 -``` -낫싱 ``` -- 3개의 숫자를 모두 맞힐 경우 +- [ ] 3개의 숫자를 모두 맞힐 경우 3스트라이크 와 게임 종료 메시지를 출력한다 -``` -3스트라이크 -3개의 숫자를 모두 맞히셨습니다! 게임 종료 -``` - -- 게임 시작 문구 출력 - -``` -숫자 야구 게임을 시작합니다. -``` - -#### 실행 결과 예시 +예시: ``` -숫자 야구 게임을 시작합니다. -숫자를 입력해주세요 : 123 -1볼 1스트라이크 -숫자를 입력해주세요 : 145 -1볼 -숫자를 입력해주세요 : 671 -2볼 -숫자를 입력해주세요 : 216 -1스트라이크 -숫자를 입력해주세요 : 713 3스트라이크 3개의 숫자를 모두 맞히셨습니다! 게임 종료 -게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. -1 -숫자를 입력해주세요 : 123 -1볼 -... -``` - ---- -## 🎯 프로그래밍 요구 사항 - -- JDK 17 버전에서 실행 가능해야 한다. **JDK 17에서 정상적으로 동작하지 않을 경우 0점 처리한다.** -- 프로그램 실행의 시작점은 `Application`의 `main()`이다. -- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. -- [Java 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/master/styleguide/java) 가이드를 준수하며 프로그래밍한다. -- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. -- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** -- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. +``` -### 라이브러리 +**게임 진행 & 종료-사용자 입력** -- `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms` 및 `Console` API를 사용하여 구현해야 한다. - - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInRange()`를 활용한다. - - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. +- [ ] 게임이 끝났을시 재시작 여부를 확인한다 + - [ ] 1이면 재시작, 2면 종료 -#### 사용 예시 +### 예외처리 -```java -List computer = new ArrayList<>(); -while (computer.size() < 3) { - int randomNumber = Randoms.pickNumberInRange(1, 9); - if (!computer.contains(randomNumber)) { - computer.add(randomNumber); - } -} -``` +**3자리 숫자 입력 부분** ---- +- [ ] 3자리 숫자가 아닌 경우 +- [ ] 중복된 숫자가 들어가는 경우 +- [ ] 0이 들어가는 경우 -## ✏️ 과제 진행 요구 사항 +**재시작 여부 입력 부분** -- 미션은 [java-baseball-6](https://github.com/woowacourse-precourse/java-baseball-6) 저장소를 Fork & Clone해 시작한다. -- **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다. -- 과제 진행 및 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고한다. +- [ ] 1또는 2가 아니면 예외처리 \ No newline at end of file From 85a566a000763ae20a764e5e52bcfdd7690803de Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Mon, 18 Nov 2024 23:39:05 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20=EC=95=BC=EA=B5=AC=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 7 ++++++- src/main/java/baseball/config/Appconfig.java | 20 +++++++++++++++++++ .../controller/BaseballController.java | 19 ++++++++++++++++++ src/main/java/baseball/view/InputView.java | 14 +++++++++++++ src/main/java/baseball/view/OutputView.java | 4 ++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/config/Appconfig.java create mode 100644 src/main/java/baseball/controller/BaseballController.java 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/Application.java b/src/main/java/baseball/Application.java index dd95a34..1299b94 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,12 @@ package baseball; +import baseball.config.Appconfig; +import baseball.controller.BaseballController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + Appconfig appConfig = new Appconfig(); + BaseballController baseballController = appConfig.baseballController(); + baseballController.start(); } } diff --git a/src/main/java/baseball/config/Appconfig.java b/src/main/java/baseball/config/Appconfig.java new file mode 100644 index 0000000..504ff53 --- /dev/null +++ b/src/main/java/baseball/config/Appconfig.java @@ -0,0 +1,20 @@ +package baseball.config; + +import baseball.controller.BaseballController; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class Appconfig { + public BaseballController baseballController() { + return new BaseballController(inputView(), outputView()); + } + + public InputView inputView() { + return new InputView(); + } + + public OutputView outputView() { + return new OutputView(); + } + +} diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java new file mode 100644 index 0000000..a97231b --- /dev/null +++ b/src/main/java/baseball/controller/BaseballController.java @@ -0,0 +1,19 @@ +package baseball.controller; + +import baseball.view.InputView; +import baseball.view.OutputView; + +public class BaseballController { + private final InputView inputView; + private final OutputView outputView; + + public BaseballController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void start() { + inputView.inputBasebalNumber(); + + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 0000000..6a0d6c2 --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,14 @@ +package baseball.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + private static final String BASEBALL_GAME_START="숫자 야구 게임을 시작합니다."; + private static final String INPUT_NUMBER_REQUEST="숫자를 입력해주세요 : "; + + public String inputBasebalNumber() { + System.out.println(BASEBALL_GAME_START); + System.out.printf(INPUT_NUMBER_REQUEST); + return Console.readLine().trim(); + } +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 0000000..7483684 --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,4 @@ +package baseball.view; + +public class OutputView { +} From 6b28aecb5ec3a26cbc07989f22b86347ed3d9f3b Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 12:30:16 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=EC=95=BC=EA=B5=AC=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/utils/ErrorMessages.java | 10 ++++++ .../baseball/validation/InputValidation.java | 11 ++++++ .../validation/InputValidationImpl.java | 36 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/main/java/baseball/utils/ErrorMessages.java create mode 100644 src/main/java/baseball/validation/InputValidation.java create mode 100644 src/main/java/baseball/validation/InputValidationImpl.java diff --git a/src/main/java/baseball/utils/ErrorMessages.java b/src/main/java/baseball/utils/ErrorMessages.java new file mode 100644 index 0000000..956ade6 --- /dev/null +++ b/src/main/java/baseball/utils/ErrorMessages.java @@ -0,0 +1,10 @@ +package baseball.utils; + +public class ErrorMessages { + private static final String ERROR_PREFIX = "[ERROR] "; + public static final String INVALID_NUMBER_FORMAT = ERROR_PREFIX + "숫자만 입력가능 합니다"; + public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9사이의 숫자만 입력가능합니다"; + + private ErrorMessages() { + } +} diff --git a/src/main/java/baseball/validation/InputValidation.java b/src/main/java/baseball/validation/InputValidation.java new file mode 100644 index 0000000..37b31cf --- /dev/null +++ b/src/main/java/baseball/validation/InputValidation.java @@ -0,0 +1,11 @@ +package baseball.validation; + +public interface InputValidation { + int vlalidate(String number); + + void validateRange(String number); + + void validateZero(String number); + + int validateNumber(String number); +} diff --git a/src/main/java/baseball/validation/InputValidationImpl.java b/src/main/java/baseball/validation/InputValidationImpl.java new file mode 100644 index 0000000..e3bb549 --- /dev/null +++ b/src/main/java/baseball/validation/InputValidationImpl.java @@ -0,0 +1,36 @@ +package baseball.validation; + +import baseball.utils.ErrorMessages; + +public class InputValidationImpl implements InputValidation { + private static final String RANGE_VALIDATE_SINGLE_NUMBER = "0"; + private static final int RANGE_VALIDATE_NUMBER =3; + @Override + public int vlalidate(String number) { + validateZero(number); + validateRange(number); + return validateNumber(number); + } + @Override + public void validateRange(String number) { + if(number.contains(RANGE_VALIDATE_SINGLE_NUMBER)) { + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_RANGE); + } + } + + @Override + public void validateZero(String number) { + if((number.length()!=RANGE_VALIDATE_NUMBER)){ + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_RANGE); + } + } + + @Override + public int validateNumber(String number) { + try { + return Integer.parseInt(number); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_FORMAT); + } + } +} From 80dd380a0a8780b146a576727be7486897574220 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 12:54:27 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=EC=95=BC=EA=B5=AC=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=88=AB=EC=9E=90=20=EB=9E=9C=EB=8D=A4=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/config/Appconfig.java | 13 ++++++++++++- .../baseball/controller/BaseballController.java | 15 +++++++++++++-- .../generator/BaseballNumberGenerator.java | 7 +++++++ .../generator/BaseballNumberGeneratorImpl.java | 16 ++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 src/main/java/baseball/generator/BaseballNumberGenerator.java create mode 100644 src/main/java/baseball/generator/BaseballNumberGeneratorImpl.java diff --git a/src/main/java/baseball/config/Appconfig.java b/src/main/java/baseball/config/Appconfig.java index 504ff53..aaa994c 100644 --- a/src/main/java/baseball/config/Appconfig.java +++ b/src/main/java/baseball/config/Appconfig.java @@ -1,14 +1,25 @@ package baseball.config; import baseball.controller.BaseballController; +import baseball.generator.BaseballNumberGenerator; +import baseball.generator.BaseballNumberGeneratorImpl; +import baseball.validation.InputValidation; +import baseball.validation.InputValidationImpl; import baseball.view.InputView; import baseball.view.OutputView; public class Appconfig { public BaseballController baseballController() { - return new BaseballController(inputView(), outputView()); + return new BaseballController(inputView(), outputView(), inputValidation(),baseballNumberGenerator()); } + public InputValidation inputValidation(){ + return new InputValidationImpl(); + } + + public BaseballNumberGenerator baseballNumberGenerator(){ + return new BaseballNumberGeneratorImpl(); + } public InputView inputView() { return new InputView(); } diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index a97231b..8b9b848 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,19 +1,30 @@ package baseball.controller; +import baseball.generator.BaseballNumberGenerator; +import baseball.generator.BaseballNumberGeneratorImpl; +import baseball.validation.InputValidation; import baseball.view.InputView; import baseball.view.OutputView; +import java.util.List; + public class BaseballController { private final InputView inputView; private final OutputView outputView; + private final InputValidation inputValidationImpl; + private final BaseballNumberGenerator baseballNumberGeneratorImpl; + - public BaseballController(InputView inputView, OutputView outputView) { + public BaseballController(InputView inputView, OutputView outputView, InputValidation inputValidationImpl, BaseballNumberGenerator baseballNumberGeneratorImpl) { this.inputView = inputView; this.outputView = outputView; + this.inputValidationImpl = inputValidationImpl; + this.baseballNumberGeneratorImpl = baseballNumberGeneratorImpl; } public void start() { - inputView.inputBasebalNumber(); + List baseballNumber = baseballNumberGeneratorImpl.generate(); + inputValidationImpl.vlalidate(inputView.inputBasebalNumber()); } } diff --git a/src/main/java/baseball/generator/BaseballNumberGenerator.java b/src/main/java/baseball/generator/BaseballNumberGenerator.java new file mode 100644 index 0000000..febe8a6 --- /dev/null +++ b/src/main/java/baseball/generator/BaseballNumberGenerator.java @@ -0,0 +1,7 @@ +package baseball.generator; + +import java.util.List; + +public interface BaseballNumberGenerator { + List generate(); +} diff --git a/src/main/java/baseball/generator/BaseballNumberGeneratorImpl.java b/src/main/java/baseball/generator/BaseballNumberGeneratorImpl.java new file mode 100644 index 0000000..2dab3d4 --- /dev/null +++ b/src/main/java/baseball/generator/BaseballNumberGeneratorImpl.java @@ -0,0 +1,16 @@ +package baseball.generator; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.List; + +public class BaseballNumberGeneratorImpl implements BaseballNumberGenerator{ + private static final int BASEBALL_NUMBER_COUNT = 3; + private static final int MIN_BASEBALL_NUMBER = 1; + private static final int MAX_BASEBALL_NUMBER = 9; + @Override + public List generate() { + return Randoms.pickUniqueNumbersInRange(MIN_BASEBALL_NUMBER, MAX_BASEBALL_NUMBER, BASEBALL_NUMBER_COUNT); + } + +} From 2cedc9c7a1ca2c09ae723000dfefc3b894cd37aa Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 13:04:48 +0900 Subject: [PATCH 05/16] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=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/utils/ErrorMessages.java | 3 ++- src/main/java/baseball/validation/InputValidationImpl.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/utils/ErrorMessages.java b/src/main/java/baseball/utils/ErrorMessages.java index 956ade6..37d7642 100644 --- a/src/main/java/baseball/utils/ErrorMessages.java +++ b/src/main/java/baseball/utils/ErrorMessages.java @@ -3,7 +3,8 @@ public class ErrorMessages { private static final String ERROR_PREFIX = "[ERROR] "; public static final String INVALID_NUMBER_FORMAT = ERROR_PREFIX + "숫자만 입력가능 합니다"; - public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9사이의 숫자만 입력가능합니다"; + public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9 사이의 숫자만 입력가능합니다"; + public static final String INVALID_INPUT_COUNT = ERROR_PREFIX + "3자리 숫자여야 합니다"; private ErrorMessages() { } diff --git a/src/main/java/baseball/validation/InputValidationImpl.java b/src/main/java/baseball/validation/InputValidationImpl.java index e3bb549..3729800 100644 --- a/src/main/java/baseball/validation/InputValidationImpl.java +++ b/src/main/java/baseball/validation/InputValidationImpl.java @@ -21,7 +21,7 @@ public void validateRange(String number) { @Override public void validateZero(String number) { if((number.length()!=RANGE_VALIDATE_NUMBER)){ - throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_RANGE); + throw new IllegalArgumentException(ErrorMessages.INVALID_INPUT_COUNT); } } From 0e14cc795f7a58ec1966b0a4df0c5e9a7e13ba63 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 13:44:04 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=20=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8A=94=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 3 +- src/main/java/baseball/model/Baseball.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/model/Baseball.java diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 8b9b848..38789c6 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,7 +1,7 @@ package baseball.controller; import baseball.generator.BaseballNumberGenerator; -import baseball.generator.BaseballNumberGeneratorImpl; +import baseball.model.Baseball; import baseball.validation.InputValidation; import baseball.view.InputView; import baseball.view.OutputView; @@ -24,6 +24,7 @@ public BaseballController(InputView inputView, OutputView outputView, InputValid public void start() { List baseballNumber = baseballNumberGeneratorImpl.generate(); + Baseball baseball = new Baseball(baseballNumber); inputValidationImpl.vlalidate(inputView.inputBasebalNumber()); } diff --git a/src/main/java/baseball/model/Baseball.java b/src/main/java/baseball/model/Baseball.java new file mode 100644 index 0000000..8341024 --- /dev/null +++ b/src/main/java/baseball/model/Baseball.java @@ -0,0 +1,28 @@ +package baseball.model; + +import baseball.utils.ErrorMessages; + +import java.util.List; + +public class Baseball { + private final List numbers; + + public Baseball(List numbers) { + validateRange(numbers); + validateNumberRange(numbers); + this.numbers = numbers; + } + private void validateRange(List numbers) { + if (numbers.size() != 3) { + throw new IllegalArgumentException(ErrorMessages.INVALID_INPUT_COUNT); + } + } + private void validateNumberRange(List numbers) { + if (numbers.stream().anyMatch(num -> num < 1 || num > 9)) { + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_RANGE); + } + } + public List getNumbers() { + return numbers; + } +} From 63a2cb9e33c3e9631b7242ee5e5a027309dfbf8a Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 14:50:29 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC=EC=99=80=20=EB=B3=BC=EC=9D=84=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 4 ++- src/main/java/baseball/model/Referee.java | 36 +++++++++++++++++++ src/main/java/baseball/model/Result.java | 19 ++++++++++ .../baseball/validation/InputValidation.java | 4 +-- .../validation/InputValidationImpl.java | 9 ++--- 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/main/java/baseball/model/Referee.java create mode 100644 src/main/java/baseball/model/Result.java diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 38789c6..9eddb19 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -2,6 +2,7 @@ import baseball.generator.BaseballNumberGenerator; import baseball.model.Baseball; +import baseball.model.Referee; import baseball.validation.InputValidation; import baseball.view.InputView; import baseball.view.OutputView; @@ -25,7 +26,8 @@ public BaseballController(InputView inputView, OutputView outputView, InputValid public void start() { List baseballNumber = baseballNumberGeneratorImpl.generate(); Baseball baseball = new Baseball(baseballNumber); - inputValidationImpl.vlalidate(inputView.inputBasebalNumber()); + String UserNumber = inputValidationImpl.validate(inputView.inputBasebalNumber()); + Referee referee = new Referee(baseball, UserNumber); } } diff --git a/src/main/java/baseball/model/Referee.java b/src/main/java/baseball/model/Referee.java new file mode 100644 index 0000000..9c35e04 --- /dev/null +++ b/src/main/java/baseball/model/Referee.java @@ -0,0 +1,36 @@ +package baseball.model; + +import java.util.List; + +public class Referee { + + public Referee(Baseball computer, String userNumber) { + List computerNumbers = computer.getNumbers(); + int matchingCount = countMatchingNumbers(computerNumbers, userNumber); + int strikes = countSamePositionMatches(computerNumbers, userNumber); + new Result(strikes, matchingCount-strikes); + } + + private int countMatchingNumbers(List computerNumbers, String userNumber) { + int count = 0; + for (char digitChar : userNumber.toCharArray()) { + int currentDigit = Character.getNumericValue(digitChar); + if (computerNumbers.contains(currentDigit)) { + count++; + } + } + return count; + } + public int countSamePositionMatches(List computerNumbers, String userNumber) { + int count = 0; + int index = 0; + for (int computerDigit : computerNumbers) { + int userDigit = Character.getNumericValue(userNumber.charAt(index)); + if (computerDigit == userDigit) { + count++; + } + index++; + } + return count; + } +} diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java new file mode 100644 index 0000000..be1dfed --- /dev/null +++ b/src/main/java/baseball/model/Result.java @@ -0,0 +1,19 @@ +package baseball.model; + +public class Result { + private final int strikes; + private final int balls; + + public Result(int strikes, int balls) { + this.strikes = strikes; + this.balls = balls; + } + + public int getStrikes() { + return strikes; + } + + public int getBalls() { + return balls; + } +} \ No newline at end of file diff --git a/src/main/java/baseball/validation/InputValidation.java b/src/main/java/baseball/validation/InputValidation.java index 37b31cf..ca53078 100644 --- a/src/main/java/baseball/validation/InputValidation.java +++ b/src/main/java/baseball/validation/InputValidation.java @@ -1,11 +1,11 @@ package baseball.validation; public interface InputValidation { - int vlalidate(String number); + String validate(String number); void validateRange(String number); void validateZero(String number); - int validateNumber(String number); + void validateNumber(String number); } diff --git a/src/main/java/baseball/validation/InputValidationImpl.java b/src/main/java/baseball/validation/InputValidationImpl.java index 3729800..0914b12 100644 --- a/src/main/java/baseball/validation/InputValidationImpl.java +++ b/src/main/java/baseball/validation/InputValidationImpl.java @@ -6,10 +6,11 @@ public class InputValidationImpl implements InputValidation { private static final String RANGE_VALIDATE_SINGLE_NUMBER = "0"; private static final int RANGE_VALIDATE_NUMBER =3; @Override - public int vlalidate(String number) { + public String validate(String number) { validateZero(number); validateRange(number); - return validateNumber(number); + validateNumber(number); + return number; } @Override public void validateRange(String number) { @@ -26,9 +27,9 @@ public void validateZero(String number) { } @Override - public int validateNumber(String number) { + public void validateNumber(String number) { try { - return Integer.parseInt(number); + Integer.parseInt(number); }catch (NumberFormatException e){ throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_FORMAT); } From 44a9ba2a1cb620ec4e97b1bf29228b16db5a9781 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 15:04:33 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC=EC=99=80=20=EB=B3=BC=20=EA=B0=9C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 7 ++-- src/main/java/baseball/dto/ResultDTO.java | 19 ++++++++++ src/main/java/baseball/model/Referee.java | 18 +++++++--- src/main/java/baseball/view/OutputView.java | 35 +++++++++++++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 src/main/java/baseball/dto/ResultDTO.java diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 9eddb19..3f70723 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,8 +1,10 @@ package baseball.controller; +import baseball.dto.ResultDTO; import baseball.generator.BaseballNumberGenerator; import baseball.model.Baseball; import baseball.model.Referee; +import baseball.model.Result; import baseball.validation.InputValidation; import baseball.view.InputView; import baseball.view.OutputView; @@ -27,7 +29,8 @@ public void start() { List baseballNumber = baseballNumberGeneratorImpl.generate(); Baseball baseball = new Baseball(baseballNumber); String UserNumber = inputValidationImpl.validate(inputView.inputBasebalNumber()); - Referee referee = new Referee(baseball, UserNumber); - + Result result = new Referee(baseball, UserNumber).getResult(); + ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); + outputView.printResult(resultDTO); } } diff --git a/src/main/java/baseball/dto/ResultDTO.java b/src/main/java/baseball/dto/ResultDTO.java new file mode 100644 index 0000000..e6c5d3d --- /dev/null +++ b/src/main/java/baseball/dto/ResultDTO.java @@ -0,0 +1,19 @@ +package baseball.dto; + +public class ResultDTO { + private final int strikes; + private final int balls; + + public ResultDTO(int strikes, int balls) { + this.strikes = strikes; + this.balls = balls; + } + + public int getStrikes() { + return strikes; + } + + public int getBalls() { + return balls; + } +} diff --git a/src/main/java/baseball/model/Referee.java b/src/main/java/baseball/model/Referee.java index 9c35e04..7cac7a6 100644 --- a/src/main/java/baseball/model/Referee.java +++ b/src/main/java/baseball/model/Referee.java @@ -3,12 +3,21 @@ import java.util.List; public class Referee { + private Result result; - public Referee(Baseball computer, String userNumber) { + public Referee(Baseball computer, String userNumber) { + this.result = calculateResult(computer, userNumber); + } + + public Result getResult() { + return this.result; + } + + private Result calculateResult(Baseball computer, String userNumber) { List computerNumbers = computer.getNumbers(); - int matchingCount = countMatchingNumbers(computerNumbers, userNumber); + int matchingCount = countMatchingNumbers(computerNumbers, userNumber); int strikes = countSamePositionMatches(computerNumbers, userNumber); - new Result(strikes, matchingCount-strikes); + return new Result(strikes, matchingCount - strikes); } private int countMatchingNumbers(List computerNumbers, String userNumber) { @@ -21,7 +30,8 @@ private int countMatchingNumbers(List computerNumbers, String userNumbe } return count; } - public int countSamePositionMatches(List computerNumbers, String userNumber) { + + private int countSamePositionMatches(List computerNumbers, String userNumber) { int count = 0; int index = 0; for (int computerDigit : computerNumbers) { diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 7483684..a85db3e 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,4 +1,39 @@ package baseball.view; +import baseball.dto.ResultDTO; + public class OutputView { + + // 상수 선언 + private static final String NOTHING_MESSAGE = "낫싱"; + private static final String STRIKE_MESSAGE_FORMAT = "%d스트라이크"; + private static final String BALL_MESSAGE_FORMAT = "%d볼 "; + private static final String GAME_OVER_MESSAGE = "게임 종료"; + private static final int MAX_STRIKES = 3; + + public void printResult(ResultDTO result) { + int strikes = result.getStrikes(); + int balls = result.getBalls(); + + // 출력 로직만 처리 + if (strikes == 0 && balls == 0) { + System.out.println(NOTHING_MESSAGE); + } + + if (strikes == MAX_STRIKES) { + System.out.println(String.format(STRIKE_MESSAGE_FORMAT, strikes)); + System.out.println(GAME_OVER_MESSAGE); + } + + if (strikes > 0 || balls > 0) { + StringBuilder resultMessage = new StringBuilder(); + if (balls > 0) { + resultMessage.append(String.format(BALL_MESSAGE_FORMAT, balls)); + } + if (strikes > 0) { + resultMessage.append(String.format(STRIKE_MESSAGE_FORMAT, strikes)); + } + System.out.println(resultMessage.toString().trim()); + } + } } From 968d6a3ba9592e2524106b1142a1aa356aebc6f7 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 15:17:01 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat:=203=EC=8A=A4=ED=8A=B8=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=81=AC=EA=B0=80=20=EB=90=A0=EB=95=8C=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EB=B0=98=EB=B3=B5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseball/controller/BaseballController.java | 13 +++++++++---- src/main/java/baseball/view/InputView.java | 4 +++- src/main/java/baseball/view/OutputView.java | 3 +-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 3f70723..490a9e1 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -28,9 +28,14 @@ public BaseballController(InputView inputView, OutputView outputView, InputValid public void start() { List baseballNumber = baseballNumberGeneratorImpl.generate(); Baseball baseball = new Baseball(baseballNumber); - String UserNumber = inputValidationImpl.validate(inputView.inputBasebalNumber()); - Result result = new Referee(baseball, UserNumber).getResult(); - ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); - outputView.printResult(resultDTO); + inputView.printBaseballGameStart(); + + Result result; + do { + String userNumber = inputValidationImpl.validate(inputView.inputBasebalNumber()); + result = new Referee(baseball, userNumber).getResult(); + ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); + outputView.printResult(resultDTO); + } while (result.getStrikes() != 3); } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 6a0d6c2..132bf19 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -6,8 +6,10 @@ public class InputView { private static final String BASEBALL_GAME_START="숫자 야구 게임을 시작합니다."; private static final String INPUT_NUMBER_REQUEST="숫자를 입력해주세요 : "; - public String inputBasebalNumber() { + public void printBaseballGameStart() { System.out.println(BASEBALL_GAME_START); + } + public String inputBasebalNumber() { System.out.printf(INPUT_NUMBER_REQUEST); return Console.readLine().trim(); } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index a85db3e..b9ad7bf 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -8,14 +8,13 @@ public class OutputView { private static final String NOTHING_MESSAGE = "낫싱"; private static final String STRIKE_MESSAGE_FORMAT = "%d스트라이크"; private static final String BALL_MESSAGE_FORMAT = "%d볼 "; - private static final String GAME_OVER_MESSAGE = "게임 종료"; + private static final String GAME_OVER_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; private static final int MAX_STRIKES = 3; public void printResult(ResultDTO result) { int strikes = result.getStrikes(); int balls = result.getBalls(); - // 출력 로직만 처리 if (strikes == 0 && balls == 0) { System.out.println(NOTHING_MESSAGE); } From afc184228fb9bf969b2aa4d0412d13da26bc4440 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 15:18:24 +0900 Subject: [PATCH 10/16] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/config/Appconfig.java | 8 ++++---- .../java/baseball/controller/BaseballController.java | 10 +++++----- ...InputValidation.java => InputNumberValidation.java} | 2 +- ...idationImpl.java => InputNumberValidationImpl.java} | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/baseball/validation/{InputValidation.java => InputNumberValidation.java} (82%) rename src/main/java/baseball/validation/{InputValidationImpl.java => InputNumberValidationImpl.java} (93%) diff --git a/src/main/java/baseball/config/Appconfig.java b/src/main/java/baseball/config/Appconfig.java index aaa994c..f740af0 100644 --- a/src/main/java/baseball/config/Appconfig.java +++ b/src/main/java/baseball/config/Appconfig.java @@ -3,8 +3,8 @@ import baseball.controller.BaseballController; import baseball.generator.BaseballNumberGenerator; import baseball.generator.BaseballNumberGeneratorImpl; -import baseball.validation.InputValidation; -import baseball.validation.InputValidationImpl; +import baseball.validation.InputNumberValidation; +import baseball.validation.InputNumberValidationImpl; import baseball.view.InputView; import baseball.view.OutputView; @@ -13,8 +13,8 @@ public BaseballController baseballController() { return new BaseballController(inputView(), outputView(), inputValidation(),baseballNumberGenerator()); } - public InputValidation inputValidation(){ - return new InputValidationImpl(); + public InputNumberValidation inputValidation(){ + return new InputNumberValidationImpl(); } public BaseballNumberGenerator baseballNumberGenerator(){ diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 490a9e1..de9ff41 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -5,7 +5,7 @@ import baseball.model.Baseball; import baseball.model.Referee; import baseball.model.Result; -import baseball.validation.InputValidation; +import baseball.validation.InputNumberValidation; import baseball.view.InputView; import baseball.view.OutputView; @@ -14,14 +14,14 @@ public class BaseballController { private final InputView inputView; private final OutputView outputView; - private final InputValidation inputValidationImpl; + private final InputNumberValidation inputNumberValidationImpl; private final BaseballNumberGenerator baseballNumberGeneratorImpl; - public BaseballController(InputView inputView, OutputView outputView, InputValidation inputValidationImpl, BaseballNumberGenerator baseballNumberGeneratorImpl) { + public BaseballController(InputView inputView, OutputView outputView, InputNumberValidation inputNumberValidationImpl, BaseballNumberGenerator baseballNumberGeneratorImpl) { this.inputView = inputView; this.outputView = outputView; - this.inputValidationImpl = inputValidationImpl; + this.inputNumberValidationImpl = inputNumberValidationImpl; this.baseballNumberGeneratorImpl = baseballNumberGeneratorImpl; } @@ -32,7 +32,7 @@ public void start() { Result result; do { - String userNumber = inputValidationImpl.validate(inputView.inputBasebalNumber()); + String userNumber = inputNumberValidationImpl.validate(inputView.inputBasebalNumber()); result = new Referee(baseball, userNumber).getResult(); ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); outputView.printResult(resultDTO); diff --git a/src/main/java/baseball/validation/InputValidation.java b/src/main/java/baseball/validation/InputNumberValidation.java similarity index 82% rename from src/main/java/baseball/validation/InputValidation.java rename to src/main/java/baseball/validation/InputNumberValidation.java index ca53078..a1bb461 100644 --- a/src/main/java/baseball/validation/InputValidation.java +++ b/src/main/java/baseball/validation/InputNumberValidation.java @@ -1,6 +1,6 @@ package baseball.validation; -public interface InputValidation { +public interface InputNumberValidation { String validate(String number); void validateRange(String number); diff --git a/src/main/java/baseball/validation/InputValidationImpl.java b/src/main/java/baseball/validation/InputNumberValidationImpl.java similarity index 93% rename from src/main/java/baseball/validation/InputValidationImpl.java rename to src/main/java/baseball/validation/InputNumberValidationImpl.java index 0914b12..9e75382 100644 --- a/src/main/java/baseball/validation/InputValidationImpl.java +++ b/src/main/java/baseball/validation/InputNumberValidationImpl.java @@ -2,7 +2,7 @@ import baseball.utils.ErrorMessages; -public class InputValidationImpl implements InputValidation { +public class InputNumberValidationImpl implements InputNumberValidation { private static final String RANGE_VALIDATE_SINGLE_NUMBER = "0"; private static final int RANGE_VALIDATE_NUMBER =3; @Override From e49eae434d7eaa5c758a581454e5054bfc8f0bc0 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 15:38:11 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/config/Appconfig.java | 8 ++++- .../controller/BaseballController.java | 30 ++++++++++++++----- .../java/baseball/utils/ErrorMessages.java | 1 + .../validation/InputUserChoiceValidation.java | 9 ++++++ .../InputUserChoiceValidationImpl.java | 27 +++++++++++++++++ src/main/java/baseball/view/InputView.java | 5 ++++ 6 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 src/main/java/baseball/validation/InputUserChoiceValidation.java create mode 100644 src/main/java/baseball/validation/InputUserChoiceValidationImpl.java diff --git a/src/main/java/baseball/config/Appconfig.java b/src/main/java/baseball/config/Appconfig.java index f740af0..f25e522 100644 --- a/src/main/java/baseball/config/Appconfig.java +++ b/src/main/java/baseball/config/Appconfig.java @@ -5,12 +5,14 @@ import baseball.generator.BaseballNumberGeneratorImpl; import baseball.validation.InputNumberValidation; import baseball.validation.InputNumberValidationImpl; +import baseball.validation.InputUserChoiceValidation; +import baseball.validation.InputUserChoiceValidationImpl; import baseball.view.InputView; import baseball.view.OutputView; public class Appconfig { public BaseballController baseballController() { - return new BaseballController(inputView(), outputView(), inputValidation(),baseballNumberGenerator()); + return new BaseballController(inputView(), outputView(), inputValidation(),baseballNumberGenerator(),inputUserChoiceValidation()); } public InputNumberValidation inputValidation(){ @@ -20,6 +22,10 @@ public InputNumberValidation inputValidation(){ public BaseballNumberGenerator baseballNumberGenerator(){ return new BaseballNumberGeneratorImpl(); } + + public InputUserChoiceValidation inputUserChoiceValidation(){ + return new InputUserChoiceValidationImpl(); + } public InputView inputView() { return new InputView(); } diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index de9ff41..295ad98 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -6,6 +6,7 @@ import baseball.model.Referee; import baseball.model.Result; import baseball.validation.InputNumberValidation; +import baseball.validation.InputUserChoiceValidation; import baseball.view.InputView; import baseball.view.OutputView; @@ -16,13 +17,14 @@ public class BaseballController { private final OutputView outputView; private final InputNumberValidation inputNumberValidationImpl; private final BaseballNumberGenerator baseballNumberGeneratorImpl; + private final InputUserChoiceValidation inputUserChoiceValidation; - - public BaseballController(InputView inputView, OutputView outputView, InputNumberValidation inputNumberValidationImpl, BaseballNumberGenerator baseballNumberGeneratorImpl) { + public BaseballController(InputView inputView, OutputView outputView, InputNumberValidation inputNumberValidationImpl, BaseballNumberGenerator baseballNumberGeneratorImpl, InputUserChoiceValidation inputUserChoiceValidation) { this.inputView = inputView; this.outputView = outputView; this.inputNumberValidationImpl = inputNumberValidationImpl; this.baseballNumberGeneratorImpl = baseballNumberGeneratorImpl; + this.inputUserChoiceValidation = inputUserChoiceValidation; } public void start() { @@ -31,11 +33,23 @@ public void start() { inputView.printBaseballGameStart(); Result result; - do { - String userNumber = inputNumberValidationImpl.validate(inputView.inputBasebalNumber()); - result = new Referee(baseball, userNumber).getResult(); - ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); - outputView.printResult(resultDTO); - } while (result.getStrikes() != 3); + boolean keepPlaying = true; + while (keepPlaying) { + do { + String userNumber = inputNumberValidationImpl.validate(inputView.inputBasebalNumber()); + result = new Referee(baseball, userNumber).getResult(); + ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); + outputView.printResult(resultDTO); + } while (result.getStrikes() != 3); + + int userChoice = inputUserChoiceValidation.validate(inputView.restartGame()); + if (userChoice == 1) { + baseballNumber = baseballNumberGeneratorImpl.generate(); + baseball = new Baseball(baseballNumber); + } + if (userChoice == 0) { + keepPlaying = false; + } + } } } diff --git a/src/main/java/baseball/utils/ErrorMessages.java b/src/main/java/baseball/utils/ErrorMessages.java index 37d7642..e55bc8f 100644 --- a/src/main/java/baseball/utils/ErrorMessages.java +++ b/src/main/java/baseball/utils/ErrorMessages.java @@ -4,6 +4,7 @@ public class ErrorMessages { private static final String ERROR_PREFIX = "[ERROR] "; public static final String INVALID_NUMBER_FORMAT = ERROR_PREFIX + "숫자만 입력가능 합니다"; public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9 사이의 숫자만 입력가능합니다"; + public static final String INVALID_CHOICE_RANGE = ERROR_PREFIX + "1또는0만 입력가능합니다"; public static final String INVALID_INPUT_COUNT = ERROR_PREFIX + "3자리 숫자여야 합니다"; private ErrorMessages() { diff --git a/src/main/java/baseball/validation/InputUserChoiceValidation.java b/src/main/java/baseball/validation/InputUserChoiceValidation.java new file mode 100644 index 0000000..f1cf5b1 --- /dev/null +++ b/src/main/java/baseball/validation/InputUserChoiceValidation.java @@ -0,0 +1,9 @@ +package baseball.validation; + +public interface InputUserChoiceValidation { + int validate(String number); + + void validateRange(String number); + + int validateNumber(String number); +} diff --git a/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java b/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java new file mode 100644 index 0000000..6bd1ef0 --- /dev/null +++ b/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java @@ -0,0 +1,27 @@ +package baseball.validation; + +import baseball.utils.ErrorMessages; + +public class InputUserChoiceValidationImpl implements InputUserChoiceValidation{ + @Override + public int validate(String number) { + validateRange(number); + return validateNumber(number); + + } + @Override + public void validateRange(String number) { + if (!number.equals("0") && !number.equals("1")) { + throw new IllegalArgumentException(ErrorMessages.INVALID_CHOICE_RANGE); + } + } + + @Override + public int validateNumber(String number) { + try { + return Integer.parseInt(number); + }catch (NumberFormatException e){ + throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_FORMAT); + } + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 132bf19..3db06da 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -5,6 +5,7 @@ public class InputView { private static final String BASEBALL_GAME_START="숫자 야구 게임을 시작합니다."; private static final String INPUT_NUMBER_REQUEST="숫자를 입력해주세요 : "; + private static final String RESTART_GAME_REQUEST="게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; public void printBaseballGameStart() { System.out.println(BASEBALL_GAME_START); @@ -13,4 +14,8 @@ public String inputBasebalNumber() { System.out.printf(INPUT_NUMBER_REQUEST); return Console.readLine().trim(); } + public String restartGame(){ + System.out.println(RESTART_GAME_REQUEST); + return Console.readLine().trim(); + } } From c53399841dc893573099dd1330a664109caf8672 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 17:03:42 +0900 Subject: [PATCH 12/16] =?UTF-8?q?fix:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/validation/InputNumberValidationImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/validation/InputNumberValidationImpl.java b/src/main/java/baseball/validation/InputNumberValidationImpl.java index 9e75382..b07d704 100644 --- a/src/main/java/baseball/validation/InputNumberValidationImpl.java +++ b/src/main/java/baseball/validation/InputNumberValidationImpl.java @@ -13,14 +13,14 @@ public String validate(String number) { return number; } @Override - public void validateRange(String number) { + public void validateZero(String number) { if(number.contains(RANGE_VALIDATE_SINGLE_NUMBER)) { throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_RANGE); } } @Override - public void validateZero(String number) { + public void validateRange(String number) { if((number.length()!=RANGE_VALIDATE_NUMBER)){ throw new IllegalArgumentException(ErrorMessages.INVALID_INPUT_COUNT); } From e0f361fd017474eff3f6cbaa6c5bf1cebb811730 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 17:04:16 +0900 Subject: [PATCH 13/16] =?UTF-8?q?fix:=20=EC=84=A0=ED=83=9D=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/controller/BaseballController.java | 2 +- src/main/java/baseball/utils/ErrorMessages.java | 2 +- .../validation/InputUserChoiceValidationImpl.java | 2 +- src/main/java/baseball/view/OutputView.java | 9 +++++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 295ad98..988ee55 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -47,7 +47,7 @@ public void start() { baseballNumber = baseballNumberGeneratorImpl.generate(); baseball = new Baseball(baseballNumber); } - if (userChoice == 0) { + if (userChoice == 2) { keepPlaying = false; } } diff --git a/src/main/java/baseball/utils/ErrorMessages.java b/src/main/java/baseball/utils/ErrorMessages.java index e55bc8f..42b4da9 100644 --- a/src/main/java/baseball/utils/ErrorMessages.java +++ b/src/main/java/baseball/utils/ErrorMessages.java @@ -4,7 +4,7 @@ public class ErrorMessages { private static final String ERROR_PREFIX = "[ERROR] "; public static final String INVALID_NUMBER_FORMAT = ERROR_PREFIX + "숫자만 입력가능 합니다"; public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9 사이의 숫자만 입력가능합니다"; - public static final String INVALID_CHOICE_RANGE = ERROR_PREFIX + "1또는0만 입력가능합니다"; + public static final String INVALID_CHOICE_RANGE = ERROR_PREFIX + "1또는2만 입력가능합니다"; public static final String INVALID_INPUT_COUNT = ERROR_PREFIX + "3자리 숫자여야 합니다"; private ErrorMessages() { diff --git a/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java b/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java index 6bd1ef0..89b23d2 100644 --- a/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java +++ b/src/main/java/baseball/validation/InputUserChoiceValidationImpl.java @@ -11,7 +11,7 @@ public int validate(String number) { } @Override public void validateRange(String number) { - if (!number.equals("0") && !number.equals("1")) { + if (!number.equals("1") && !number.equals("2")) { throw new IllegalArgumentException(ErrorMessages.INVALID_CHOICE_RANGE); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index b9ad7bf..0955247 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -19,10 +19,7 @@ public void printResult(ResultDTO result) { System.out.println(NOTHING_MESSAGE); } - if (strikes == MAX_STRIKES) { - System.out.println(String.format(STRIKE_MESSAGE_FORMAT, strikes)); - System.out.println(GAME_OVER_MESSAGE); - } + if (strikes > 0 || balls > 0) { StringBuilder resultMessage = new StringBuilder(); @@ -33,6 +30,10 @@ public void printResult(ResultDTO result) { resultMessage.append(String.format(STRIKE_MESSAGE_FORMAT, strikes)); } System.out.println(resultMessage.toString().trim()); + if (strikes == MAX_STRIKES) { + System.out.println(GAME_OVER_MESSAGE); + } + } } } From 44c803af496e797c90bc80e1735318f7f74e40d8 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 17:09:43 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 988ee55..06ff96d 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -28,28 +28,42 @@ public BaseballController(InputView inputView, OutputView outputView, InputNumbe } public void start() { - List baseballNumber = baseballNumberGeneratorImpl.generate(); - Baseball baseball = new Baseball(baseballNumber); inputView.printBaseballGameStart(); - - Result result; boolean keepPlaying = true; while (keepPlaying) { - do { - String userNumber = inputNumberValidationImpl.validate(inputView.inputBasebalNumber()); - result = new Referee(baseball, userNumber).getResult(); - ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); - outputView.printResult(resultDTO); - } while (result.getStrikes() != 3); - - int userChoice = inputUserChoiceValidation.validate(inputView.restartGame()); - if (userChoice == 1) { - baseballNumber = baseballNumberGeneratorImpl.generate(); - baseball = new Baseball(baseballNumber); - } - if (userChoice == 2) { - keepPlaying = false; - } + keepPlaying = playGame(); + } + } + + private boolean playGame() { + List baseballNumber = baseballNumberGeneratorImpl.generate(); + Baseball baseball = new Baseball(baseballNumber); + boolean gameFinished = false; + + while (!gameFinished) { + gameFinished = playTurn(baseball); + } + + return processUserChoice(); + } + + private boolean playTurn(Baseball baseball) { + String userNumber = inputNumberValidationImpl.validate(inputView.inputBasebalNumber()); + Result result = new Referee(baseball, userNumber).getResult(); + ResultDTO resultDTO = new ResultDTO(result.getStrikes(), result.getBalls()); + outputView.printResult(resultDTO); + + return result.getStrikes() == 3; + } + + private boolean processUserChoice() { + int userChoice = inputUserChoiceValidation.validate(inputView.restartGame()); + if (userChoice == 1) { + return true; + } + if (userChoice == 2) { + return false; } + return false; } } From d240b530d9dcc8ce9c041e2153d3af92f66c5f0a Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 17:14:10 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/utils/ErrorMessages.java | 2 ++ .../baseball/validation/InputNumberValidation.java | 2 ++ .../validation/InputNumberValidationImpl.java | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/main/java/baseball/utils/ErrorMessages.java b/src/main/java/baseball/utils/ErrorMessages.java index 42b4da9..869096e 100644 --- a/src/main/java/baseball/utils/ErrorMessages.java +++ b/src/main/java/baseball/utils/ErrorMessages.java @@ -1,11 +1,13 @@ package baseball.utils; public class ErrorMessages { + private static final String ERROR_PREFIX = "[ERROR] "; public static final String INVALID_NUMBER_FORMAT = ERROR_PREFIX + "숫자만 입력가능 합니다"; public static final String INVALID_NUMBER_RANGE = ERROR_PREFIX + "1~9 사이의 숫자만 입력가능합니다"; public static final String INVALID_CHOICE_RANGE = ERROR_PREFIX + "1또는2만 입력가능합니다"; public static final String INVALID_INPUT_COUNT = ERROR_PREFIX + "3자리 숫자여야 합니다"; + public static final String INVALID_DUPLICATE_NUMBER = "숫자는 중복될 수 없습니다."; private ErrorMessages() { } diff --git a/src/main/java/baseball/validation/InputNumberValidation.java b/src/main/java/baseball/validation/InputNumberValidation.java index a1bb461..a3d64c7 100644 --- a/src/main/java/baseball/validation/InputNumberValidation.java +++ b/src/main/java/baseball/validation/InputNumberValidation.java @@ -8,4 +8,6 @@ public interface InputNumberValidation { void validateZero(String number); void validateNumber(String number); + + void validateUniqueDigits(String number); } diff --git a/src/main/java/baseball/validation/InputNumberValidationImpl.java b/src/main/java/baseball/validation/InputNumberValidationImpl.java index b07d704..f934940 100644 --- a/src/main/java/baseball/validation/InputNumberValidationImpl.java +++ b/src/main/java/baseball/validation/InputNumberValidationImpl.java @@ -2,6 +2,9 @@ import baseball.utils.ErrorMessages; +import java.util.HashSet; +import java.util.Set; + public class InputNumberValidationImpl implements InputNumberValidation { private static final String RANGE_VALIDATE_SINGLE_NUMBER = "0"; private static final int RANGE_VALIDATE_NUMBER =3; @@ -10,6 +13,7 @@ public String validate(String number) { validateZero(number); validateRange(number); validateNumber(number); + validateUniqueDigits(number); return number; } @Override @@ -34,4 +38,13 @@ public void validateNumber(String number) { throw new IllegalArgumentException(ErrorMessages.INVALID_NUMBER_FORMAT); } } + @Override + public void validateUniqueDigits(String number) { + Set uniqueDigits = new HashSet<>(); + for (char digit : number.toCharArray()) { + if (!uniqueDigits.add(digit)) { + throw new IllegalArgumentException(ErrorMessages.INVALID_DUPLICATE_NUMBER); + } + } + } } From 98d166b84d57483c36c96a30cc6d35ef396d3506 Mon Sep 17 00:00:00 2001 From: jinhyeon Date: Tue, 19 Nov 2024 17:14:55 +0900 Subject: [PATCH 16/16] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f058ea7..15684f5 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,18 @@ **3자리수 생성** -- [ ] 1에서 9까지의 서로 다른 수로 이루어진 3자리 숫자를 생성한다. +- [x] 1에서 9까지의 서로 다른 수로 이루어진 3자리 숫자를 생성한다. **사용자 입력** -- [ ] 사용자에게 중복없는 세자리 숫자를 입력 받는다 +- [x] 사용자에게 중복없는 세자리 숫자를 입력 받는다 **야구 게임 진행** -- [ ] 랜덤 생성한 세자리 숫자와 사용자에게 입력받은 세자리 숫자를 비교한다. -- [ ] 같은 숫자가 같은 자리에 있을 때 스트라이크를 출력한다 -- [ ] 같은 숫자이지만 다른 자리에 있을 때 볼을 출력한다 -- [ ] 일치하는 숫자가 하나도 없을 경우 낫싱을 출력한다 +- [x] 랜덤 생성한 세자리 숫자와 사용자에게 입력받은 세자리 숫자를 비교한다. +- [x] 같은 숫자가 같은 자리에 있을 때 스트라이크를 출력한다 +- [x] 같은 숫자이지만 다른 자리에 있을 때 볼을 출력한다 +- [x] 일치하는 숫자가 하나도 없을 경우 낫싱을 출력한다 예시: @@ -24,7 +24,7 @@ ``` -- [ ] 볼과 스트라이크과 동시에 있을 경우 볼 스트라이크 순서로 출력한다 +- [x] 볼과 스트라이크과 동시에 있을 경우 볼 스트라이크 순서로 출력한다 예시: @@ -33,7 +33,7 @@ ``` -- [ ] 3개의 숫자를 모두 맞힐 경우 3스트라이크 와 게임 종료 메시지를 출력한다 +- [x] 3개의 숫자를 모두 맞힐 경우 3스트라이크 와 게임 종료 메시지를 출력한다 예시: @@ -45,17 +45,17 @@ **게임 진행 & 종료-사용자 입력** -- [ ] 게임이 끝났을시 재시작 여부를 확인한다 - - [ ] 1이면 재시작, 2면 종료 +- [x] 게임이 끝났을시 재시작 여부를 확인한다 + - [x] 1이면 재시작, 2면 종료 ### 예외처리 **3자리 숫자 입력 부분** -- [ ] 3자리 숫자가 아닌 경우 -- [ ] 중복된 숫자가 들어가는 경우 -- [ ] 0이 들어가는 경우 +- [x] 3자리 숫자가 아닌 경우 +- [x] 중복된 숫자가 들어가는 경우 +- [x] 0이 들어가는 경우 **재시작 여부 입력 부분** -- [ ] 1또는 2가 아니면 예외처리 \ No newline at end of file +- [x] 1또는 2가 아니면 예외처리 \ No newline at end of file