본문 바로가기
비전공자코딩교실/JAVA

[비전공자코딩교실] 숫자 야구 게임 완성하기!

by 세 미 콜 론 2021. 6. 6.
728x90
반응형

지난 시간에 compare 메소드까지 만들었으니 오늘은 print 메소드와 실제 게임 진행 프로세스를 만들어볼 예정입니다. 우선 print 메소드를 만들어보도록 하겠습니다. 게임 진행 조건 중 10회가 관련된 것이 있으니 print에서는 현재 게임이 몇 회차인지 함께 출력할 예정입니다.

출력만 하면 끝인 메소드이기 때문에 기본형은 복잡하지 않습니다. 이제 받아온 result에 따른 게임 결과 출력을 진행하겠습니다.

매우 간단한 소스가 완성됐습니다. 하지만 처음 보는 함수가 있습니다. 바로 "SUCCESS".equals(result) 부분인데요. equals()는 문자열을 비교할 때 사용하고 있습니다. 기존에 == 로 비교한 것과 다른 이유는 String이 사실 주소를 담고 있는 자료형이기 때문이에요. 자세한 내용은 추후 다시 다루기로 하겠습니다. 지금은 문자열을 비교할 때는 equals를 사용한다는 것만 기억하면 될 것 같습니다.

이제 메인 메소드를 짜볼 예정입니다. 이 때는 처음에 작성했던 주석을 참고해서 로직을 짜면 됩니다.

자, 그런데 여기에서 다시 생각 해보아야 하는 것이 있습니다. 이 게임은 총 10번의 사용자 입력기회가 있다는 점입니다. 그렇기 때문에 사용자가 몇 회차 도전을 했는지 셀 수있는 변수를 선언하겠습니다. 

그럼 이제 로직을 짜볼까요? 우선 랜덤 숫자(문제)는 한 번만 만들면 되니 그냥 두도록 하겠습니다. 사용자에게 숫자를 입력받는 것은 도전 횟수에 따라 달라지게 됩니다. 따라서 반복을 하기 위해 반복문 while을 사용하겠습니다. while문은 조건이 참이라면 계속 반복을 하고 참이 아니라면 작동을 멈추는 습성을 가지고 있습니다. 강제로 벗어나게 하려면 break;를 입력하면 됩니다. while문을 만들어보겠습니다.

while문의 조건은 cnt < 11 , 현재 0이기 때문에 10일때까지 계속 동작하도록 만들었습니다. 이제 안에 사용자에게 숫자를 입력받는 부분과 결과 확인, 내용 출력에 대한 소스를 짜보도록 하겠습니다. 

어려운 부분이 없으니 천천히 보면 모두 이해가 되리라 생각합니다. 게임 실행결과는 아래와 같습니다.

도전 횟수 초과한 경우 종료
6회차에 성공한 모습

여기까지 숫자 야구 게임을 만들어보았습니다. 생각보다 어렵지 않은 숫자 야구 게임. 소스가 생각보다 길기 때문에 전체 소스는 아래 코드블럭에 적도록 하겠습니다. 해당 소스는 효율적인 면보다 다양한 함수를 사용하고 기능별로 분류하는 간단한 소스로 작성되었음을 미리 알려드립니다. 

package test.edu.semicolon;

import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		
		/*
		 * 게임 진행 프로세스
		 * 1. 랜덤 숫자(문제)만들기
		 * 2. 사용자에게 숫자를 입력 받음
		 * 3. 입력받은 숫자의 심판 결과 확인
		 * 4-1. 정답일 경우 정답이라는 문구 출력 후 게임 종료
		 * 4-2. 정답이 아닐 경우 심판 결과 출력 후 2번으로 돌아감
		 * 4-3. 정답이 아니지만  10회차 도전이었을 경우 실패 문구 출력 후 게임 종료
		 * 
		 * 메소드 List
		 * 1. 랜덤 숫자(문제) 만드는 기능 : makeNumber
		 * 2. 심판(숫자 맞는지 확인) : compare
		 * 3. 사용자에게 숫자만 입력받는 기능 : inputNumber
		 * 4. 사용자에게 결과 출력해주는 기능 : print
		 */
		
		//1. 랜덤 숫자(문제) 만들기
		int[] com = makeNumber();
		
		//도전 횟수를 세는 변수 
		int cnt = 0;
		String result = "";
		
		while (cnt < 11) {
			//도전 횟수 증가
			cnt++;
			System.out.println(cnt + "회차 도전!");
			
			//2. 사용자에게 숫자를 입력 받음
			int[] user = inputNumber();
			
			//3. 입력받은 숫자의 심판 결과 확인
			result = compare(com,user);
			
			print(cnt, result);
			
			if("SUCCESS".equals(result)) {
				break;
			}
			if(cnt == 10 && !"SUCCESS".equals(result)) {
				System.out.println("도전 횟수 초과로 패배하였습니다.");
				break;
			}
		}
		
		
		System.out.println("게임이 종료되었습니다. 감사합니다.");
	}


	public static int[] makeNumber() {

		int[] randomNumber = new int[3];
		
		for(int i = 0; i < randomNumber.length; i++){
			randomNumber[i] = (int)(Math.random() * 10);
			
			//중복 숫자 제거
			for(int j=0; j<i; j++){
				if(randomNumber[i] == randomNumber[j]){
					i--;
				}
			}
		}
		
		return randomNumber;
	}
	
	public static int[] inputNumber() {
		int[] inputNumber = new int[3];
		
		Scanner scan = new Scanner(System.in);
		
		for (int i = 0; i < inputNumber.length; i++) {
			int tmp;
			
			System.out.print(i+1 + "번 째 숫자를 입력해주세요 : ");
			
			while (!scan.hasNextInt()) {
				scan.next();
				System.out.println("숫자가 아닙니다. 다시 입력해주세요.");
			}
			
			tmp = scan.nextInt();
			
			if(tmp < 0 || tmp > 9) {
				System.out.println("0부터 9까지의 숫자만 입력할 수 있습니다.");
				i--;
			} else {
				inputNumber[i] = tmp;
				for (int j = 0; j < i; j++) {
					if(inputNumber[j] == inputNumber[i]) {
						System.out.println("중복된 숫자입니다.");
						i--;
					}
				}
			}
			
		}
		return inputNumber;
	}
	
	public static String compare(int[] com, int[] user) {
		String result = "";
		
		int strike = 0;
		int ball = 0;
		
		for (int i = 0; i < com.length; i++) {
			if(com[i] == user[i]) {
				strike++;
			} else {
				for (int j = 0; j < user.length; j++) {
					if(com[i] == user[j]) {
						ball++;
					}
				}
			}
		}
		
		if(strike == 3) {
			result = "SUCCESS";
		} else if(strike == 0 && ball == 0) {
			result = "OUT";
		} else {
			result = strike + "S " + ball + "B";
		}
		
		return result;
	}
	
	public static void print(int cnt, String result) {
		if("SUCCESS".equals(result)) {
			System.out.println(cnt +"회차 성공!! 축하드립니다.");
		} else {
			System.out.println("----------" +cnt + "회차 결과----------");
			System.out.println(result);
		}
	}
	
}

주석 포함 모두 150줄의 코드를 작성하였습니다. 이 정도면 이제 어느정도 자신감이 생기셨으리라 믿습니다. 이제 알고리즘 공부를 하면서 코딩에 대한 두려움을 없애는 것은 어떨까요?

728x90
반응형

댓글