본문 바로가기
프로젝트/kosta_project

[22.02.10] BaseBallGame

by 엑츄얼리 2022. 2. 10.

과제) BaseBallGame

내용: 임의의수 3자리의 숫자를 맞추는 게임
123
134
1S1B
-> 같은자리의 숫자 일치 => 스트라이크 S
-> 서로다른자리 숫자 일치 => 볼 B
게임의 종료 -> 3Strike

1. 중복되지 않는 1-9 난수 3개를 구한다. => 배열
2. 키보드로 부터 3개의 숫자를 입력 받는다. => 배열
3. 스트라이크, 볼의 갯수를 체크
4. 결과 출력
5. 8번째 성공

알고리즘 방식

 BaseBall 클래스 내부에 2개의 Method (1. 1~9로 이루어진 3자리 수의 난수를 생성하는 Method,

                                                   2. 3자리수를 입력받아 정답여부를 확인하는 Method) 를 생성한다.

 

 1. 1~9로 이루어진 3자리 수의 난수를 생성하는 Method (make_answer)

  - 난수 생성 함수( Math.random() )

   - static Method로 0이상 1미만의 무작위 값을 double로 리턴

   - min 이상 max 미만인 정수의 난수 출력 :

int make_num = (int) ((Math.random() * (max - min)) + min);
//0   <= Math.random()                     < 1
//0   <= Math.random() * (max - min)       < max-min
//min <= Math.random() * (max - min) + min < max

 - 변수 설명

  int[] arr = new int[10] : 숫자가 사용되었으면 해당 인덱스의 값을 1로 바꿈

  int[] answer = new int[3] : 정답 3자리수가 순서대로 저장

  int input = scan.nextInt() : 3자리 숫자를 입력받아 저장

 

 - num_cnt번째 숫자 생성 과정 ( num_cnt = 0~2)

  Math.random() 을 통해 1~9사이의 숫자를 1개 생성한 후 중복 여부를 arr[num_cnt]값을 통해 판단, 

  중복(arr[num_cnt] == 1)이라면 새로운 난수(make_num)를 생성하고,

  중복(arr[num_cnt] == 0)되지 않았다면, arr[num_cnt] = 1, answer[num_cnt] = make_num;

 

2. 3자리수를 입력받아 정답여부를 확인하는 Method (find_answer)

 - 변수 설명

  int cnt = 0 : 시도 횟수 카운트

  int S = 0, int B = 0; Strike와 Ball의 개수 카운트

 

 - input의 Strike와 Ball 개수 및 정답 여부 확인

  나머지 연산을 통해 1의 자리 수 부터 answer[2]와 비교 후 일치하면 S++;

                            answer[2]와 일치하지 않지만 arr[]을 통해 해당 숫자 사용 여부 확인, 사용되었다면, B++;

  위 과정을 100의 자리 수까지 반복 후, S == 3 이라면 시도 횟수 (cnt) 와 정답 출력

                                                   S != 3 이라면 Strike 개수 (S) 와 Ball 개수 (B) 출력 후, find_answer 반복

 

결과 화면

 

소스코드

package kosta.oop;

import java.util.Scanner;

public class BaseBallGame_Main {
    public static void main(String[] args){
        BaseBall baseBall = new BaseBall();

        while(true){
            baseBall.make_answer();
            baseBall.find_answer();
        }
    }
}

<BaseBallGame_Main.java>

 

package kosta.oop;

import java.util.Arrays;
import java.util.Scanner;

public class BaseBall {
    Scanner scan = new Scanner(System.in);
    int[] arr = new int[10];
    int[] answer = new int[3];

    public void make_answer() {
        Arrays.fill(arr, 0);
        int max = 10;
        int min = 1;
        int num_cnt = 0;

        System.out.println("3자리수 난수를 생성합니다.");

        while (num_cnt != 3) {
            int make_num = (int) ((Math.random() * (max - min)) + min);
            if (arr[make_num] == 0) {
                arr[make_num]++;
                answer[num_cnt] = make_num;
                num_cnt++;
            }
        }
        System.out.printf("(속닥속닥)정답 : %d%d%d\n", answer[0], answer[1], answer[2]);
        //String answer_str = Integer.toString(answer);
    }

    public void find_answer() {
        int cnt = 0;

        while (true) {
            int S = 0;
            int B = 0;
            System.out.println("중복되지 않는 3자리의 숫자를 입력해주세요.");
            int input = scan.nextInt();

            for (int i = 2; i >= 0; i--) {
                int buf = input % 10;
                input /= 10;

                if (buf == answer[i])
                    S++;

                else if (arr[buf] == 1)
                    B++;
            }

            cnt++;
            if (S == 3) {
                System.out.println(cnt + "번째만에 성공하였습니다.");
                System.out.println("-------------------------");
                return;

            } else
                System.out.println(S + "S" + B + "B");
        }
    }
}

<BaseBall.java>

'프로젝트 > kosta_project' 카테고리의 다른 글

[중간프로젝트]ERP - 마이페이지  (0) 2022.05.09
[HTML] 웹페이지 개선  (0) 2022.04.07
[Data Modeling] 중고장터  (0) 2022.03.18
[Data Modeling] Book Store  (0) 2022.03.16
[Mini_Project] 온라인 서점 구현하기  (0) 2022.03.03

댓글