Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[숫자 야구 게임] 이종원 미션 제출합니다 #2813

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 숫자 야구 게임

## 개요
숫자 야구 게임은 사용자가 컴퓨터가 생성한 3자리 숫자를 맞추는 게임이다. 각 자리 숫자는 1부터 9까지의 서로 다른 숫자로 이루어져 있다. 사용자가 입력한 숫자와 위치가 모두 맞으면 스트라이크, 숫자만 맞고 위치가 틀리면 볼로 판정된다. 모든 숫자와 위치를 맞추면 게임이 종료된다.

## 기능 구현

### 1. 게임 시작
- **메시지 출력**: "숫자 야구 게임을 시작합니다."를 출력한다.
- **게임 루프**: 게임이 종료되기 전까지 반복한다.

### 2. 컴퓨터 숫자 생성
- **숫자 범위**: 1부터 9까지의 숫자 중 랜덤하게 3개의 숫자를 선택한다.
- **중복 방지**: 중복되지 않는 서로 다른 숫자를 선택한다.

### 3. 사용자 입력
- **입력 메시지**: "숫자를 입력해주세요: "를 출력하여 사용자로부터 입력을 받는다.
- **입력 검증**:
- 3자리 숫자인지 확인한다.
- 0이 포함되지 않았는지 확인한다.
- 중복된 숫자가 없는지 확인한다.
- 검증 실패 시 예외를 발생시키고, 적절한 오류 메시지를 출력한다.

### 4. 숫자 비교
- **스트라이크 판정**: 사용자가 입력한 숫자와 위치가 모두 맞으면 스트라이크로 판정한다.
- **볼 판정**: 사용자가 입력한 숫자가 위치는 틀리지만 포함되어 있으면 볼로 판정한다.
- **낫싱 판정**: 스트라이크와 볼이 모두 없으면 "낫싱"을 출력한다.
- **게임 종료 판정**: 3스트라이크 시 게임 종료 메시지를 출력하고 게임을 종료한다.

### 5. 게임 재시작 여부 확인
- **재시작 메시지 출력**: "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."를 출력한다.
- **재시작 입력 검증**:
- 1을 입력하면 게임을 재시작한다.
- 2를 입력하면 게임을 종료한다.
- 잘못된 입력 시 오류 메시지를 출력하고 다시 입력을 받는다.
86 changes: 85 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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<Integer> generateComputerNumbers() {
List<Integer> 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<Character> 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<Integer> 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("잘못된 입력입니다. 다시 입력해주세요."); // 잘못된 입력 메시지 출력
}
}
}