본문 바로가기

카테고리 없음

[항해99] 2주차 과제 : 야구게임 만들기

  • 과제 조건
◆ 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
◆ 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
◆ 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
◆ 숫자의 값과 위치가 모두 일치하면 S숫자의 값은 일치하지만 위치가 틀렸으면 B기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
◆ 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.

 

  • 완성 후 출력 예시
컴퓨터가 숫자를 생성하였습니다.
답을 맞춰보세요!
1번째 시도 : 134 0B0S
2번째 시도 : 238 1B1S
3번째 시도 : 820 2B1S
4번째 시도 : 028 3B
5번째 시도 : 280 3S
5번만에 맞히셨습니다.
게임을 종료합니다.

 

  • 완성한 코드
import java.lang.reflect.Array;
import java.util.*;

// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        // 1. 랜덤숫자 만들기
        Random random = new Random();
        Scanner sc = new Scanner(System.in);

		// 컴퓨터 답변 받을 3자리 배열 생성
        int[] ansAry = new int[3];
        int answer;

        // 랜덤 번호 생성 후 배열에 넣기
        // random.nextInt(9)가 0포함 9제외(0~8) 숫자를 생성하게 되므로 +1 해주기(1~9) 생성(수정)
        // 0~9까지 생성
        for (int i = 0; i < 3; i++) {
            ansAry[i] = random.nextInt(10);
        }

        // 세 자리 숫자가 서로 다른지 확인
        do {
            // 세 자리 숫자가 다 다를 때까지 생성
            ansAry[0] = random.nextInt(9) + 1;
            ansAry[1] = random.nextInt(10);
            ansAry[2] = random.nextInt(10);
        } while (ansAry[0] == ansAry[1] || ansAry[1] == ansAry[2] || ansAry[0] == ansAry[2]);

//        답 확인 테스트용
//        answer = ansAry[0] * 100 + ansAry[1] * 10 + ansAry[2];
//        System.out.println("답 : " + answer);

        System.out.println("야구게임 시작합니다!");
        // 사용자에게 3개 입력받기
        int inputNum;
        int inputAry[] = new int[3];

        while (true) {
            // 숫자 입력받기
            System.out.println("숫자를 입력하세요");
            System.out.print(">> ");
            inputNum = sc.nextInt();

//            if (inputNum == 0) {
//               System.out.println("게임을 종료합니다.");
//              break;
//            }

            // 배열에 넣기
            inputAry[0] = inputNum / 100;
            inputAry[1] = (inputNum / 10) % 10;
            inputAry[2] = inputNum % 10;

//          배열에 잘 들어갔는지 확인
//          System.out.println(Arrays.toString(inputAry));

            if (checkNum(inputAry)) {
                System.out.println("Error: 같은 숫자를 입력했습니다. 게임을 종료합니다.");
                break;
            }

            // 볼, 스트라이크 숫자 받기
            int ball = ballCount(ansAry,inputAry);
            int strike = strCount(ansAry, inputAry);


            // 볼, 스트라이크 표시하고 3 스트라이크일 시 게임 종료
            if (strike != 3) {
                System.out.println(ball+"B"+strike+"S");
            } else if (strike == 3) {
                System.out.println("정답입니다!");
                System.out.println("WIN!!");
                break;
            }

        }


    }

    // 볼, 스트라이크 확인
    static int ballCount(int[] ansAry, int[] inputAry) {
        int ball = 0;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (i != j && ansAry[i] == inputAry[j]) {
                    ball++;
                }
            }
        }
        return ball;
    }

    static int strCount(int[] ansAry, int[] inputAry) {
        int strike = 0;

        for (int i = 0; i < ansAry.length; i++) {
            if (ansAry[i] == inputAry[i]) {
                strike++;
            }
        }
        return strike;
    }

    // 중복 값 확인하기
    static boolean checkNum(int[] inputAry) {
    // HashSet을 사용하여 Integer 형식의 요소를 저장하는 Set 인터페이스의 객체를 생성
    // 이를 변수 set에 할당하는 것
        Set<Integer> set = new HashSet<>();

        for (int num : inputAry) {
            if (!set.add(num)) {
                return true;
            }
        }
        return false;

    }

}

 

  • 게임 실행 화면

야구게임 생각보다 어려웠고 정말 오래걸렸다. (4시 시작 8시쯤 끝 ㅠㅠ)
분명히 공부한건데...!! 할 수 있을 것 같은데..!!! 막상 적어보려고 하니 머릿속이 하얘졌다.
다행히 팀이였던 분이 자바 공부하셨던 분이라 많은 도움을 받았다.
프로젝트를 하던 당시에 아직 배우지 않았던 부분들이 있어서(메소드 활용, Set) 일단 검색해보고 넘어갔는데
마침 오늘 배운 내용이 있어서 내일 시험 끝나면 완성코드에 전부 주석달기를 해봐야겠다.