[Java] High-Low 게임 만들기(AWT 사용)
요구사항:
(AWT를 사용할 것, Frame/Applet 둘 중 하나)
- 1에서 100 사이의 숫자를 입력하여 감추어진 숫자를 찾는 게임 프로그램을 작성하라
- 여섯 번 만에 찾지 못하면 게임에서 진다.
- 보관해 둔 숫자를 맞추기 위해서 텍스트필드를 통해 숫자를 입력한다
- 맞히면 끝낸다.
- 맞히지 못하면 방금 입력한 숫자보다 큰지 작은지를 텍스트에리어에 표시한다.
- 예를 들어서 50을 입력했는데 숨겨진 숫자가 더 클 경우, 다음과 같이 표시한다.
- 50보다 큽니다. [51]-[100]사이의 숫자를 입력해 주십시오.
1. 해법 기술
High-Low 게임의 방법을 풀기 위해, 어떻게 해야 할지 생각해 보았습니다.
이전까지는 프로그램이 동작하는 핵심 부분을 우선적으로 생각해야 했는데, 이번 과제는 AWT를 이용한 윈도우 프로그래밍이라 윈도우의 모습부터 정하고 시작해야 했습니다.
하이로우 게임을 제작하기에 앞서, 손으로 하이로우 게임의 완성 모습을 그려 봤습니다. 이전까지는 콘솔 프로그래밍이라 그저 문제의 해결에만 주목했는데, 이번에는 윈도우의 ‘실제’ 모습을 상상하며 만들어야 했기 때문에 더욱 흥미로웠습니다.
위의 디자인은 책(JAVA 2 JDK 5.0)의 SWING부분에 나오는 JTAB 스타일입니다. 탭의 모습은 그대로 사용하고, 입력 부분(텍스트 필드), 게임 진행 화면(텍스트 에어리어), 진행률(Progress bar)까지 표현하기로 했습니다.
그리고 프로그램의 동작은 아래와 같이 만들기로 했습니다.
- 먼저 임의의 숫자(ex. 50)를 생성합니다.
- 텍스트 필드에서 사용자의 키 입력을 받습니다.
- 입력 받은 값을 1.에서 만든 숫자와 비교합니다.
- 값이 일치하면 게임에서 이깁니다.(바로 8.번으로 넘어갑니다)
- 값이 일치하지 않으면 1.에서 만든 숫자보다
크면 [51~100] 사이를 입력하도록 유도합니다.
작으면 [1~49] 사이를 입력하도록 유도합니다. - 값을 입력 받을 때 마다 카운터를 증가시킵니다.
- 카운터가 6이 되면 게임을 끝내고, 답(1.에서 만든 숫자)을 출력합니다.
- 게임을 다시 시작할 수 있는 상태로 만듭니다(초기화)
2. 객체 모델링 및 UML
1) 객체
HighLow class(게임 메인)
2) 메서드
컴포넌트 추가(버튼, 필드 등), 초기값 생성, 숫자 입력받기, 숫자 비교, 액션 리스너 값 등
3) 멤버
탭 구현 판, 버튼(입력), 텍스트필드, 텍스트 에어리어, 임의의 숫자, 사용자가 입력한 숫자, 게임 횟수 카운터, 진행율 표시 바, 기타 라벨들(게임, 도움말, 진행률 텍스트 라벨)
4) UML 및 세부 설명
참고: UML과 설명이 바로 나오는 이유는 한 파일 안에 모든 구성요소를 넣었기 때문입니다.
| HighLow.java |
설명 |
| -pane: JTabbledPane -button1: Button -keyb: TextField -txtStatus: TextArea -num: int -mynum:int -gamecount: int -progBar: JProgressBar -progTxt: Label |
JTabbedPane 초기화 입력 버튼 키보드 입력을 받는 텍스트필드 생성 게임 진행 및 결과를 표시할 TextArea 생성 임의의 숫자 입력받을 숫자 게임 횟수 카운트 진행율을 표시할 프로그레스 바 생성 프로그레스바 라벨 |
| -HighLow(): void -createNumber(): void -inputNumber(): void -playgame(): void -getPreferedSize: Dimension -stateChanged(e: ChangeEvent): void -actionPerformed(e: ActionEvent): void -main(s: String[]): void -extracted(frame: JFrame): void |
HighLow 생성자 임의의 숫자를 생성함 사용자가 입력한 숫자를 저장함 게임 시작(숫자 비교 및 결과 출력) 윈도우의 크기 설정 탭이 변경되었을 때의 ActionChange 값 받아옴 사용자의 입력이 들어왔을 때의 액션값 메인 함수 윈도우를 구성하는 JFrame 설정 |
3. 소스코드
4. 부분모듈(메소드) 테스트
1. 먼저 탭 윈도우(JPanel)를 만들고 게임 및 도움말 탭으로 나누었습니다.
2. 게임 탭 안에 숫자 입력(라벨)과 입력(button)을 추가했습니다
3. 게임 진행 메시지가 나타날 텍스트 에어리어 생성
4. 버튼이 눌러졌을 때 액션을 을 취할 actionPerformed 모듈 만듬
5. 도움말 탭에 라벨 및 텍스트에어리어를 이용해서 도움말 출력
6. 진행율 부분은 JProgressBar를 통해 생성
5. 시행착오
많은 시행 착오를 겪었습니다. 윈도우 프로그래밍을 몇 번 해 보지 않았기도 했지만, 숫자 입력을 받고 저장하기 위해 이벤트 리스너가 꼭 필요했습니다.
이벤트 리스너를 만들고 숫자 입력 칸에 숫자가 아닌 다른 값을 만들어 넣었을 때, 아래 사진처럼 오류 메시지를 뱉어 내더군요.
‘숫자’가 아닌 값을 걸러 내기 위해서는 어떻게 해야 할까? 하고 고심하다가, 수업 시간에 배운 try-catch 를 이용하여 해결할 수 있었습니다. If 구문을 통해 범위를 벗어난 숫자 값을 필터링 할 수 있었지만 문자값에 의한 오류는 생각해 보지 않아서 생긴 오류였습니다.
그리고 게임을 만들 때 한 번 값을 비교한 뒤에 그것이 끝나면 어떤 식으로 초기화를 해야 하는지 몰라서, 그것을 해결하는 데 많은 시간을 보냈습니다. 생각 끝에 숫자를 입력받는 부분에서 처음에 게임 카운트의 값을 검사해서, 그것이 게임 시작 조건과 일치하면 초기화 하는 식으로 만들어서 해결했습니다.
6. 게임 시행 과정 및 결과
[아래 그림 설명]먼저 프로그램을 실행하면 먼저 초기화 된 화면을 보여 줍니다. 임의의 숫자를 생성하고 0부터 100까지의 숫자를 입력하라는 메시지를 보여 줍니다.(좌)
그리고 텍스트 필드에 숫자를 입력하고 엔터를 누르거나 [입력] 버튼을 누르면 입력된 값을 임의의 숫자와 비교합니다. 틀리면 힌트를 출력합니다.(우)
참고: 진행률 부분에도 주목해 주십시오
마찬가지로 두번째, 세번째의 경우에도 맞추지 못하면 힌트를 출력합니다.
마찬가지로 4번째, 5번째도 진행됩니다.(계속 틀린 값 입력)
그러다가 마지막에 사용자가 입력한 값이 맞으니 “빙고” 게임 승리 메시지를 출력하고, 새 게임을 기다립니다.(사용자가 아무 키나 입력하면 게임 재시작)
[아래 그림 설명] ‘도움말’ 탭을 누르면 게임에 있어 필요한 클리어 조건을 알려 줍니다.
[아래 그림 설명]
두 번 만에 숫자를 맞춘 경우의 화면(좌) ,6번 기회 모두 놓친 경우의 화면(우)
'프로그래밍 실습 > 자바(Java)' 카테고리의 다른 글
| [Java] 로또 복권 시뮬레이션 게임 만들기 (4) | 2011.01.02 |
|---|---|
| [Java] 메모 노트(Memo Note) 프로그램 (1) | 2011.01.02 |
| [Java] 두 개의 주사위를 던진다. 각 주사위는 여섯 개의 면이 있으며, 각 면에는 1,2,3,4,5,6개의 점이 있다. 주사위가 멈추면 두 주사위 윗면에 있는 점의 개수를 더한다. 게임을 100번 시행했을 때, 승률은 어떻게 되는가? 그 과정들을 보이고 승률을 %로 나타내어라 (0) | 2011.01.02 |
| [Java] Integer 클래스의 메소드를 조사, 예제 프로그램 작성하기 (0) | 2011.01.02 |
| Math 클래스의 메소드들을 조사하고 다음 메소드 5개에 대하여 예제 프로그램을 작성하고 결과를 보여라. (0) | 2010.05.13 |
