숫자야구게임 트러블슈팅

‍박태우·2024년 9월 20일

nbc_spring

목록 보기
18/28
  • 아래와 같은 LV4를 모두 포함하는 main 문을 설계하는 과정에서 다음 조건을 만족 시키고 싶었다.

문제에서 제시하는 조건은 자리수를 설정한 이후 자동으로 게임이 시작되는 것이었으나 아래 결과와 같이 다시 원하는 번호로 이동되는 원치 않는 과정이 발생 하였다.

  • 기존 코드

public class Main {
    public static void main(String[] args) throws IOException {

        Scanner sc;
        int digits = 3; // 디폴트 3
        List<Integer> try_count = new ArrayList<>();


        while (true) {
            System.out.println("환영합니다! 원하시는 번호를 입력해주세요");
            System.out.println("0. 자리수 설정 1.게임 시작하기 2. 게임 기록 보기 3. 종료하기");
            sc = new Scanner(System.in);
            int menu = sc.nextInt();

            if (menu == 0) {
                while (true) {
                    try {
                        System.out.println("설정하고자 하는 자리수를 입력하세요");
                        digits = sc.nextInt();


                        if (digits >= 3 && digits <= 5) {
                            System.out.println(digits + "자리수 난이도로 설정되었습니다.\n");
                            break;
                        }
                        System.out.println("3이상 5이하의 정수를 입력하세요\n");


                    }catch (InputMismatchException e){
                        System.out.println("올바른 형태의 정수를 입력해주세요\n");
                        sc.nextLine();
                    }


                }

            }

            else if (menu == 1) {
                System.out.println("< 게임을 시작합니다 >");
                GamePlay gp = new GamePlay(digits);
                try_count.add(gp.play());
            } else if (menu == 2) {
                BaseballGameDisplay.displayHistory(try_count);

            } else if (menu == 3) {
                System.out.println("숫자 야구를 모두 종료합니다.");
                break;
            } else {
                System.out.println("올바른 숫자를 입력해주세요!\n");
            }
        }


    }
}

0을 입력 받은 경우 while문을 들어가서 올바른 값이 입력 될 때 까지 계속 입력 하도록 유도 하는 것 까지는 좋았으나 올바른 값을 입력 받고 게임이 시작 즉 menu 1번으로 가도록 하고 싶었다.

?? 일단 고민해보자

=> 처음에는 전체적인 메뉴 입력 판 전체의 구조를 바꿀까 생각을 해보았다. 하지만 그러기 전에 좀더 간단한 방법이 있을 지 생각을 해보았고 고민 끝에 아래 방법을 생각해 보았다.

if (menu == 0) {
                while (true) {
                    try {
                        System.out.println("설정하고자 하는 자리수를 입력하세요");
                        digits = sc.nextInt();


                        if (digits >= 3 && digits <= 5) {
                            System.out.println(digits + "자리수 난이도로 설정되었습니다.\n");
                            menu = 1; // menu 변수를 1로 변경함
                            break;
                        }
                        System.out.println("3이상 5이하의 정수를 입력하세요\n");


                    }catch (InputMismatchException e){
                        System.out.println("올바른 형태의 정수를 입력해주세요\n");
                        sc.nextLine();
                    }


                }

            }
	if (menu == 1) {
  		System.out.println("< 게임을 시작합니다 >");
 		GamePlay gp = new GamePlay(digits);
 		try_count.add(gp.play());
     }
}

(주석 참고) 올바른 자릿수가 입력이 되면 menu 변수를 1로 바꿔서 다음 메뉴로 자동으로 넘어가도록 설계하였다.
이때 menu==1 인 조건을 if문으로 설계하였는데
만약에 else-if 문으로 설계한다면 어떻게 될까?


일단 결론 부터 말하자면 실행 결과는 동일 했다.
하지만 구조상으로나 로직적으로나 else if 보다는 if 를 쓰는 것이 맞는 것 같다.
그 이유는 else if 의 경우 이전 if 문과 연결되어서 동작 하지 않을 수 있지만
if 의 경우는 서로 분리된 if 문 이기 때문에 menu==0 을 따지고
업데이트 된 menu==1의 조건을 가지눈 if 문을 수행 할 수 있는 것이다.

변경된 실행 결과 :

(정상적으로 자리수 설정 후 바로 자리수가 입력되도록 유도되는 것을 볼 수 있음)

소감 : 아무래도 생각보다 간단한 문제였던 것 같다. 처음에는 너무 내 코드에 대한 신뢰감 없이 모든 코드를 변경하려고만 하다보니 시간 소비와 함께 머리도 아팠던 것 같다. 어떻게 보면 기본에 충실하면 위 문제는 그리 어려운 것도 아니었던 것 같다. 남은 java 교육 기간 동안 확실한 기본기를 잡고 다음 step 인 spring 으로 넘어가고 싶다는 생각을 했다.

profile
잘 부탁드립니다.

0개의 댓글