diff --git a/README.md b/README.md index fcf3f057..3a98b2be 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,17 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 기능 구현 list +* [x] 랜덤 숫자 생성 +* [x] 숫자 입력받기 +* [x] 스트라이크, 볼 등 결과 계산 후 출력 +* [x] 숫자를 맞췄을 경우 종료 또는 재시작 +* [x] 기능 테스트 + +## 기타 요구사항 +* indent depth가 2를 넘기지 않기 +* stream api를 사용하지 않기 +* `else` 예약어 사용하지 않기 +* 함수(또는 메소드)가 10라인을 넘기지 않기 + 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..defb47fb --- /dev/null +++ b/src/main/java/BaseballGame.java @@ -0,0 +1,97 @@ +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() { + while (gameStatus == GameStatus.IN_GAME) { + setRandomNumber(); + guessNumber(); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + handleMenuSelect(); + } + } + + 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); + } + + // for test + void setSpecificNumber(String number) { + answerNumber = number; + } + + 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 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]; + arr[j] = temp; + } +} + + +enum GameStatus { + IN_GAME, + TERMINATED, +} + + +enum MenuItem { + START, + EXIT, + WRONG_INPUT, +} 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(); + } +} 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(); + } +}