JAVA

자바로 숫자야구(Bulls and Cows)게임 만들기

bysnow 2021. 3. 17. 19:15
728x90
반응형
SMALL

문제 - 출처 코딩도장(codingdojang.com/scode/663?answer_mode=hide)

 

Bulls and Cows라는 간단한 게임을 프로그램으로 만들어보자.

<게임 규칙>

 

먼저 컴퓨터가 0부터 9까지의 숫자중 4개를 중복없이 배열한 문자열을 랜덤하게 생성한다.

플레이어는 생성된 문자열을 예상하여 1턴에 1번씩 입력할 수 있다. 컴퓨터는 플레이어가 입력한 문자열을 정답과 비교하여 값과 위치가 모두 맞는 숫자의 갯수를 'Bulls' 위치는 틀렸지만 값은 맞는 숫자의 갯수를 'Cows'로 카운트하여 매턴마다 사용자의 입력에 대해 Bulls와 Cows값을 알려준다. 플레이어는 10턴 안에 정답을 맞춰야한다.

 

<세부 사항>

판정의 출력형식은 (Bulls값)B(Cows값)C 로 한다.

ex) 답이 1234일때 0124를 입력하면 1B2C 를 출력 판정을 출력할때마다 사용자가 입력한 횟수N(=현재 턴수)을 함께 출력한다.

ex>판정: 1B2C, 입력한 횟수: 2 형식에 맞지 않는 잘못된 입력(ex>2211, a1bc, 209111 등)을 한 경우는 에러 메시지를 출력하고 N은 변하지 않는다. 단 이미 입력했던 값을 다시 입력하는것은 괜찮다. 플레이어가 정답을 맞추면, "정답입니다. 총 입력한 횟수: N"를 출력한다. 10턴이 지나도 정답을 맞추지 못하면 정답을 공개하고 Game Over 메시지를 출력한다. 플레이어가 정답을 맞추거나 Game Over가 되면, 다시 처음부터 게임을 시작할지 종료할지 물어본다. 이때 플레이어가 1을 입력하면 처음부터 게임을 다시 시작하고 0을 입력하면 게임을 종료한다(그 외의 입력에는 에러를 출력하고 다시 물어본다)

import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;

public class BullsAndCows {
	// 1. 랜덤으로 4개 숫자 중복없이 생성
	// 2. 10턴 안에 정답 맞추기
	// 3. Bulls => 값과 위치가 모두 맞다
	// 4. cows => 위치는 틀렸지만 값이 맞다.
	public static void main(String[] args) {
		game();

	}

	static void game() {
		Scanner sc = new Scanner(System.in);
		boolean option = true;
		while (option) {
			int[] answer = random();
			System.out.println(Arrays.toString(answer));
			String ans = Arrays.toString(answer);
			int length = answer.length;

			int[] input = new int[length];
			
			int cnt = 1;

			while (cnt <= 10) {
				int Bulls = 0;
				int Cows = 0;
				System.out.print("숫자를 입력하세요 : ");
				for (int i = 0; i < length; i++) {
					input[i] = sc.nextInt();
					for (int j = 0; j < i; j++) {
						if (input[j] == input[i]) {
							System.out.println("중복된 숫자를 입력하였습니다. 다시 입력하세요");
							i--;
						}
					}
				}

				if (Arrays.equals(answer, input)) {
					System.out.println("정답입니다. 총 입력한 횟수 : " + cnt);
					break;

				} else {
					for (int i = 0; i < length; i++) {
						int num = input[i];
						if (num == answer[i]) {
							Bulls++;
						} else if (IntStream.of(answer).anyMatch(x -> x == num)) {
							Cows++;
						}

					}
					System.out.println("입력한 숫자 : " + Arrays.toString(input) + " 판정 : " + Bulls + "B" + Cows + "C"
							+ " 입력한 횟수: " + cnt);
					cnt++;

				}
				

			}
			System.out.println("정답은 " +   ans + "Game Over");
			System.out.println("0. 게임 종료");
			System.out.println("1. 게임 다시 시작");

			System.out.print("선택하세요 >>");
			if(sc.nextInt() == 0) {
				option = false;
			}
			else option = true;
			
		}
		System.out.println("게임 종료");
		sc.close();
	}

	static int[] random() {
		int[] nums = new int[4];

		for (int i = 0; i < nums.length; i++) {
			nums[i] = (int) (Math.random() * 9 + 1);
			for (int j = 0; j < i; j++) {
				if (nums[i] == nums[j]) {
					i--;
				}
			}
		}

		return nums;
	}
}

1. 난수 생성하여 정답 만들기

우선 random() 메소드를 통해 4개의 숫자를 중복없이 무작위로 선정하여 정답으로 정해놓았다. 

중복 없이 난수를 생성하는 방법은 random() 메소드 내의 이중for문을 통해 알 수 있다. 우선 생성한 수를 nums 라는 정수형 배열에 삽입한 후, 다시 for 문을 돌며 만일 새로 생성된 난수가 이미 배열에 존재한다면 i를 하나 감소시켜 다시 뽑는 방법이다. 정답인 수들을 가지고 있는 배열의 이름을 answer로 정하였다.

 

2. 사용자로부터 값 입력받기

사용자가 입력한 값은 input이라는 정수형 배열에 저장하였다. 해당 배열의 크기는 answer의 크기와 같게 부여한다.

Arrays.toString 함수를 통해 answer를 문자열로 바꿔준 이유는 한 게임이 종료되었을때 정답을 출력해주기 위해서다.

 

3. 게임 구현하기

사용자에게는 총 10번의 기회가 주어진다. 따라서 cnt 변수에 시도 횟수를 저장한다.  

사용자가 정답과 같은 자리에 같은 수를 입력하면 Bulls의 개수를 한 개씩 증가시킨다. 만일 정답에 포함된 수를 입력하였지만 그 자리가 다르다면 Cows의 개수를 한 개씩 증가시킨다. 사용자가 4개의 숫자를 모두 입력하면 cnt를 증가시킨다. 만일 사용자가 중복되는 숫자를 입력하면 '중복된 숫자를 입력하였습니다.' 라는 메시지를 출력한 후 해당 자리의 숫자를 다시 입력받는다.

 

4. 게임 종료

사용자가 정답을 맞추었는지 비교하기 위해 사용자가 입력한 수를 저장한 배열인 input과 정답 배열인 answer를 Arrays.equals() 메소드를 통해 비교한다. 만일 10번의 시도 내에 정답을 맞추었다면 정답을 맞추었다는 알림 메시지와 함께 게임을 다시 실행할지 아니면 종료할지를 물어본다. 10번의 시도동안 답을 맞추지 못하였다면 정답을 출력한 후 게임을 다시 실행할지 여부를 묻는다. 만일 사용자가 다시 게임을 실행하는 것을 선택하면 게임은 다시 시작된다. 그렇지 않다면 프로그램이 종료된다.

 

아쉬운점

- 사용자가 숫자를 하나 입력할 때마다 엔터를 쳐야 한다. 정수형 배열로 선언하였기 때문이다. 1234 처럼 공백과 엔터 없이 입력을 받아 비교하는 프로그램을 구현하는 것은 실패했다. 

 

 

 

728x90
반응형
LIST

'JAVA' 카테고리의 다른 글

Java - If 문의 사용  (0) 2021.03.29
클래스와 메소드 예제 1  (0) 2021.03.18
DTO, Static, Singleton 그리고 접근 제한자  (0) 2021.03.17
자바- 조건문과 반복문  (0) 2021.03.13
자바의 기초  (1) 2021.03.13