## 과제 : 숫자 야구 게임
목표 : 숫자 야구 게임을 구현현해본다.
요구사항 : 다음 조건을 만족하는 숫자 야구 게임을 구현한다.
1. **난수 생성**: 프로그램은 1부터 9까지의 서로 다른 숫자 3개를 임의로 생성한다. 이 숫자들은 게임 동안 변경되지 않으며, 플레이어가 맞춰야 할 대상이다.
2. **사용자 입력**: 플레이어는 1부터 9까지의 서로 다른 숫자 3개를 입력한다.
3. **판정 로직**: 컴퓨터는 플레이어가 입력한 숫자들과 초기에 생성한 난수를 비교하여 결과를 판정한다. 이때, 다음과 같은 용어를 사용한다
- **스트라이크**: 플레이어가 선택한 숫자가 위치와 숫자 모두 맞을 경우.
- **볼**: 숫자는 맞지만 위치가 틀릴 경우.
- **아웃**: 맞는 숫자가 하나도 없을 경우.
4. **결과 표시**: 게임은 플레이어의 입력마다 스트라이크, 볼, 아웃의 개수를 표시한다. 예를 들어, "2스트라이크 1볼" 또는 "3아웃"과 같이 표시한다.
5. **게임 종료 조건**: 플레이어가 3스트라이크를 달성하면 게임은 종료된다. 게임이 종료되면, 플레이어에게 승리 메시지와 함께 몇 번의 시도 끝에 성공했는지 알려준다.
---
## 과제 : 숫자 야구 게임 모범 답안
```java
import java.util.*;
public class NumberBaseballGame {
public static void main(String[] args) {
// 난수 생성
int[] targetNumbers = generateRandomNumbers();
// 게임 루프
int attempts = 0;
while (true) {
// 사용자 입력 받기
System.out.println("남은 시도: " + (10 - attempts) + "번");
int[] userNumbers = getUserInput();
// 결과 체크
int strikes = countStrikes(targetNumbers, userNumbers);
int balls = countBalls(targetNumbers, userNumbers);
int outs = 3 - strikes - balls;
// 결과 표시
System.out.println(strikes + " 스트라이크, " + balls + " 볼, " + outs + " 아웃");
// 게임 종료 조건 검사
if (strikes == 3) {
System.out.println("축하합니다! " + attempts + "번의 시도 끝에 승리했습니다.");
break;
}
attempts++;
}
}
private static int[] generateRandomNumbers() {
int[] numbers = new int[3];
Random random = new Random();
for (int i = 0; i < 3; i++) {
while (true) {
int randomNumber = random.nextInt(9) + 1; // 1부터 9까지의 난수 생성
boolean isUnique = true;
for (int j = 0; j < i; j++) { // 중복 검사
if (numbers[j] == randomNumber) {
isUnique = false;
break;
}
}
if (isUnique) {
numbers[i] = randomNumber;
break;
}
}
}
return numbers;
}
private static int[] getUserInput() {
Scanner scanner = new Scanner(System.in);
int[] numbers = new int[3];
System.out.print("1부터 9까지의 서로 다른 숫자 3개를 입력하세요: ");
for (int i = 0; i < 3; i++) {
while (true) {
int number;
try {
number = scanner.nextInt();
} catch (Exception e) {
System.out.println("잘못된 입력입니다. 숫자를 다시 입력해 주세요.");
scanner.next(); // 잘못된 입력 스트림 비우기
continue; // 다시 입력 받음
}
// 유효하지 않은 입력 처리
if (number < 1 || number > 9) {
System.out.println("잘못된 숫자입니다. 1부터 9까지의 숫자를 입력해 주세요.");
continue; // 다시 입력 받음
}
// 중복 숫자 입력 처리
boolean isUnique = true;
for (int j = 0; j < i; j++) {
if (numbers[j] == number) {
System.out.println("중복된 숫자입니다. 다른 숫자를 입력해 주세요.");
isUnique = false;
break; // 중복 발견 시 다시 입력
}
}
if (isUnique) {
numbers[i] = number;
break; // 유효한 숫자면 반복 중단
}
}
}
return numbers;
}
private static int countStrikes(int[] targetNumbers, int[] userNumbers) {
int strikes = 0;
for (int i = 0; i < 3; i++) {
if (targetNumbers[i] == userNumbers[i]) {
strikes++;
}
}
return strikes;
}
private static int countBalls(int[] targetNumbers, int[] userNumbers) {
int balls = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i != j && targetNumbers[i] == userNumbers[j]) {
balls++;
}
}
}
return balls;
}
}
```