Jun's Blog

[Java] Set을 이용한 야구 게임 프로그램 본문

High Java/Collection FrameWork

[Java] Set을 이용한 야구 게임 프로그램

Fizzyelf 2020. 10. 8. 20:39

문제) Set을 이용하여 숫자 야구 게임 프로그램을 작성하시오.
       컴퓨터의 숫자는 난수를 이용하여 구한다.
       (스트라이크는 'S', 볼은 'B'로 출력한다.)
  
       컴퓨터의 난수가 9 5 7 일 때 실행 예시)
       숫자입력 => 3 5 6
          3 5 6 ==> 1S 0B
      숫자입력 => 7 8 9
         7 8 9 ==> 0S 2B
                  :

                  :
      숫자입력 => 9 5 7
         9 5 7 ==> 3S 0B

      5번째 만에 맞췄군요.


 

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class T08_BaseballTest {
	int[] num = new int[3]; // 난수가 저장되 배열
	int[] user;				// 사용자가 입력한 값을 저장할 배열
	
	int strike;	// 스트라이크 개수
	int ball;	// 볼 개수
	
	Scanner scan = new Scanner(System.in);
	
	/**
	 * 1 ~ 9 사이의 서로 다른 난수 3개를 만들어 배열에 저장하는 메서드 (Set이용)
	 */
	public void getRndNum(){
		
		Set<Integer> bbNumSet = new HashSet<Integer>();
		
		// Set을 이용한 3개의 난수 만들기
		while(bbNumSet.size()<3){
			bbNumSet.add( (int)(Math.random() * 9 + 1) );
		}
		
		//num = bbNumSet.stream().mapToInt(i->i).toArray();
		
		// Set의 자료를 배열에 저장하기
		Iterator<Integer> it = bbNumSet.iterator();
		
		int i = 0; // 배열의 첨자 역할
		while(it.hasNext()){
			num[i++] = it.next().intValue();
		}
		
		
		// 데이터 섞기 (0번째 자료와 난수번째 자료를 교환하는 방법으로 데이터를 섞는다.)
		for(int j=1; j<=100; j++){  // 작업 회수
			int rnd = (int)(Math.random() * num.length);  // 0 ~ 2 사이의 난수
			int temp = num[0];
			num[0] = num[rnd];
			num[rnd] = temp;
		}
		
		/* 
		// shuffle을 이용한 데이터 섞기
		List<Integer> bbNumList = new ArrayList<>(bbNumSet);
		Collections.shuffle(bbNumList); // 데이터 섞기
		int i = 0; // 배열의 첨자 역할
		for(int bbNum : bbNumList) {
			num[i++] = bbNum;
		}
		
		*/
	}

	/**
	 * 사용자로 부터 3개의 정수를 입력받아 배열에 저장하는 메서드
	 * (입력한 정수들을 서로 중복되지 않게 처리 한다.)
	 */
	public void inputNum(){
		int n1, n2, n3;  // 입력한 값을 저장할 변수
		
		do{
			System.out.print("중복되지 않는 정수 3개 입력 => ");
			n1 = scan.nextInt();
			n2 = scan.nextInt();
			n3 = scan.nextInt();
			if(n1==n2 || n1==n3 || n2==n3){
				System.out.println("중복되는 숫자는 입력할 수 없습니다. 다시입력하세요");
			}
		}while(n1==n2 || n1==n3 || n2==n3);
		
		user = new int[]{n1, n2, n3};  // 입력한 값들을 배열에 저장
	}
	
	// 스트라이크와 볼 판정 및 출력하는 메서드
	public void ballCount(){
		strike = 0;
		ball = 0;   // 스트라이크 개수와 볼 개수 초기화
		
		for(int i=0; i<num.length; i++){
			for(int j=0; j<user.length; j++){
				if(num[i] == user[j]){  // 값이 같은지 비교
					if(i==j){   // 값이 같고 첨자가 같으면 스트라이크
						strike++;
					}else{		// 값은 같은데 첨자가 다르면 볼
						ball++;
					}
				}
			}
		}
		
		System.out.println(user[0] + " " + user[1] + " " + user[2] + " ==> " + strike + "S " + ball + "B");
		
	}
	
	
	// 게임을 시작하는 메서드
	public void gameStart(){
		// 난수를 만드는 메서드 호출
		getRndNum();
		
		// 확인용
		System.out.println("난수값 => " + num[0] + " " + num[1] + " " + num[2]);
		
		int cnt = 0; // 몇번만에 맞췄는지를 저장하는 변수
		
		do{
			cnt++; 
			inputNum(); // 사용자 입력 메서드 호출
			ballCount();  // 볼카운트하는 메서드 호출
		}while(strike!=3);  // 3 스트라이크가 될 때까지 반복
		
		System.out.println(cnt + "번째만에 맞췄군요.");
	}
	
	public static void main(String[] args) {
		T08_BaseballTest baseBall = new T08_BaseballTest();
		baseBall.gameStart();
	}

}
Comments