HighJava
08_숫자야구
친절한 새미콜론
2020. 9. 17. 11:17
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번째 만에 맞췄군요.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | package kr.or.ddit.basic; import java.util.HashSet; import java.util.Iterator; 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(); } } | cs |