일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 텍스트마이닝
- 딥러닝
- 정수와유리수
- CSS
- 연습문제
- numpy/pandas
- JSP/Servlet
- 컴퓨터비전
- 영어공부
- 혼공머신
- 자바 실습
- 데이터입출력구현
- 정보처리기사실기
- 데이터분석
- CNN
- 코딩테스트
- 머신러닝
- pandas
- 컴퓨터구조
- 데이터베이스
- 중학수학
- 운영체제
- 정보처리기사필기
- C++
- 중학1-1
- SQL
- 파이썬
- 자바
- html/css
- 파이썬라이브러리
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
반복문과 배열 그리고 예외 처리 21 - 카드 맞추기 게임 실습 본문
연습문제를 풀기 전에 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()을 사용하지 않으면, 스트림에 여전히 잘못된 입력이 남아 있어 다음 입력 시도에서 다시 예외가 발생할 수 있다.
정수를 입력하지 않으면 이렇게 예외 처리가 발생한다.
학습을 마치고
도전 문제도 풀어보니 의미가 있는 수업이었다. 정말 어려운 문제로 나중에 한번 더 풀어보며 복습해보려고 한다. 지금은 이 정도로 이해하는 것도 충분한 것 같다.
이제 다음 포스트에서는 연습 문제 이론편부터 풀어보며 학습하려고 한다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
반복문과 배열 그리고 예외 처리 23 - 연습문제 이론편 풀어보기 2 : 8~14번 문제 (0) | 2024.08.14 |
---|---|
반복문과 배열 그리고 예외 처리 22 - 연습문제 이론편 풀어보기 1 : 1~7번 문제 (0) | 2024.08.14 |
반복문과 배열 그리고 예외 처리 20 - 자바의 예외 처리 (0) | 2024.08.14 |
반복문과 배열 그리고 예외 처리 19 - 메소드에서 배열 리턴과 main() 메소드에 대하여 (0) | 2024.08.14 |
메서드 9 - 클래스 소개 + 미션 문제 풀기 (0) | 2024.08.14 |