From 32b132228ef6bc29774c03eae21635479e80117d Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 16:23:44 +0900 Subject: [PATCH 1/6] docs: Edit `README.md` --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index fcf3f057..0d105925 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,17 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 기능 구현 list +* [ ] 랜덤 숫자 생성 +* [ ] 숫자 입력받기 +* [ ] 스트라이크, 볼 등 결과 계산 후 출력 +* [ ] 숫자를 맞췄을 경우 종료 또는 재시작 +* [ ] 기능 테스트 + +## 기타 요구사항 +* indent depth가 2를 넘기지 않기 +* stream api를 사용하지 않기 +* `else` 예약어 사용하지 않기 +* 함수(또는 메소드)가 10라인을 넘기지 않기 + From 55ec088c523a181fdcc6f0d544f7846efc479620 Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 16:38:15 +0900 Subject: [PATCH 2/6] feat: Add main, game class --- src/main/java/Application.java | 6 ++++++ src/main/java/BaseballGame.java | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/BaseballGame.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..01b7b5bb --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,6 @@ +public class Application { + public static void main(String[] args) { + BaseballGame game = new BaseballGame(); + game.start(); + } +} diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java new file mode 100644 index 00000000..a005aab5 --- /dev/null +++ b/src/main/java/BaseballGame.java @@ -0,0 +1,34 @@ +import java.util.Random; +import java.util.Scanner; + + +class BaseballGame { + private String answerNumber; + private final int numberLength; + private final Scanner sc; + private final Random random; + private GameStatus gameStatus; + + BaseballGame() { + numberLength = 3; + sc = new Scanner(System.in); + random = new Random(); + gameStatus = GameStatus.IN_GAME; + } + + void start() { + } +} + + +enum GameStatus { + IN_GAME, + TERMINATED, +} + + +enum MenuItem { + START, + EXIT, + WRONG_INPUT, +} From 522fdc94d5cb35b2e01fc1ebfad8e27c303f04eb Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 16:51:40 +0900 Subject: [PATCH 3/6] feat: Add random number generator --- README.md | 2 +- src/main/java/BaseballGame.java | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d105925..e66daf28 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) ## 기능 구현 list -* [ ] 랜덤 숫자 생성 +* [x] 랜덤 숫자 생성 * [ ] 숫자 입력받기 * [ ] 스트라이크, 볼 등 결과 계산 후 출력 * [ ] 숫자를 맞췄을 경우 종료 또는 재시작 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index a005aab5..2afb882e 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -17,6 +17,26 @@ class BaseballGame { } void start() { + while (gameStatus == GameStatus.IN_GAME) { + setRandomNumber(); + } + } + + void setRandomNumber() { + char[] numbers = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; + char[] results = new char[numberLength]; + for (int i = 0; i < numberLength; i++) { + int j = random.nextInt(9 - i); + results[i] = numbers[j]; + swap(numbers, j, 8 - i); + } + answerNumber = new String(results); + } + + private void swap(char[] arr, int i, int j) { + char temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; } } From e1468413a5f5ef43f8c73fe50eaf2e7ad66fe451 Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 20:14:01 +0900 Subject: [PATCH 4/6] feat: Add number input, judgement --- README.md | 4 +-- src/main/java/BaseballGame.java | 16 +++++++++ src/main/java/Result.java | 58 +++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/main/java/Result.java diff --git a/README.md b/README.md index e66daf28..26493267 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ ## 기능 구현 list * [x] 랜덤 숫자 생성 -* [ ] 숫자 입력받기 -* [ ] 스트라이크, 볼 등 결과 계산 후 출력 +* [x] 숫자 입력받기 +* [x] 스트라이크, 볼 등 결과 계산 후 출력 * [ ] 숫자를 맞췄을 경우 종료 또는 재시작 * [ ] 기능 테스트 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 2afb882e..3cfcaf3c 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -19,6 +19,8 @@ class BaseballGame { void start() { while (gameStatus == GameStatus.IN_GAME) { setRandomNumber(); + guessNumber(); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); } } @@ -33,6 +35,20 @@ void setRandomNumber() { answerNumber = new String(results); } + private void guessNumber() { + Result result; + do { + System.out.print("숫자를 입력해주세요 : "); + String submitNumber = sc.next(); + result = getResult(submitNumber); + System.out.println(result.resultString()); + } while (!result.isCorrect()); + } + + Result getResult(String submitNumber) { + return new Result(answerNumber, submitNumber); + } + private void swap(char[] arr, int i, int j) { char temp = arr[i]; arr[i] = arr[j]; diff --git a/src/main/java/Result.java b/src/main/java/Result.java new file mode 100644 index 00000000..7e0f5800 --- /dev/null +++ b/src/main/java/Result.java @@ -0,0 +1,58 @@ +class Result { + int strike; + int ball; + int numberLength; + + Result(String answerNumber, String submitNumber) { + numberLength = answerNumber.length(); + for (int i = 0; i < numberLength; i++) { + checkIndex(answerNumber, submitNumber.charAt(i), i); + } + } + + private void checkIndex(String answerNumber, char n, int idx) { + if (answerNumber.charAt(idx) == n) { + addStrike(); + } + else if (answerNumber.indexOf(n) != -1) { + addBall(); + } + } + + void addStrike() { + strike += 1; + } + + void addBall() { + ball += 1; + } + + boolean isNothing() { + return strike == 0 && ball == 0; + } + + boolean isCorrect() { + return strike == numberLength; + } + + String strikeString() { + if (strike == 0) { + return ""; + } + return String.format("%d 스트라이크 ", strike); + } + + String ballString() { + if (ball == 0) { + return ""; + } + return String.format("%d볼", ball); + } + + String resultString() { + if (isNothing()) { + return "낫싱"; + } + return strikeString() + ballString(); + } +} From f079e5fb81dbec9252b6f96c1b57f077fc048cb8 Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 20:40:38 +0900 Subject: [PATCH 5/6] feat: Add menu select --- README.md | 2 +- src/main/java/BaseballGame.java | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 26493267..56351365 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ * [x] 랜덤 숫자 생성 * [x] 숫자 입력받기 * [x] 스트라이크, 볼 등 결과 계산 후 출력 -* [ ] 숫자를 맞췄을 경우 종료 또는 재시작 +* [x] 숫자를 맞췄을 경우 종료 또는 재시작 * [ ] 기능 테스트 ## 기타 요구사항 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 3cfcaf3c..34a316c9 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -21,6 +21,8 @@ void start() { setRandomNumber(); guessNumber(); System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + handleMenuSelect(); } } @@ -49,6 +51,26 @@ Result getResult(String submitNumber) { return new Result(answerNumber, submitNumber); } + private void handleMenuSelect() { + MenuItem menu; + do { + menu = getMenuItem(); + } while (menu == MenuItem.WRONG_INPUT); + if (menu == MenuItem.EXIT) { + gameStatus = GameStatus.TERMINATED; + } + } + + private MenuItem getMenuItem() { + String menuNumber = sc.next(); + if (menuNumber.equals("1")) { + return MenuItem.START; + } else if (menuNumber.equals("2")) { + return MenuItem.EXIT; + } + return MenuItem.WRONG_INPUT; + } + private void swap(char[] arr, int i, int j) { char temp = arr[i]; arr[i] = arr[j]; From 3544cdfde9c0bdebea283bd96e9b1ea3f1250438 Mon Sep 17 00:00:00 2001 From: abcworld123 Date: Wed, 21 Dec 2022 21:03:25 +0900 Subject: [PATCH 6/6] test: Add judge test --- README.md | 2 +- src/main/java/BaseballGame.java | 5 +++ src/test/java/JudgeTest.java | 54 +++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/test/java/JudgeTest.java diff --git a/README.md b/README.md index 56351365..3a98b2be 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ * [x] 숫자 입력받기 * [x] 스트라이크, 볼 등 결과 계산 후 출력 * [x] 숫자를 맞췄을 경우 종료 또는 재시작 -* [ ] 기능 테스트 +* [x] 기능 테스트 ## 기타 요구사항 * indent depth가 2를 넘기지 않기 diff --git a/src/main/java/BaseballGame.java b/src/main/java/BaseballGame.java index 34a316c9..defb47fb 100644 --- a/src/main/java/BaseballGame.java +++ b/src/main/java/BaseballGame.java @@ -37,6 +37,11 @@ void setRandomNumber() { answerNumber = new String(results); } + // for test + void setSpecificNumber(String number) { + answerNumber = number; + } + private void guessNumber() { Result result; do { diff --git a/src/test/java/JudgeTest.java b/src/test/java/JudgeTest.java new file mode 100644 index 00000000..8f3c8309 --- /dev/null +++ b/src/test/java/JudgeTest.java @@ -0,0 +1,54 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class JudgeTest { + BaseballGame game; + + JudgeTest() { + game = new BaseballGame(); + game.setSpecificNumber("836"); + } + + @Test + @DisplayName("Test: 1 Strike") + void oneStrikeTest() { + Result result = game.getResult("132"); + assertThat(result.strike == 1 && result.ball == 0) + .isTrue(); + } + + @Test + @DisplayName("Test: 1 Ball") + void oneBallTest() { + Result result = game.getResult("123"); + assertThat(result.strike == 0 && result.ball == 1) + .isTrue(); + } + + @Test + @DisplayName("Test: 1 Strike 1 Ball") + void oneStrikeOneBallTest() { + Result result = game.getResult("823"); + assertThat(result.strike == 1 && result.ball == 1) + .isTrue(); + } + + @Test + @DisplayName("Test: Nothing") + void nothingTest() { + Result result = game.getResult("124"); + assertThat(result.isNothing()) + .isTrue(); + } + + @Test + @DisplayName("Test: Correct answer") + void correctTest() { + Result result = game.getResult("836"); + assertThat(result.isCorrect()) + .isTrue(); + } +}