클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

반복문과 배열 그리고 예외 처리 21 - 카드 맞추기 게임 실습 본문

프로그래밍 언어/자바

반복문과 배열 그리고 예외 처리 21 - 카드 맞추기 게임 실습

huenuri 2024. 8. 14. 13:16

연습문제를 풀기 전에 Open Challenge 문제를 하나 풀어보려고 한다. 비슷한 문제를 수업 예제로 풀어본 적이 있었다. 하지만 이 문제가 훨씬 더 어려워보인다.

한번 풀어보기로 하자!


 

 

 

 

카드 번호 맞추기 게임(up & down 게임)

숨겨진 카드의 수를 맞추는 게임을 만들어보자. 0에서 99까지의 임의 수를 가진 카드를 한 장 숨기고 이 카드의 수를 맞추는 게임이다. 카드 속의 수가 77인 경우를 보자. 더 낮은 수를 입력하면 “더 높게”를 출력하고 낮은 수라면 “더 낮게”를 출력한다. 그리고 게임을 반복하기 위해 y/n을 묻고 n인 경우 종료한다.

 

혼자서 풀어보기

 

 

이렇게만 출력이 되고 더이상 진행이 되지 않았다. 문제가 많이 어려웠다. 도저히 내 힘으로는 풀 수가 없어서 정답을 참고하며 풀어보았다.


 

 

 

 

다시 풀어보기

 

 

원래 정답에는 게임을 종료합니다라는 문구는 없었는데 한번 넣어보았다. 이게 없으니 프로그램이 끝났는지 아닌지 확인하기 어려웠다. 몇 가지 드는 의문이 있었는데 출력을 해보며 알게 되었다.

 

1. 왜 low와 high 변수를 만들어서 설정할까?

  • 어떤 값을 입력해야 하는지 알기 위해서 범위를 설정해준다

2. low와 high 값을 n에 넣어주는 이유

  • 이것도 1번 질문과 비슷하다. 이렇게 하면 지금 어떤 값을 입력해야 하는지  파악할 수 있게 된다.

 

3. while 문을 2번 사용하는 이유

그리고 while문을 2번 쓰는 이유도 궁금했는데 그 부분도 해결이 되었다. 


첫 번째 while 문 (외부 루프)

  • 역할: 전체 게임을 반복해서 실행하기 위한 루프이다.
  • 기능: 플레이어가 "게임을 다시 할지" 또는 "게임을 종료할지"를 결정할 수 있게 한다.
  • 종료 조건: 사용자가 'n'을 입력하면 이 while 루프가 종료되고, 프로그램도 종료된다.

 

두 번째 while 문 (내부 루프)

  • 역할: 게임의 한 라운드에서 사용된다. 즉, 사용자가 카드 번호를 맞출 때까지 계속 시도할 수 있도록 한다.
  • 기능: 사용자에게 현재 카드 번호 범위를 알려주고, 사용자가 입력한 값이 정답인지 여부를 검사한다.
  • 종료 조건: 사용자가 정답을 맞추면 이 while 루프가 종료되고, 게임이 다시 시작되거나 종료된다.

 

 

 

4. nextLine()이 모든 키를 버리는 이유

try {
    n = sc.nextInt(); // 수를 입력 받기
}
catch (InputMismatchException e) {    
    // 키 입력을 정수로 변환하지 못하는 예외 처리
    System.out.println("정수만 입력하셔야 합니다!!");
    sc.nextLine(); // 나머지 모든 키를 읽어서 버린다
    continue; // 다시 시도한다
}

 

  • 문제: sc.nextInt() 메서드는 사용자가 입력한 값을 정수로 변환한다. 그러나 사용자가 정수가 아닌 다른 값을 입력하면 InputMismatchException 예외가 발생한다.
  • 해결책: 이 예외를 처리하기 위해 catch 블록에서 sc.nextLine()을 호출한다. nextLine()은 입력 스트림에서 현재 줄을 읽어온다. 이때, 잘못된 입력이 있으면 해당 줄 전체를 버리게 된다.
    • 예를 들어, 사용자가 "abc" 같은 비정수 값을 입력하면, nextInt()는 이를 처리하지 못해 예외가 발생하고, nextLine()이 "abc"를 읽어와 스트림을 비워준다. 이 과정을 통해 다음 입력을 받을 준비를 할 수 있게 된다.
    • 만약 nextLine()을 사용하지 않으면, 스트림에 여전히 잘못된 입력이 남아 있어 다음 입력 시도에서 다시 예외가 발생할 수 있다.

 

정수를 입력하지 않으면 이렇게 예외 처리가 발생한다.


 

 

학습을 마치고

도전 문제도 풀어보니 의미가 있는 수업이었다. 정말 어려운 문제로 나중에 한번 더 풀어보며 복습해보려고 한다. 지금은 이 정도로 이해하는 것도 충분한 것 같다.

이제 다음 포스트에서는 연습 문제 이론편부터 풀어보며 학습하려고 한다.