[Java 15-4 BaseBallApp] 숫자야구게임

임승현·2022년 10월 19일

Java

목록 보기
69/126

◎숫자야구게임 : 정수난수(0~9)를 3개 제공받아 키보드로 입력하여 맞추는 게임
→ 난수와 키보드 입력값은 0~9 범위의 3개의 정수값으로 서로 다르며 0으로 시작 불가능
→ 키보드 입력값이 형식에 맞지 않은 경우 재입력되도록 작성
→ 난수와 입력값을 서로 비교하여 동일한 정수값이 존재할 경우 위치가 같으면 스트라이크 처리하고 다르면 볼로 처리하여 계산
→ 스트라이크가 3개라면 성공 메세지 출력 후 프로그램을 종료하고 아니라면 스트라이크와 볼의 갯수 출력
→ 키보드 입력 기회는 15번을 제공하며 15번 이내에 맞추지 못한 경우 정답(난수) 출력

package xyz.itwill.util;

import java.util.Random;
import java.util.Scanner;

public class BaseBallApp {
	public static void main(String[] args) {
		Random random=new Random();
		
		//0~9 범위의 정수값 3개를 저장하기 위한 배열 선언 - 난수값을 저장하기 위한 배열
		int[] dap=new int[3];
		
		//규칙에 맞는 난수값을 배열 요소에 저장하도록 처리하는 반복문
		while(true) {
			for(int i=0;i<dap.length;i++) {
				dap[i]=random.nextInt(10);//0~9 범위의 난수값을 배열 요소에 저장
			}
			
			//규칙에 맞는 난수값인 경우에만 반복문 종료
			if(dap[0]!=0 && dap[0]!=dap[1] && dap[1]!=dap[2] && dap[2]!=dap[0]) break;
		}
		
		Scanner scanner=new Scanner(System.in);
		
		//0~9 범위의 정수값 3개를 저장하기 위한 배열 선언 - 키보드 입력값을 저장하기 위한 배열
		int[] num= new int[3];
		
		//정답 관련 상태정보를 저장하기 위한 변수
		boolean result=false;
		
		//키보드로 정수값을 입력받기 위한 기회를 제공하는 반복문
		//→ 키보드 입력값을 난수값과 비교하여 결과 출력
		for(int cnt=1;cnt<=15;cnt++) {
			//스트라이크와 볼의 갯수를 저장하기 위한 변수 선언
			int strike=0, ball=0;
			
			//키보드 입력값에 대한 검증을 위한 반복문
			loop:
			while(true) {
				System.out.print(cnt+"번째 입력 >> ");
				String input=scanner.nextLine();
				
				if(input.length()!=3) {
					System.out.println("[에러]3자리의 숫자만 입력 가능합니다.");
					continue;
				}
				
				//입력된 문자열에서 문자를 추출하여 배열 요소에 저장
				//→ 문자열의 문자를 추출하여 정수값으로 변환하여 배열 요소에 저장
				for(int i=0;i<num.length;i++) {
					//문자코드(CharacterCode) - '0' : 48 ~ '9' : 57
					//ex) '4'-'0' = 52-48 = 4
					num[i]=input.charAt(i)-'0';
					
					if(num[i]<0 || num[i]>9) {
						System.out.println("[에러]숫자값만 입력 가능합니다.");
						continue loop;
					}
				}
				//규칙에 맞는 난수값인 경우에만 반복문 종료
				if(dap[0]!=0 && dap[0]!=dap[1] && dap[1]!=dap[2] && dap[2]!=dap[0]) break;
				System.out.println("[에러]0으로 시작되거나 중복된 숫자가 존재합니다.");
			}
			
			//난수값과 키보드 입력값을 비교하여 스트라이크와 볼을 구분하여 계산
			//→ 난수값과 키보드 입력값을 교차 비교하도록 중천된 for 구문 사용
			for(int i=0;i<dap.length;i++) {//난수값을 처리하기 위한 반복문
				for(int j=0;j<num.length;j++) {//키보드 입력값을 처리하기 위한 반복문
					if(dap[i]==num[j]) {//배열의 요소값이 같은경우
						if(i==j) {//배열 요소의 위치가 같은 경우
							strike++;
						} else {
							ball++;
						}
					}
				}
			}
			
			if(strike==3) {
				System.out.println("[메세지]축하합니다."+cnt+"번만에 맞췄습니다.");
				result=true;
				break;
			}
			System.out.println("[결과]"+strike+"스트라이크 "+ball+"볼");
		}
		
		
		if(!result) {//제공된 기회동안 정답을 맞추지 못한 경우
			System.out.print("[메세지]정답을 못 맞췄군요. 정답은 [");
			for(int su:dap) {
				System.out.print(su);
		}
		System.out.println("]입니다.");
		}
	}
}

0개의 댓글