From db044d18be4a9f0c0356b4aef634efa20177551c Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:20:17 +0900 Subject: [PATCH 01/26] docs(README.md): list functions --- README.md | 138 ++++-------------------------------------------------- 1 file changed, 9 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index 04dc4f6ae..ca9014116 100644 --- a/README.md +++ b/README.md @@ -1,129 +1,9 @@ -# 과제 - 숫자 야구 게임 - -## 🔍 진행 방식 - -- 과제는 **기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항** 세 가지로 구성되어 있다. -- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. -- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. - ---- - -## 📈 과제 진행 및 제출 방법 - -- 과제는 [java-baseball](https://github.com/LandvibeDev/java-baseball) 저장소를 Fork/Clone해 시작한다. -- **기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리**해 추가한다. -- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- 과제 진행 및 제출 방법은 [우아한코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다. - - base repository를 `LandvibeDev/java-baseball`로 지정해서 PR 생성하면됨 - -
- -### 테스트 실행 가이드 - -- 터미널에서 `java -version`을 실행하여 Java 버전이 14인지 확인한다. 또는 Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 14로 실행되는지 확인한다. -- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행 하고, - Windows 사용자의 경우 `gradlew.bat clean test` 명령을 실행할 때 동작 하는지 만 확인(테스트는 실패). - ---- - -## 🚀 기능 요구사항 - -기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. - -- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. - - 예) 상대방(컴퓨터)의 수가 425일 때 - - 123을 제시한 경우 : 1스트라이크 - - 456을 제시한 경우 : 1볼 1스트라이크 - - 789를 제시한 경우 : 낫싱 -- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. -- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. -- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. -- 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다. - -
- -## ✍🏻 입출력 요구사항 - -### ⌨️ 입력 - -- 3자리의 수 -- 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수 - -### 🖥 출력 - -- 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 - -``` -1볼 1스트라이크 -``` - -- 하나도 없는 경우 - -``` -낫싱 -``` - -- 3개의 숫자를 모두 맞힐 경우 - -``` -3스트라이크 -3개의 숫자를 모두 맞히셨습니다! 게임 종료 -``` - -### 💻 실행 결과 예시 - -``` -숫자를 입력해주세요 : 123 -1볼 1스트라이크 -숫자를 입력해주세요 : 145 -1볼 -숫자를 입력해주세요 : 671 -2볼 -숫자를 입력해주세요 : 216 -1스트라이크 -숫자를 입력해주세요 : 713 -3스트라이크 -3개의 숫자를 모두 맞히셨습니다! 게임 종료 -게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. -1 -숫자를 입력해주세요 : 123 -1볼 -… -``` - -
- ---- - -## 🎱 프로그래밍 요구사항 -- -- JDK 14 버전에서 실행 가능해야 한다. -- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다. -- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. -- [Java 코드 컨벤션](https://naver.github.io/hackday-conventions-java) 가이드를 준수하며 프로그래밍한다. -- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. -- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. -- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라. -- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다. -- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- Java Enum을 적용한다. -- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다. - - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. - -### 라이브러리 - Randoms, Console - -- JDK에서 기본 제공하는 Random, Scanner API 대신 [`camp.nextstep.edu.missionutils`](https://github.com/woowacourse-projects/mission-utils)에서 제공하는 `Randoms`, `Console` API를 활용해 구현해야 한다. - - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInRange()`를 활용한다. - - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. -- 프로그램 구현을 완료했을 때 `src/test/java` 디렉터리의 `ApplicationTest`에 있는 모든 테스트 케이스가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** +#숫자야구 + +##기능 +- 1~9에서 세개의 중복되지 않은 무작위 숫자 뽑기 +- 사용자로부터 1~9에서 세개의 중복되지 않은 숫자 입력 받기 +- 올바른 입력인지 체크 +- 입력에 대한 결과 도출 +- 결과 출력 +- 게임 재시작 여부 받기 From fe9df38f21b532bf2b6c13fe90499a199a18695f Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:25:00 +0900 Subject: [PATCH 02/26] fix(build.gradle): change java version make it compile on Java 11 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 12ae76bcd..9989a1fc7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { java { toolchain { - languageVersion = JavaLanguageVersion.of(14) + languageVersion = JavaLanguageVersion.of(11) } } From 2cfe679266ae8c4ed5e9e6d5b2457231e50568db Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:39:48 +0900 Subject: [PATCH 03/26] feat(BaseballGame.java): make BaseballGame class and number methods - make two array to store random, input numbers - make getRandomNumbers() - make getInputNumbers() --- src/main/java/baseball/BaseballGame.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/baseball/BaseballGame.java diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java new file mode 100644 index 000000000..356e6906c --- /dev/null +++ b/src/main/java/baseball/BaseballGame.java @@ -0,0 +1,23 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; + +public class BaseballGame { + int[] randomNumbers = new int[3]; + int[] inputNumbers = new int[3]; + + private void getRandomNumbers() { + Random random = new Random(); + randomNumbers = random.makeRandomNumbers(); + } + + private void getInputNumbers() { + ExceptionHandler exceptionHandler = new ExceptionHandler(); + System.out.print("숫자를 입력해주세요 : "); + String input = Console.readLine(); + exceptionHandler.handleException(input); + for (int i=0; i<3; i++) { + inputNumbers[i] = input.charAt(i) - '0'; + } + } +} From 39cb370e16eec12e4c31babf65dac0c9b61d3ea9 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:43:20 +0900 Subject: [PATCH 04/26] feat(ExceptionHandler): make ExceptionHandler and methods to verify input --- src/main/java/baseball/ExceptionHandler.java | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/baseball/ExceptionHandler.java diff --git a/src/main/java/baseball/ExceptionHandler.java b/src/main/java/baseball/ExceptionHandler.java new file mode 100644 index 000000000..b305f3599 --- /dev/null +++ b/src/main/java/baseball/ExceptionHandler.java @@ -0,0 +1,31 @@ +package baseball; + +import java.util.HashSet; +import java.util.Set; + +public class ExceptionHandler { + + public void handleException(String input) { + lengthCheck(input); + wrongInputCheck(input); + } + + private void lengthCheck(String input) { + if (input.length() < 3 || input.length() > 3) { + throw new IllegalArgumentException("세개의 숫자만 입력하세요"); + } + } + + private void wrongInputCheck(String input) { + Set set = new HashSet<>(); + for (int i =0; i<3; i++) { + set.add(input.charAt(i)-'0'); + if (input.charAt(i) -'0' <= 0 || input.charAt(i) - '0' > 9) { + throw new IllegalArgumentException("1-9 숫자만 가능합니다"); + } + } + if (set.size() < 3) { + throw new IllegalArgumentException(); + } + } +} From 756584927cf8e08e746e502ac89e7f83f543453e Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:46:37 +0900 Subject: [PATCH 05/26] feat(BaseballGame): game result checking methods two methods - checkBall() - checkStrike() --- src/main/java/baseball/BaseballGame.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 356e6906c..06447d9a3 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -20,4 +20,27 @@ private void getInputNumbers() { inputNumbers[i] = input.charAt(i) - '0'; } } + + private int checkStrike() { + int strike = 0; + for (int i=0; i<3; i++) { + if (randomNumbers[i] == inputNumbers[i]) { + strike++; + inputNumbers[i] = -1; + } + } + return strike; + } + + private int checkBall() { + int ball = 0; + for (int i=0; i<3; i++) { + for (int j=0; j<3; j++) { + if (randomNumbers[i] == inputNumbers[j]) { + ball++; + } + } + } + return ball; + } } From fda843a65d55f84f0940fd2cf88fc45f624529f3 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:48:07 +0900 Subject: [PATCH 06/26] feat(Random): make random class for generate random numbers --- src/main/java/baseball/Random.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/baseball/Random.java diff --git a/src/main/java/baseball/Random.java b/src/main/java/baseball/Random.java new file mode 100644 index 000000000..e37bff0b8 --- /dev/null +++ b/src/main/java/baseball/Random.java @@ -0,0 +1,24 @@ +package baseball; + +import java.util.HashSet; +import java.util.Set; + +import camp.nextstep.edu.missionutils.Randoms; + + +public class Random { + + public int[] makeRandomNumbers() { + Set s = new HashSet<>(); + int[] randomNumbers = new int[3]; + while (s.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (s.contains(randomNumber)) { + continue; + } + randomNumbers[s.size()] = randomNumber; + s.add(randomNumber); + } + return randomNumbers; + } +} From 55d87f58d2080d575c33f04f4d8422a4d3f353ed Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:50:35 +0900 Subject: [PATCH 07/26] feat(BaseballGame): print game result --- src/main/java/baseball/BaseballGame.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 06447d9a3..f4d584fab 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -43,4 +43,26 @@ private int checkBall() { } return ball; } + + private boolean getResult(int strike, int ball) { + if (strike == 0 && ball == 0) { + System.out.println("낫싱"); + return false; + } + if (ball > 0) { + System.out.print(ball + "볼 "); + if (strike == 0) { + System.out.println(); + } + } + if (strike > 0) { + System.out.println(strike + "스트라이크"); + if(strike == 3) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + return true; + } + } + return false; + } } From c60d71ac2ed8dcb8ec014608f430b2ffb7d87173 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:54:27 +0900 Subject: [PATCH 08/26] feat(BaseballGame): take a input and derive game result --- src/main/java/baseball/BaseballGame.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index f4d584fab..1bc7c6a9c 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -21,6 +21,17 @@ private void getInputNumbers() { } } + private void playGame() { + while (true) { + getInputNumbers(); + int strike = checkStrike(); + int ball = checkBall(); + if (getResult(strike, ball)) { + break; + } + } + } + private int checkStrike() { int strike = 0; for (int i=0; i<3; i++) { From e2a59d58575a3fb931bded5c851d345a9ab2e4c5 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:58:15 +0900 Subject: [PATCH 09/26] feat(BaseballGame): make flow managing method and method that is take input wether go or stop --- src/main/java/baseball/BaseballGame.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 1bc7c6a9c..b01c67afa 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -6,6 +6,12 @@ public class BaseballGame { int[] randomNumbers = new int[3]; int[] inputNumbers = new int[3]; + public void start() { + getRandomNumbers(); + playGame(); + goOrStop(); + } + private void getRandomNumbers() { Random random = new Random(); randomNumbers = random.makeRandomNumbers(); @@ -32,6 +38,13 @@ private void playGame() { } } + private void goOrStop() { + String input = Console.readLine(); + if (input.contains("1")) { + start(); + } + } + private int checkStrike() { int strike = 0; for (int i=0; i<3; i++) { @@ -76,4 +89,4 @@ private boolean getResult(int strike, int ball) { } return false; } -} +} \ No newline at end of file From 7813451d4275de477d5f31559e156256dd6c9ba9 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 00:58:53 +0900 Subject: [PATCH 10/26] feat(Application): start number baseball game --- src/main/java/baseball/Application.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 7f1901b8b..de84a0831 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -3,5 +3,7 @@ public class Application { public static void main(String[] args) { //TODO: 숫자 야구 게임 구현 + BaseballGame baseballGame = new BaseballGame(); + baseballGame.start(); } } From cbefa9c0394f74320df0d2add0db1df9442d166d Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 01:03:48 +0900 Subject: [PATCH 11/26] fix: keep coding convention --- src/main/java/baseball/BaseballGame.java | 8 ++++---- src/main/java/baseball/ExceptionHandler.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index b01c67afa..3207115fd 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -22,7 +22,7 @@ private void getInputNumbers() { System.out.print("숫자를 입력해주세요 : "); String input = Console.readLine(); exceptionHandler.handleException(input); - for (int i=0; i<3; i++) { + for (int i = 0; i < 3; i++) { inputNumbers[i] = input.charAt(i) - '0'; } } @@ -47,7 +47,7 @@ private void goOrStop() { private int checkStrike() { int strike = 0; - for (int i=0; i<3; i++) { + for (int i = 0; i < 3; i++) { if (randomNumbers[i] == inputNumbers[i]) { strike++; inputNumbers[i] = -1; @@ -58,8 +58,8 @@ private int checkStrike() { private int checkBall() { int ball = 0; - for (int i=0; i<3; i++) { - for (int j=0; j<3; j++) { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { if (randomNumbers[i] == inputNumbers[j]) { ball++; } diff --git a/src/main/java/baseball/ExceptionHandler.java b/src/main/java/baseball/ExceptionHandler.java index b305f3599..5fe88ce3e 100644 --- a/src/main/java/baseball/ExceptionHandler.java +++ b/src/main/java/baseball/ExceptionHandler.java @@ -18,9 +18,9 @@ private void lengthCheck(String input) { private void wrongInputCheck(String input) { Set set = new HashSet<>(); - for (int i =0; i<3; i++) { - set.add(input.charAt(i)-'0'); - if (input.charAt(i) -'0' <= 0 || input.charAt(i) - '0' > 9) { + for (int i = 0; i < 3; i++) { + set.add(input.charAt(i) - '0'); + if (input.charAt(i) - '0' <= 0 || input.charAt(i) - '0' > 9) { throw new IllegalArgumentException("1-9 숫자만 가능합니다"); } } From 2610b085e261a31cb10dbaa688fba5762728e1d4 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 22:47:05 +0900 Subject: [PATCH 12/26] fix(Constant): make constant for restart or exit --- src/main/java/baseball/Constant.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/baseball/Constant.java diff --git a/src/main/java/baseball/Constant.java b/src/main/java/baseball/Constant.java new file mode 100644 index 000000000..d2b4be4dd --- /dev/null +++ b/src/main/java/baseball/Constant.java @@ -0,0 +1,12 @@ +package baseball; + +public enum Constant { + RESTART("1"), + EXIT("0"); + + public String value; + + Constant(String value) { + this.value = value; + } +} From 761a4a3bd989690356b0898c4dd8465916acade4 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 22:49:24 +0900 Subject: [PATCH 13/26] fix(Random): fix return type and change constant to static variable --- src/main/java/baseball/Random.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/baseball/Random.java b/src/main/java/baseball/Random.java index e37bff0b8..21abb1a71 100644 --- a/src/main/java/baseball/Random.java +++ b/src/main/java/baseball/Random.java @@ -1,23 +1,23 @@ package baseball; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import camp.nextstep.edu.missionutils.Randoms; - public class Random { - public int[] makeRandomNumbers() { - Set s = new HashSet<>(); - int[] randomNumbers = new int[3]; - while (s.size() < 3) { - int randomNumber = Randoms.pickNumberInRange(1, 9); - if (s.contains(randomNumber)) { + public ArrayList makeRandomNumbers() { + Set numberSet = new HashSet<>(); + ArrayList randomNumbers = new ArrayList<>(); + while (numberSet.size() < BaseballGame.number) { + int randomNumber = Randoms.pickNumberInRange(BaseballGame.start, BaseballGame.end); + if (numberSet.contains(randomNumber)) { continue; } - randomNumbers[s.size()] = randomNumber; - s.add(randomNumber); + randomNumbers.add(randomNumber); + numberSet.add(randomNumber); } return randomNumbers; } From 7ad0a303b0c5f8ea5072b09eeb2b811af227e431 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 23:00:02 +0900 Subject: [PATCH 14/26] fix(Validation): edit class name, change throw condition and use regex --- src/main/java/baseball/Validation.java | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/baseball/Validation.java diff --git a/src/main/java/baseball/Validation.java b/src/main/java/baseball/Validation.java new file mode 100644 index 000000000..87c9944dd --- /dev/null +++ b/src/main/java/baseball/Validation.java @@ -0,0 +1,39 @@ +package baseball; + +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +public class Validation { + + String inputString; + + Validation(String inputString) { + this.inputString = inputString; + } + + public void handleException() { + lengthCheck(); + wrongInputCheck(); + } + + private void lengthCheck() { + if (inputString.length() != BaseballGame.number) { + throw new IllegalArgumentException("정해진 개수의 숫자만 입력해주세요"); + } + } + + private void wrongInputCheck() { + Set set = new HashSet<>(); + String pattern = "^[" + BaseballGame.start + "-" + BaseballGame.end +"]*$"; + for (int i = 0; i < BaseballGame.number; i++) { + if (!Pattern.matches(pattern, inputString)) { + throw new IllegalArgumentException("정해진 범위 안의 숫자만 입력해주세요"); + } + set.add(inputString.charAt(i) - '0'); + } + if (set.size() != BaseballGame.number) { + throw new IllegalArgumentException(); + } + } +} From 1775f415db29fc3cf1adf3142411d1bee2c40334 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 23:00:52 +0900 Subject: [PATCH 15/26] fix(ExceptionHandler): change class name ExceptionHandler -> Validation --- src/main/java/baseball/ExceptionHandler.java | 31 -------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/main/java/baseball/ExceptionHandler.java diff --git a/src/main/java/baseball/ExceptionHandler.java b/src/main/java/baseball/ExceptionHandler.java deleted file mode 100644 index 5fe88ce3e..000000000 --- a/src/main/java/baseball/ExceptionHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package baseball; - -import java.util.HashSet; -import java.util.Set; - -public class ExceptionHandler { - - public void handleException(String input) { - lengthCheck(input); - wrongInputCheck(input); - } - - private void lengthCheck(String input) { - if (input.length() < 3 || input.length() > 3) { - throw new IllegalArgumentException("세개의 숫자만 입력하세요"); - } - } - - private void wrongInputCheck(String input) { - Set set = new HashSet<>(); - for (int i = 0; i < 3; i++) { - set.add(input.charAt(i) - '0'); - if (input.charAt(i) - '0' <= 0 || input.charAt(i) - '0' > 9) { - throw new IllegalArgumentException("1-9 숫자만 가능합니다"); - } - } - if (set.size() < 3) { - throw new IllegalArgumentException(); - } - } -} From 19c33c2d3b0ea4caac0e43cc5a20e0327d31cbe6 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Thu, 29 Jun 2023 23:04:22 +0900 Subject: [PATCH 16/26] fix(BaseballGame): make static variables, change variable type, logic and naming - start, end, number : change constant to static variable - goOrStop -> restartOrExit - combine checkStrike, checkBall - make isSuccess method --- src/main/java/baseball/BaseballGame.java | 79 +++++++++++++----------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 3207115fd..3f6701637 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -1,15 +1,24 @@ package baseball; +import java.util.ArrayList; + import camp.nextstep.edu.missionutils.Console; public class BaseballGame { - int[] randomNumbers = new int[3]; - int[] inputNumbers = new int[3]; + static int start = 1; + static int end = 9; + static int number = 3; + + int strike = 0; + int ball = 0; + + ArrayList randomNumbers = new ArrayList<>(); + ArrayList inputNumbers = new ArrayList<>(); public void start() { getRandomNumbers(); playGame(); - goOrStop(); + restartOrExit(); } private void getRandomNumbers() { @@ -18,60 +27,62 @@ private void getRandomNumbers() { } private void getInputNumbers() { - ExceptionHandler exceptionHandler = new ExceptionHandler(); - System.out.print("숫자를 입력해주세요 : "); - String input = Console.readLine(); - exceptionHandler.handleException(input); - for (int i = 0; i < 3; i++) { - inputNumbers[i] = input.charAt(i) - '0'; + inputNumbers.clear(); + System.out.println("숫자를 입력해주세요 :"); + String inputString = Console.readLine(); + Validation validation = new Validation(inputString); + validation.handleException(); + for (int i = 0; i < number; i++) { + inputNumbers.add(inputString.charAt(i) - '0'); } } private void playGame() { while (true) { getInputNumbers(); - int strike = checkStrike(); - int ball = checkBall(); - if (getResult(strike, ball)) { + checkStrikeAndBall(); + getResult(); + if (isSuccess()) { break; } } } - private void goOrStop() { + private void restartOrExit() { String input = Console.readLine(); - if (input.contains("1")) { + if (input.equals(Constant.RESTART.value)) { start(); } } - private int checkStrike() { - int strike = 0; - for (int i = 0; i < 3; i++) { - if (randomNumbers[i] == inputNumbers[i]) { + private void checkStrikeAndBall() { + strike = 0; + ball = 0; + for (int i = 0; i < number; i++) { + if (randomNumbers.get(i) == inputNumbers.get(i)) { strike++; - inputNumbers[i] = -1; + inputNumbers.set(i, -1); } - } - return strike; - } - - private int checkBall() { - int ball = 0; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (randomNumbers[i] == inputNumbers[j]) { + for (int j = 0; j < number; j++) { + if (randomNumbers.get(i) == inputNumbers.get(j)) { ball++; } } } - return ball; } - private boolean getResult(int strike, int ball) { + private boolean isSuccess() { + if (strike == number) { + System.out.println(number + "개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + return true; + } + return false; + } + + private void getResult() { if (strike == 0 && ball == 0) { System.out.println("낫싱"); - return false; } if (ball > 0) { System.out.print(ball + "볼 "); @@ -81,12 +92,6 @@ private boolean getResult(int strike, int ball) { } if (strike > 0) { System.out.println(strike + "스트라이크"); - if(strike == 3) { - System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); - return true; - } } - return false; } } \ No newline at end of file From 5d2e09843ab40171c478f7f4ddce234d9917abb4 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:16:52 +0900 Subject: [PATCH 17/26] fix(Constant): edit wrong value --- src/main/java/baseball/Constant.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/Constant.java b/src/main/java/baseball/Constant.java index d2b4be4dd..ed934c290 100644 --- a/src/main/java/baseball/Constant.java +++ b/src/main/java/baseball/Constant.java @@ -2,7 +2,7 @@ public enum Constant { RESTART("1"), - EXIT("0"); + EXIT("2"); public String value; From 5020974c6c7a6383102647d93840d279844fc46b Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:17:25 +0900 Subject: [PATCH 18/26] rafactor(ExceptionMessage): use enum --- src/main/java/baseball/ExceptionMessage.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/baseball/ExceptionMessage.java diff --git a/src/main/java/baseball/ExceptionMessage.java b/src/main/java/baseball/ExceptionMessage.java new file mode 100644 index 000000000..c21a66516 --- /dev/null +++ b/src/main/java/baseball/ExceptionMessage.java @@ -0,0 +1,13 @@ +package baseball; + +public enum ExceptionMessage { + WRONG_LENGTH("정해진 개수의 숫자만 입력해주세요"), + WRONG_CHARACTER("정해진 범위 안의 숫자만 입력해주세요"), + DUPLICATION("중복된 숫자가 입력되었습니다"); + + public String message; + + ExceptionMessage(String message) { + this.message = message; + } +} From 77d324b7428cc75420aa308e7eade4368dc2f165 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:18:06 +0900 Subject: [PATCH 19/26] refactor(GameMessage): make game message(print) using enum --- src/main/java/baseball/GameMessage.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/baseball/GameMessage.java diff --git a/src/main/java/baseball/GameMessage.java b/src/main/java/baseball/GameMessage.java new file mode 100644 index 000000000..644fb714c --- /dev/null +++ b/src/main/java/baseball/GameMessage.java @@ -0,0 +1,17 @@ +package baseball; + +public enum GameMessage { + ENTER_NUMBERS_MESSAGE("숫자를 입력해주세요 : "), + SUCCESS_MESSAGE("개의 숫자를 모두 맞히셨습니다! 게임 종료"), + ASK_RETRY("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"), + BALL("볼"), + STRIKE("스트라이크"), + NOTTING("낫싱"); + + + public String message; + + GameMessage(String message) { + this.message = message; + } +} From ef7013609a9de0a5619fc6bfcb97958009feb575 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:18:49 +0900 Subject: [PATCH 20/26] refactor(Rule): make another class to manage game rule variables --- src/main/java/baseball/Rule.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/baseball/Rule.java diff --git a/src/main/java/baseball/Rule.java b/src/main/java/baseball/Rule.java new file mode 100644 index 000000000..00989834c --- /dev/null +++ b/src/main/java/baseball/Rule.java @@ -0,0 +1,7 @@ +package baseball; + +public class Rule { + static final int start = 1; + static final int end = 9; + static final int number = 3; +} From 38e1fff6133c7a47878a4a452a301defc6ff5054 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:19:11 +0900 Subject: [PATCH 21/26] refactor(Validation): seperate methods --- src/main/java/baseball/Validation.java | 42 +++++++++++++++----------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/baseball/Validation.java b/src/main/java/baseball/Validation.java index 87c9944dd..147201d2d 100644 --- a/src/main/java/baseball/Validation.java +++ b/src/main/java/baseball/Validation.java @@ -6,34 +6,40 @@ public class Validation { - String inputString; - - Validation(String inputString) { - this.inputString = inputString; + public void validateInput(String inputString) { + lengthCheck(inputString); + characterCheck(inputString); + duplicationCheck(inputString); } - public void handleException() { - lengthCheck(); - wrongInputCheck(); + private void lengthCheck(String inputString) { + if (inputString.length() != Rule.number) { + throw new IllegalArgumentException(ExceptionMessage.WRONG_LENGTH.message); + } } - private void lengthCheck() { - if (inputString.length() != BaseballGame.number) { - throw new IllegalArgumentException("정해진 개수의 숫자만 입력해주세요"); + private void characterCheck(String inputString) { + String pattern = makeRegularExpression(); + for (int i = 0; i < Rule.number; i++) { + if (!Pattern.matches(pattern, inputString)) { + throw new IllegalArgumentException(ExceptionMessage.WRONG_CHARACTER.message); + } } } - private void wrongInputCheck() { + private String makeRegularExpression() { + return "^[" + Rule.start + "-" + Rule.end +"]*$"; + } + + private void duplicationCheck(String inputString) { Set set = new HashSet<>(); - String pattern = "^[" + BaseballGame.start + "-" + BaseballGame.end +"]*$"; - for (int i = 0; i < BaseballGame.number; i++) { - if (!Pattern.matches(pattern, inputString)) { - throw new IllegalArgumentException("정해진 범위 안의 숫자만 입력해주세요"); - } + for (int i = 0; i < inputString.length(); i++) { set.add(inputString.charAt(i) - '0'); } - if (set.size() != BaseballGame.number) { - throw new IllegalArgumentException(); + if (set.size() != inputString.length()) { + throw new IllegalArgumentException(ExceptionMessage.DUPLICATION.message); } } + + } From 29a08d9ca8a3c5634de78778f9fd83349bd8c736 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:19:58 +0900 Subject: [PATCH 22/26] refactor(Random): BaseballGame.~~ -> Rule.~~ --- src/main/java/baseball/Random.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/Random.java b/src/main/java/baseball/Random.java index 21abb1a71..7d0a347f2 100644 --- a/src/main/java/baseball/Random.java +++ b/src/main/java/baseball/Random.java @@ -11,8 +11,8 @@ public class Random { public ArrayList makeRandomNumbers() { Set numberSet = new HashSet<>(); ArrayList randomNumbers = new ArrayList<>(); - while (numberSet.size() < BaseballGame.number) { - int randomNumber = Randoms.pickNumberInRange(BaseballGame.start, BaseballGame.end); + while (numberSet.size() < Rule.number) { + int randomNumber = Randoms.pickNumberInRange(Rule.start, Rule.end); if (numberSet.contains(randomNumber)) { continue; } From 0b9de01fee72a497e7d8ffd60e553a7d41aa7665 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 15:21:05 +0900 Subject: [PATCH 23/26] refactor(BaseballGame): seperate methods, use enum and make some change in flow --- src/main/java/baseball/BaseballGame.java | 99 +++++++++++++----------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index 3f6701637..ac2cd948a 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -5,19 +5,27 @@ import camp.nextstep.edu.missionutils.Console; public class BaseballGame { - static int start = 1; - static int end = 9; - static int number = 3; - int strike = 0; - int ball = 0; + private int strike; + private int ball; + private String result; - ArrayList randomNumbers = new ArrayList<>(); - ArrayList inputNumbers = new ArrayList<>(); + private ArrayList randomNumbers; + private ArrayList inputNumbers; + + BaseballGame() { + randomNumbers = new ArrayList<>(); + inputNumbers = new ArrayList<>(); + } public void start() { getRandomNumbers(); - playGame(); + do { + getInputNumbers(); + checkStrikeAndBall(); + getResult(); + printResult(); + } while (!isSuccess()); restartOrExit(); } @@ -28,42 +36,24 @@ private void getRandomNumbers() { private void getInputNumbers() { inputNumbers.clear(); - System.out.println("숫자를 입력해주세요 :"); + System.out.print("숫자를 입력해주세요 : "); String inputString = Console.readLine(); - Validation validation = new Validation(inputString); - validation.handleException(); - for (int i = 0; i < number; i++) { + Validation validation = new Validation(); + validation.validateInput(inputString); + for (int i = 0; i < Rule.number; i++) { inputNumbers.add(inputString.charAt(i) - '0'); } } - private void playGame() { - while (true) { - getInputNumbers(); - checkStrikeAndBall(); - getResult(); - if (isSuccess()) { - break; - } - } - } - - private void restartOrExit() { - String input = Console.readLine(); - if (input.equals(Constant.RESTART.value)) { - start(); - } - } - private void checkStrikeAndBall() { strike = 0; ball = 0; - for (int i = 0; i < number; i++) { + for (int i = 0; i 0) { + result += ball + "볼 "; + } + if (strike > 0) { + result += strike + "스트라이크"; + } + return result; + } + + private void printResult() { + System.out.println(result); + } + + private void printWhenSuccess() { + System.out.println(Rule.number + "개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + } + private boolean isSuccess() { - if (strike == number) { - System.out.println(number + "개의 숫자를 모두 맞히셨습니다! 게임 종료"); - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + if (strike == Rule.number) { + printWhenSuccess(); return true; } return false; } - private void getResult() { - if (strike == 0 && ball == 0) { - System.out.println("낫싱"); - } - if (ball > 0) { - System.out.print(ball + "볼 "); - if (strike == 0) { - System.out.println(); - } - } - if (strike > 0) { - System.out.println(strike + "스트라이크"); + private void restartOrExit() { + String input = Console.readLine(); + if (!input.equals(Constant.RESTART.value)) { + return; } + start(); } } \ No newline at end of file From 554f4dc534e22a6060bde432e41c428252d3c7d1 Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 16:23:46 +0900 Subject: [PATCH 24/26] refactor: delete space --- src/main/java/baseball/Constant.java | 2 +- src/main/java/baseball/ExceptionMessage.java | 2 +- src/main/java/baseball/GameMessage.java | 3 +-- src/main/java/baseball/Random.java | 2 +- src/main/java/baseball/Validation.java | 3 +-- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/Constant.java b/src/main/java/baseball/Constant.java index ed934c290..75535c9f9 100644 --- a/src/main/java/baseball/Constant.java +++ b/src/main/java/baseball/Constant.java @@ -9,4 +9,4 @@ public enum Constant { Constant(String value) { this.value = value; } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/ExceptionMessage.java b/src/main/java/baseball/ExceptionMessage.java index c21a66516..e59903cdd 100644 --- a/src/main/java/baseball/ExceptionMessage.java +++ b/src/main/java/baseball/ExceptionMessage.java @@ -10,4 +10,4 @@ public enum ExceptionMessage { ExceptionMessage(String message) { this.message = message; } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/GameMessage.java b/src/main/java/baseball/GameMessage.java index 644fb714c..68d097552 100644 --- a/src/main/java/baseball/GameMessage.java +++ b/src/main/java/baseball/GameMessage.java @@ -8,10 +8,9 @@ public enum GameMessage { STRIKE("스트라이크"), NOTTING("낫싱"); - public String message; GameMessage(String message) { this.message = message; } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/Random.java b/src/main/java/baseball/Random.java index 7d0a347f2..58c3e8d3b 100644 --- a/src/main/java/baseball/Random.java +++ b/src/main/java/baseball/Random.java @@ -21,4 +21,4 @@ public ArrayList makeRandomNumbers() { } return randomNumbers; } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/Validation.java b/src/main/java/baseball/Validation.java index 147201d2d..3f3d23756 100644 --- a/src/main/java/baseball/Validation.java +++ b/src/main/java/baseball/Validation.java @@ -41,5 +41,4 @@ private void duplicationCheck(String inputString) { } } - -} +} \ No newline at end of file From 637425832b51c17274f6da9f157e53df2846456e Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Fri, 30 Jun 2023 21:01:38 +0900 Subject: [PATCH 25/26] refactor: make print using enum --- src/main/java/baseball/BaseballGame.java | 23 ++++++++++++++--------- src/main/java/baseball/GameMessage.java | 6 +++--- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index ac2cd948a..d4e7be0a6 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -4,6 +4,8 @@ import camp.nextstep.edu.missionutils.Console; +import static baseball.GameMessage.*; + public class BaseballGame { private int strike; @@ -36,7 +38,7 @@ private void getRandomNumbers() { private void getInputNumbers() { inputNumbers.clear(); - System.out.print("숫자를 입력해주세요 : "); + System.out.print(ENTER_NUMBERS.message); String inputString = Console.readLine(); Validation validation = new Validation(); validation.validateInput(inputString); @@ -45,9 +47,13 @@ private void getInputNumbers() { } } - private void checkStrikeAndBall() { + private void initializeScore() { strike = 0; ball = 0; + } + + private void checkStrikeAndBall() { + initializeScore(); for (int i = 0; i 0) { - result += ball + "볼 "; + result += ball + BALL.message; } if (strike > 0) { - result += strike + "스트라이크"; + result += strike + STRIKE.message; } - return result; } private void printResult() { @@ -80,8 +85,8 @@ private void printResult() { } private void printWhenSuccess() { - System.out.println(Rule.number + "개의 숫자를 모두 맞히셨습니다! 게임 종료"); - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + System.out.println(Rule.number + SUCCESS.message); + System.out.println(ASK_RETRY.message); } private boolean isSuccess() { diff --git a/src/main/java/baseball/GameMessage.java b/src/main/java/baseball/GameMessage.java index 68d097552..798d7f338 100644 --- a/src/main/java/baseball/GameMessage.java +++ b/src/main/java/baseball/GameMessage.java @@ -1,10 +1,10 @@ package baseball; public enum GameMessage { - ENTER_NUMBERS_MESSAGE("숫자를 입력해주세요 : "), - SUCCESS_MESSAGE("개의 숫자를 모두 맞히셨습니다! 게임 종료"), + ENTER_NUMBERS("숫자를 입력해주세요 : "), + SUCCESS("개의 숫자를 모두 맞히셨습니다! 게임 종료"), ASK_RETRY("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"), - BALL("볼"), + BALL("볼 "), STRIKE("스트라이크"), NOTTING("낫싱"); From 75726f024643bb8b23c9b90d0b43be7b69b08eff Mon Sep 17 00:00:00 2001 From: HyeongSeok Date: Sun, 2 Jul 2023 17:35:57 +0900 Subject: [PATCH 26/26] refactor: edit final variable naming --- src/main/java/baseball/BaseballGame.java | 10 +++++----- src/main/java/baseball/Rule.java | 6 +++--- src/main/java/baseball/Validation.java | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/baseball/BaseballGame.java b/src/main/java/baseball/BaseballGame.java index d4e7be0a6..208514373 100644 --- a/src/main/java/baseball/BaseballGame.java +++ b/src/main/java/baseball/BaseballGame.java @@ -42,7 +42,7 @@ private void getInputNumbers() { String inputString = Console.readLine(); Validation validation = new Validation(); validation.validateInput(inputString); - for (int i = 0; i < Rule.number; i++) { + for (int i = 0; i < Rule.NUMBER; i++) { inputNumbers.add(inputString.charAt(i) - '0'); } } @@ -54,12 +54,12 @@ private void initializeScore() { private void checkStrikeAndBall() { initializeScore(); - for (int i = 0; i