diff --git a/README.md b/README.md index 1bee39036..fe018694e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,14 @@ # 미션 - 숫자 야구 게임 +## 구현할 기능 목록 + +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션을 종료시키기. +- 게임이 시작되면 컴퓨터가 임의의 3자리 서로 다른 수를 생성한다. +- 사용자가 3자리 숫자를 입력하면 입력 값의 유효성을 검사한다. +- 사용자가 입력한 숫자와 컴퓨터가 생성한 숫자를 비교하고 결과를 계산한다. +- 게임이 종료되면 사용자가 게임을 다시 시작하거나 완전히 종료할 수 있는 옵션을 제공한다. + + ## 🔍 진행방식 - 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다. diff --git a/build.gradle b/build.gradle index fae7297bd..f74c724a7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,11 @@ dependencies { implementation('com.github.woowacourse-projects:mission-utils:1.0.0') } +compileJava.options.encoding = 'UTF-8' +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + test { useJUnitPlatform() } diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 7f1901b8b..0503c0719 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,105 @@ package baseball; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + public class Application { + + public static void main(String[] args) { - //TODO: 숫자 야구 게임 구현 + while (true) { + try { + playGame(); + } catch (IllegalArgumentException e) { + System.out.println("잘못된 입력입니다. 애플리케이션을 종료합니다."); + break; + } + + System.out.print("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요: "); + String choice = Console.readLine(); + if ("2".equals(choice)) { + break; + } + } + } + + private static void playGame() { + int[] answer = generateRandomNumbers(); + System.out.println("숫자 야구 게임을 시작합니다!"); + + while (true) { + System.out.print("숫자를 입력해주세요: "); + String input = Console.readLine(); + if (!isValidInput(input)) { + throw new IllegalArgumentException("잘못된 입력입니다. 3자리 서로 다른 숫자를 입력해주세요."); + } + + int[] guess = parseInput(input); + String result = getResult(answer, guess); + System.out.println(result); + + if (result.equals("3스트라이크")) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + break; + } + } + } + + private static int[] generateRandomNumbers() { + int[] numbers = new int[3]; + for (int i = 0; i < 3; i++) { + numbers[i] = Randoms.pickNumberInRange(1, 9); + } + return numbers; + } + + private static boolean isValidInput(String input) { + if (input.length() != 3) { + throw new IllegalArgumentException("3자리 숫자가 아닙니다."); + } + for (char c : input.toCharArray()) { + if (!Character.isDigit(c) || input.chars().distinct().count() != 3) { + throw new IllegalArgumentException("서로 다른 3자리 숫자를 입력하세요."); + } + } + return true; + } + + private static int[] parseInput(String input) { + int[] numbers = new int[3]; + for (int i = 0; i < 3; i++) { + numbers[i] = Character.getNumericValue(input.charAt(i)); + } + return numbers; + } + + private static String getResult(int[] answer, int[] guess) { + int strike = 0; + int ball = 0; + for (int i = 0; i < 3; i++) { + if (answer[i] == guess[i]) { + strike++; + } else if (contains(answer, guess[i])) { + ball++; + } + } + if (strike > 0 && ball > 0) { + return strike + "스트라이크 " + ball + "볼"; + } else if (strike > 0) { + return strike + "스트라이크"; + } else if (ball > 0) { + return ball + "볼"; + } else { + return "낫싱"; + } + } + + private static boolean contains(int[] array, int num) { + for (int i : array) { + if (i == num) { + return true; + } + } + return false; } } diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 359aacfa4..dcf1b3912 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -29,6 +29,7 @@ class ApplicationTest extends NsTest { ); } + @Override public void runMain() { Application.main(new String[]{});