View

JAVA : 숫자 야구 게임 만들기

curioser 2020. 1. 1. 14:50

숫자 야구 게임 프로그램이란?

1. 프로그램 내에서 숫자 세개를 랜덤으로 정해둔다

2. 다음에 숫자 세개를 입력받는다

3. 입력받은 숫자가 순서와 상관없이 존재한다면 ball,

만약 입력받은 숫자가 순서까지 일치한다면 strike로 출력된다

<풀이>

1. 프로그램 내에서 숫자 세개를 랜덤으로 정해두기 위해 java.lang.Math 클래스의 random()를 이용하여 저장

2. 숫자 세개가 중복되는 값이 없고, 정렬되지 않고 입력값을 받기 위해서 LinkedSet을 써서 객체를 생성하기로 했다

3. HashSet출력을 위해 iteraor를 통해 객체를 생성하고, 생성한 객체를 배열(ballList)에 넣어주었다

4. 스캐너를 써서 받은 값을 배열에 저장(putList)

5. 만약 ballList와 putList의 인덱스값과 저장값이 같다면 스트라이크,

숫자 세개가 랜덤으로 저장된 Set에서 contains()메서드를 써서 putList에 같은 값이 존재한다면 볼을 주기로 했다


public class BaseballTest {
	static Scanner scan = new Scanner(System.in);
	
	public static void main(String[] args) {		
		BaseballTest bt = new BaseballTest();
		
		while(true) {
			System.out.println("*********************************************");
			System.out.println("\t\t숫자 야구 게임 ");
			bt.gameMain();
			int select = scan.nextInt();
			switch (select) {
			case 1: //게임시작 메서드
				bt.gameStart();
				continue;
			case 2: //게임종료 메서드
				System.out.println("*********************************************");
				System.out.println("게임을 종료합니다.");
				System.out.println("*********************************************");
				System.exit(0);
			default:
				System.out.println("숫자를 잘 못 입력했습니다.");
				continue;
			}
		}
	}
	//게임시작 메인 메서드
	void gameMain(){
		System.out.println("*********************************************");
		System.out.println("1. 게임시작\n2. 게임종료");
		System.out.println("*********************************************");
		System.out.print("선택 >> ");
	}
	//랜덤으로 야구볼 값 저장할 메서드
	Set randBall(){
		Set ball = new LinkedHashSet<>();
		while(ball.size() < 3) {
			int num = (int)(Math.random()*9 +1);
			ball.add(num);
		}
		return ball;
	}
	//게임시작 메서드
	//S는 index, 값이 모두 같음, 
	//B는 값만 같음  -> contains()
	void gameStart() {
		Set ball = randBall();
		Iterator it = ball.iterator();
		int[] ballList = new int[3];
		
		for(int i =0; i<ballList.length; i++){
			ballList[i] = (int) it.next();
		}
		
		System.out.println("******************게임시작***********************");
		while(true) { 
			int gameNumber = 0; 
			//숫자입력해서 배열에 저장
			int num =0;
            Scanner in = new Scanner(System.in); 
			for(int i=0; i<3; i++) {
                Scanner in = new Scanner(System.in); 
				num++;
				System.out.print(num + "번째 숫자를 입력하세요 >> ");
				try {
					putList[i] = in.nextInt();
				} catch(InputMismatchException e) {
					System.out.println("제대로 입력하세요");
					in = new Scanner(System.in);
					break;
				}
				//숫자범위
				if(1 > putList[i] || putList[i] > 9) {
					System.out.println("1~9까지의 숫자를 입력하세요");
					break;
				}
			}
			//S맞추기
			int s = 0; //strike 개수 저장할 변수
			for(int i=0; i<3; i++) {
				if(ballList[i]==putList[i]) {
					s++;
				}
			}
			//B맞추기
			int b = 0; //ball개수 저장할 변수
			for(int i=0; i<3; i++) {
				if(ball.contains(putList[i])){
					b++;
				}
			}
			for(int i=0; i<putList.length; i++) {
				System.out.print(putList[i] + " ");
			}
			
			System.out.println(" => " + s + "S " + (b-s) + "B");

			gameNumber++;
			if(s == 3){
				System.out.println(gameNumber + "번째 만에맞췄습니다.");
				break;
			} 
		}
	}
}

주의할 점 :

Scanner를 for문 밖에 객체를 만들고 사용했을 때 , 값을 입력받았는데 숫자가 아닌 문자가 들어와서

InputMismatchException예외가 발생한 후 다시 반복문을 돌아야하는데 시스템이 멈추지않는 문제가 생겼다.

따라서 catch문 안에 in = new Scanner(System.in);를 써주어서 문제를 해결했다

 

Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31