diff --git a/docs/README.md b/docs/README.md index e69de29bb2..b51be65e23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,35 @@ +# 숫자 야구 게임 + +## 개요 +숫자 야구 게임은 사용자가 컴퓨터가 생성한 3자리 숫자를 맞추는 게임이다. 각 자리 숫자는 1부터 9까지의 서로 다른 숫자로 이루어져 있다. 사용자가 입력한 숫자와 위치가 모두 맞으면 스트라이크, 숫자만 맞고 위치가 틀리면 볼로 판정된다. 모든 숫자와 위치를 맞추면 게임이 종료된다. + +## 기능 구현 + +### 1. 게임 시작 +- **메시지 출력**: "숫자 야구 게임을 시작합니다."를 출력한다. +- **게임 루프**: 게임이 종료되기 전까지 반복한다. + +### 2. 컴퓨터 숫자 생성 +- **숫자 범위**: 1부터 9까지의 숫자 중 랜덤하게 3개의 숫자를 선택한다. +- **중복 방지**: 중복되지 않는 서로 다른 숫자를 선택한다. + +### 3. 사용자 입력 +- **입력 메시지**: "숫자를 입력해주세요: "를 출력하여 사용자로부터 입력을 받는다. +- **입력 검증**: + - 3자리 숫자인지 확인한다. + - 0이 포함되지 않았는지 확인한다. + - 중복된 숫자가 없는지 확인한다. + - 검증 실패 시 예외를 발생시키고, 적절한 오류 메시지를 출력한다. + +### 4. 숫자 비교 +- **스트라이크 판정**: 사용자가 입력한 숫자와 위치가 모두 맞으면 스트라이크로 판정한다. +- **볼 판정**: 사용자가 입력한 숫자가 위치는 틀리지만 포함되어 있으면 볼로 판정한다. +- **낫싱 판정**: 스트라이크와 볼이 모두 없으면 "낫싱"을 출력한다. +- **게임 종료 판정**: 3스트라이크 시 게임 종료 메시지를 출력하고 게임을 종료한다. + +### 5. 게임 재시작 여부 확인 +- **재시작 메시지 출력**: "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."를 출력한다. +- **재시작 입력 검증**: + - 1을 입력하면 게임을 재시작한다. + - 2를 입력하면 게임을 종료한다. + - 잘못된 입력 시 오류 메시지를 출력하고 다시 입력을 받는다. diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..577523d8b8 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,91 @@ package baseball; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + System.out.println("숫자 야구 게임을 시작합니다."); // 게임 시작 메시지 출력 + boolean play = true; // 게임 진행 여부를 확인하는 변수 + while (play) { + playGame(); // 게임 진행 + play = isRestartGame(); // 게임 재시작 여부 확인 + } + } + + private static void playGame() { + List computer = generateComputerNumbers(); // 컴퓨터 숫자 생성 + boolean gameWon = false; // 게임 승리 여부 확인 변수 + while (!gameWon) { + String userInput = getUserInput(); // 사용자 입력 받기 + String result = compareNumbers(computer, userInput); // 입력 숫자와 컴퓨터 숫자 비교 + System.out.println(result); // 결과 출력 + if (result.contains("3스트라이크")) { // 3스트라이크 시 게임 승리 + gameWon = true; + } + } + } + + private static List generateComputerNumbers() { + List computer = new ArrayList<>(); // 컴퓨터 숫자를 저장할 리스트 + while (computer.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); // 1에서 9 사이의 숫자 랜덤 선택 + if (!computer.contains(randomNumber)) { // 중복 숫자 방지 + computer.add(randomNumber); // 리스트에 숫자 추가 + } + } + return computer; // 컴퓨터 숫자 리스트 반환 + } + + private static String getUserInput() { + System.out.print("숫자를 입력해주세요: "); // 사용자 입력 안내 메시지 출력 + String input = Console.readLine(); // 사용자 입력 받기 + if (!isValidInput(input)) { // 입력 검증 + throw new IllegalArgumentException("잘못된 입력입니다."); // 잘못된 입력 시 예외 발생 + } + return input; // 검증된 입력 반환 + } + + private static boolean isValidInput(String input) { + if (input.length() != 3) return false; // 입력 길이 확인 + Set uniqueChars = new HashSet<>(); // 입력 문자의 중복을 확인할 집합 + for (char c : input.toCharArray()) { + if (!Character.isDigit(c) || c == '0' || !uniqueChars.add(c)) return false; // 숫자, 0 제외, 중복 문자 확인 + } + return true; // 입력이 유효하면 true 반환 + } + + private static String compareNumbers(List computer, String userInput) { + int strike = 0; // 스트라이크 개수 + int ball = 0; // 볼 개수 + + for (int i = 0; i < 3; i++) { // 3자리 숫자 비교 + int userDigit = Character.getNumericValue(userInput.charAt(i)); // 사용자 입력의 각 자리 숫자 추출 + if (computer.get(i) == userDigit) { // 같은 위치에 같은 숫자일 경우 + strike++; + } else if (computer.contains(userDigit)) { // 다른 위치에 같은 숫자일 경우 + ball++; + } + } + + if (strike == 0 && ball == 0) return "낫싱"; // 스트라이크와 볼이 모두 없는 경우 + if (strike == 3) return "3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"; // 3스트라이크일 경우 + + return String.format("%d볼 %d스트라이크", ball, strike); // 스트라이크와 볼 개수 반환 + } + + private static boolean isRestartGame() { + while (true) { // 유효한 입력을 받을 때까지 반복 + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); // 게임 재시작 안내 메시지 출력 + String input = Console.readLine(); // 사용자 입력 받기 + if (input.equals("1")) return true; // 1 입력 시 게임 재시작 + if (input.equals("2")) return false; // 2 입력 시 게임 종료 + System.out.println("잘못된 입력입니다. 다시 입력해주세요."); // 잘못된 입력 메시지 출력 + } } }