Java - 숫자 야구 프로그램

김지현·2023년 4월 4일
0

항해99 과제

목록 보기
1/4

2023-04-04


과제 조건

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

풀이 과정

for문과 if문을 사용해서 처음엔 수월하게 과제를 했다.
하지만 다 만들고 보니 이런 방식으로 나와야 하는데

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

내 결과물은 배열의 숫자 하나씩 입력해야했다.

// 첫번째 결과물
컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
1번째 시도 : 1
1번째 시도 : 2
1번째 시도 : 5
0B0S
2번째 시도 : 1
2번째 시도 : 3
2번째 시도 : 6
1B0S
3번째 시도 : 3
3번째 시도 : 6
3번째 시도 : 7
2B0S
4번째 시도 : 3
4번째 시도 : 4
4번째 시도 : 7
2B1S
5번째 시도 : 7
5번째 시도 : 4
5번째 시도 : 3
0B3S
6번만에 맞히셨습니다.
게임을 종료합니다.

음.. 뭔가 잘못됐다.

// 수정 전 코드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] numbers = new int[3];         // 컴퓨터
        int[] userNumbers = new int[3];     // 유저
        int count = 1;

        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = (int) (Math.random() * 9 + 1);

            for (int j = 0; j < i; j++) {
                if (numbers[i] == numbers[j]) {
                    i--;
                    break;
                }
            }
        }
        System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");

        while (true) {
            int strike = 0;
            int ball = 0;

            for (int i = 0; i < numbers.length; i++) {
                System.out.print(count + "번째 시도 : ");
                userNumbers[i] = sc.nextInt();
            }

            for (int i = 0; i < numbers.length; i++) {
                for (int j = 0; j < userNumbers.length; j++) {
                    if (numbers[i] == userNumbers[j] && i == j) {
                        strike++;
                    } else if (numbers[i] == userNumbers[j] && i != j) {
                        ball++;
                    }
                }
            }
            System.out.println(ball + "B" + strike + "S");
            count++;

            if (strike == 3) {
                System.out.println(count + "번만에 맞히셨습니다.");
                System.out.println("게임을 종료합니다.");
                break;
            }
        }
    }
}

코드를 보면 while문 안에 첫번째 for문에서 userNumbers 배열을 하나씩 numbers 배열의 길이만큼 돌리는 방식으로 코드를 적어놔서 이런 결과물이 나오는 것 같았다.

또 count도 맞히고나서 한번 더 도는 것 같으니 count++; 의 위치를 마지막 if문 밑으로 내려야겠다.

// 수정 후 코드
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] numbers = new int[3];         // 컴퓨터
        int[] userNumbers = new int[3];     // 유저
        int count = 1;

        // 무작위 숫자 numbers 생성
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = (int) (Math.random() * 9 + 1);

            for (int j = 0; j < i; j++) {
                if (numbers[i] == numbers[j]) {
                    i--;
                    break;
                }
            }
        }
        System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");

        while (true) {
            int strike = 0;
            int ball = 0;
            String input = "";

            // userNumbers 입력
            System.out.print(count + "번째 시도 : ");
            input = sc.nextLine();

            if(input.length() == 3) {
                userNumbers[0] = input.charAt(0)-'0';
                userNumbers[1] = input.charAt(1)-'0';
                userNumbers[2] = input.charAt(2)-'0';
            } else {
                continue;
            }

            // numbers와 userNumbers 비교
            for (int i = 0; i < numbers.length; i++) {
                for (int j = 0; j < userNumbers.length; j++) {
                    if (numbers[i] == userNumbers[j] && i == j) {
                        strike++;
                    } else if (numbers[i] == userNumbers[j] && i != j) {
                        ball++;
                    }
                }
            }
            System.out.println(ball + "B" + strike + "S");

            // 종료문구
            if (strike == 3) {
                System.out.println(count + "번만에 맞히셨습니다.");
                System.out.println("게임을 종료합니다.");
                break;
            }
            count++;
        }
    }
}

String으로 input 을 받아서 그 String 문자을 하나씩 userNumbers 배열에 넣어주는 형식으로 해결했다.
input 은 String이므로 nextInt 대신 nextLine을 쓰니 아주 잘 돌아간다.

// 결과물
컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
1번째 시도 : 123
1B0S
2번째 시도 : 145
2B0S
3번째 시도 : 146
1B0S
4번째 시도 : 157
1B0S
5번째 시도 : 459
2B0S
6번째 시도 : 458
2B0S
7번째 시도 : 457
2B0S
8번째 시도 : 453
3B0S
9번째 시도 : 534
0B3S
9번만에 맞히셨습니다.
게임을 종료합니다.

0개의 댓글

관련 채용 정보