From c506f84aaa3b0ea5eff14ade87c1141abf475d91 Mon Sep 17 00:00:00 2001 From: V4N1LLA Date: Tue, 6 Aug 2024 15:21:00 +0900 Subject: [PATCH 1/3] first update --- src/main/java/baseball/Application.java | 86 ++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..33dcc5f249 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스트라이크")) { + gameWon = true; + } + } + } + + private static List generateComputerNumbers() { + List computer = new ArrayList<>(); + while (computer.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(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; + } + return true; + } + + private static String compareNumbers(List computer, String userInput) { + int strike = 0; + int ball = 0; + + for (int i = 0; i < 3; i++) { + 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개의 숫자를 모두 맞히셨습니다! 게임 종료"; + + 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; + if (input.equals("2")) return false; + System.out.println("잘못된 입력입니다. 다시 입력해주세요."); + } } } From fb034affb362cb86cc37b3b55cbe12b27fc76cd0 Mon Sep 17 00:00:00 2001 From: V4N1LLA Date: Tue, 6 Aug 2024 15:31:57 +0900 Subject: [PATCH 2/3] second update --- src/main/java/baseball/Application.java | 78 ++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 33dcc5f249..577523d8b8 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -10,82 +10,82 @@ public class Application { public static void main(String[] args) { - System.out.println("숫자 야구 게임을 시작합니다."); - boolean play = true; + System.out.println("숫자 야구 게임을 시작합니다."); // 게임 시작 메시지 출력 + boolean play = true; // 게임 진행 여부를 확인하는 변수 while (play) { - playGame(); - play = isRestartGame(); + playGame(); // 게임 진행 + play = isRestartGame(); // 게임 재시작 여부 확인 } } private static void playGame() { - List computer = generateComputerNumbers(); - boolean gameWon = false; + List computer = generateComputerNumbers(); // 컴퓨터 숫자 생성 + boolean gameWon = false; // 게임 승리 여부 확인 변수 while (!gameWon) { - String userInput = getUserInput(); - String result = compareNumbers(computer, userInput); - System.out.println(result); - if (result.contains("3스트라이크")) { + 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<>(); + List computer = new ArrayList<>(); // 컴퓨터 숫자를 저장할 리스트 while (computer.size() < 3) { - int randomNumber = Randoms.pickNumberInRange(1, 9); - if (!computer.contains(randomNumber)) { - computer.add(randomNumber); + int randomNumber = Randoms.pickNumberInRange(1, 9); // 1에서 9 사이의 숫자 랜덤 선택 + if (!computer.contains(randomNumber)) { // 중복 숫자 방지 + computer.add(randomNumber); // 리스트에 숫자 추가 } } - return computer; + return computer; // 컴퓨터 숫자 리스트 반환 } private static String getUserInput() { - System.out.print("숫자를 입력해주세요: "); - String input = Console.readLine(); - if (!isValidInput(input)) { - throw new IllegalArgumentException("잘못된 입력입니다."); + System.out.print("숫자를 입력해주세요: "); // 사용자 입력 안내 메시지 출력 + String input = Console.readLine(); // 사용자 입력 받기 + if (!isValidInput(input)) { // 입력 검증 + throw new IllegalArgumentException("잘못된 입력입니다."); // 잘못된 입력 시 예외 발생 } - return input; + return input; // 검증된 입력 반환 } private static boolean isValidInput(String input) { - if (input.length() != 3) return false; - Set uniqueChars = new HashSet<>(); + 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; + if (!Character.isDigit(c) || c == '0' || !uniqueChars.add(c)) return false; // 숫자, 0 제외, 중복 문자 확인 } - return true; + return true; // 입력이 유효하면 true 반환 } private static String compareNumbers(List computer, String userInput) { - int strike = 0; - int ball = 0; + int strike = 0; // 스트라이크 개수 + int ball = 0; // 볼 개수 - for (int i = 0; i < 3; i++) { - int userDigit = Character.getNumericValue(userInput.charAt(i)); - if (computer.get(i) == userDigit) { + 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)) { + } else if (computer.contains(userDigit)) { // 다른 위치에 같은 숫자일 경우 ball++; } } - if (strike == 0 && ball == 0) return "낫싱"; - if (strike == 3) return "3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + if (strike == 0 && ball == 0) return "낫싱"; // 스트라이크와 볼이 모두 없는 경우 + if (strike == 3) return "3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"; // 3스트라이크일 경우 - return String.format("%d볼 %d스트라이크", ball, strike); + 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; - if (input.equals("2")) return false; - System.out.println("잘못된 입력입니다. 다시 입력해주세요."); + 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("잘못된 입력입니다. 다시 입력해주세요."); // 잘못된 입력 메시지 출력 } } } From c62739e45e069e2ba3525a30825c2f76fb2411c0 Mon Sep 17 00:00:00 2001 From: V4N1LLA Date: Wed, 7 Aug 2024 13:51:59 +0900 Subject: [PATCH 3/3] =?UTF-8?q?readme=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) 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를 입력하면 게임을 종료한다. + - 잘못된 입력 시 오류 메시지를 출력하고 다시 입력을 받는다.