TIL/Project

TIL 2024-10-22 (숫자 야구 게임 - 2)

myoma 2024. 10. 22. 20:21

1 ) 볼 처리하기

  • 숫자 야구 게임 볼 처리하기.
    • 저번 프로젝트 이어서 진행. ( 저번 진행은 스트라이크 처리)
    • 볼 처리하는 방법.
      • 처음 프로젝트를 보고 생각했던 방법
      • 이중for문을 돌려 스트라이크와 볼을 동시에 처리.
      • but! 스트라이크 처리 메서드와 볼 처리 메서드를 따로 생성.
    • 볼만 처리하는 메서드 따로 생성.
private int countBall(int input) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        int num = 0;
        while (input > 0) { // 입력 받은 숫자를 자릿 수 마다 하나씩 저장
            list.add(input % 10);
            input /= 10;
        }

        for(int i = 0; i < list.size(); i++){
            for(int j = 0; j < list.size(); j++){
                if(list.get(list.size()-i-1) == ran_num[j]) { //하나씩 비교하며 값은 같으나, 위치가 다를 때 마다 ball
                    if(i != j) {
                        num++;
                    }
                }
            }
        }
        return num;
    }
  • 사용자가 입력한 3자리의 숫자를 input으로 받게 만들고 저번과 같이 입력받은 숫자를 한 자릿 수 씩 리스트에 저장.
  • list에는 뒤에 자릿 수 부터 들어가기에 랜덤 난수 3자리와 자릿 수를 맞춰주기 위해.
  • list.get(list.size()-i-1)을 해주어 같은 백의 자리, 십의 자리를 비교한다.
  • 이때 우린 볼을 처리해야하기에. 첫번째 부터 다 비교해주는데.
  • list의 값과 배열의 값을 비교. 이때 값이 같다면 if문 실행.
  • 이때 i와 j의 값이 다르면 위치가 다른 거기 때문에 num++;을 해준다.
  • 여기 return 값은 이제 볼 갯수로 처리.

 

  • 처음에 백의 자리, 십의 자리, 일의 자리 위치를 맞춰주지 않으니 볼 갯수 처리하는 부분에서 오류 발생.
    • ex) 143이 정답이라면 314를 한다면 원래는 3ball이 나와야하지만. 3의 위치가 서로 다름에도 List와 array의 자릿 수가 맞지 않아 스트라이크로 판별. 
    • 그렇게 오류 발생.
    • 자릿 수를 맞춰줌으로서 오류 해결.

 

public class BaseballGameDisplay {
    public void displayHint(int strike, int ball) {
        if(strike == 0 && ball == 0){
            // 스트라이크와 볼이 해당되지 않는 경우
            System.out.println("out 입니다!");
            System.out.println("=====================");
        } else if(strike == 3){
            // 정답을 맞춘 경우
            System.out.println("정답을 맞추셨습니다! 승리!!");
            System.out.println("=====================");
        } else{
            // 스트라이크와 볼 갯수 알려주기
            System.out.println(strike + " 스트라이크, " + ball +" ball 입니다");
            System.out.println("=====================");
        }
    }
}
  • 스트라이크와 볼로 힌트를 주는 클래스 생성.
  • 원래는 기존에 baseballgame class에 그대로 생성하여 만들었으나 클래스를 따로 만들어야 하는 것을 확인.
  • 따로 만들어 클래스를 생성및 선언하여 사용하는 것은 큰 어려움이 없었다.
  • 원래 3 strike의 경우 정답을 맞췄다면서 while문이 멈춰야한다.
  • 기존의 방법
    • break; 을 이용하여 while문 종료.
    • 다른 클래스로 만들고 나서는 break; 불가
    • 해결 방법.
while (flag) {
            System.out.println("3자리 숫자를 입력하시오 : ");
            int input = sc.nextInt();

            if (input < 100 || input > 999) { // 입력 숫자가 2자리 경우 다시 입력
                System.out.println("3자리를 입력해주세요!");
                continue;
            }

            flag = validateInput(input);
            // num을 return 받아 스트라이크와 볼 갯수 저장.
            int strike = countStrike(input);
            int ball = countBall(input);
            hint.displayHint(strike, ball);
            if (strike == 3) { // 3 strike의 경우 반복문 종료.
                flag = false;
            }
            playNum++;
}
  • displayHint(); 클래스가 끝나고나서 if(strike == 3) 이라면 flag를 false;를 바꿔줌으로서 while문 종료.
  • 코드가 마음에 들지 않아서 더 깔끔한 방법이 있나 생각하다가 떠오르지 않아 튜터님께 도움 요청.
  • 코드를 깔끔하게 하기 위해서 다른 코드들까지 건드려야 되는 상황이라 그냥 그대로 진행.

 

 

public class Main {
    public static void main(String[] args) {
        boolean flag = true;

        while (flag) {
            System.out.println("환영합니다! 원하시는 번호를 입력해주세요.");
            System.out.println("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기");
            Scanner scanner = new Scanner(System.in);
            int input = scanner.nextInt();

            switch (input) {
                case 1:
                    Baseballgame start = new Baseballgame();
                    start.play();
                    continue;
                case 2:
                    System.out.println("구현되지 않았습니다.");
                    break;
                case 3:
                    System.out.println("게임을 종료합니다. 감사합니다 :)");
                    flag = false;
                    break;
            }
        }
    }
}
  • 메인 클래스 작성
    • '1' 을 입력할 시 게임 실행, '2' 입력 시 게임 기록 확인, '3' 입력 시 게임 종료.
    • 입력값을 넣을 시 특정 이벤트가 발생은 switch로 해결.
    • '1'을 입력했을 시 게임을 실행하고 다시 게임 시작 문구를 띄워야 하기에 continue;
    • '2'는 LV_3로 현재 구현 중.
    • '3'은 입력 시 flag를 false로 바꿔준다. 그러면 while문이 종료되면서 게임 종료.
  • Lv_3 진행 중인데 접근제어자를 사용하여 게임 진행 횟수를 리스트에 저장하고 싶은데 생각대로 되지 않아 아쉬움.
  • 내일은 Lv_3를 마무리하고 Lv_4를 보는 것이 목표.