반응형

요구사항:

  • 로또 복권 시뮬레이션 게임 만들기
  • 게임 시작을 누르면 아래의 사항을 진행한다.
  • 1-45 사이의 숫자를 6개 발생시켜 순서대로 나열한 후 보관한다.
  • 1-45 사이의 숫자를 1개 발생시켜 예비 숫자로 보관한다.
  • 1-45 사이의 6개 숫자를 입력한다.
  • 내가 입력한 숫자가 몇 등인지 확인한다.
    • 6개 숫자가 다 맞으면 1등
    • 6개 중에 5개 숫자가 맞고 예비숫자가 맞으면 2등
    • 6개 중에 5개 숫자가 맞으면 3등
    • 6개 중에 4개 숫자가 맞으면 4등
    • 6개 중에 3개 숫자가 맞으면 5등
  • 게임 종료 버튼을 따로 두고, 종료하지 않으면 새로운 게임을 계속할 수 있도록 설계한다.

1. 해법 기술

High-Low 게임을 한번 만들고 나니, 두 번째의 로또 게임은 수월하게 만들 수 있겠다는 생각이 들었습니다. High-Low 게임을 만들었을 때와 동일하게, JPanel과 JTabbedPane 을 이용한 탭 형식의 프로그램을 만들기로 결정했습니다. 아래와 같이 디자인을 먼저 했습니다. 이번에는 결과 창이 위쪽으로, 입력 란이 아래쪽으로 해서 나오도록 만들어 보았습니다.


탭은 게임 탭과 게임 규칙으로 나누어 만들고, 게임 진행 화면(텍스트 에어리어), 입력 부분(텍스트 필드), 추첨 시작(Button), 종료(Button)를 표현하기로 했습니다.

그리고 프로그램의 동작은 아래와 같이 만들기로 했습니다.

  1. 먼저 임의의 숫자 6개를 생성합니다.
  2. 1.에서 만든 숫자를 배열에 저장합니다.
  3. 사용자에게 6칸의 텍스트 필드에서 숫자를 각각 입력받습니다.
  4. 3.에서 입력받은 값과 2.에서 만든 배열의 값들을 서로 비교합니다.
  5. 일치하는 숫자가 있을 경우, 카운터를 증가시킵니다.
  6. 카운터의 수에 따라 등수를 결정합니다. 보너스 점수 또한 비교합니다.
  7. 등수 또는 꽝 메시지를 보여 줍니다.
  8. 게임을 초기화 합니다. 1~7의 공정을 다시 반복합니다.
  9. 종료 버튼을 누르면 프로그램이 닫힙니다.

2. 객체 모델링 및 UML

1) 객체
Lotto class(게임 메인)

2) 메서드
컴포넌트 추가(버튼, 필드 등), 초기값 생성, 숫자 입력받기, 숫자 비교, 액션 리스너 값 등

3) 멤버
탭 구현 판, 버튼(입력), 텍스트필드, 텍스트 에어리어, 임의의 숫자(배열), 사용자가 입력한 숫자(배열), 게임 횟수 카운터, 진행율 표시 바, 기타 라벨들(게임, 도움말, 진행률 텍스트 라벨)

4) UML 및 세부 설명

참고: UML과 설명이 바로 나오는 이유는 한 파일 안에 모든 구성요소를 넣었기 때문입니다.

Lotto.java

설명

-pane: JTabbedPane

-calendar: Calendar

-currentDate: String

-startlotto: Button

-endlotto: Button

-ta: JTextArea

-hlp: JTextArea

-no1: JTextField

-no2: JTextField

-no3: JTextField

-no4: JTextField

-no5: JTextField

-no6: JTextField

-mynum: int[]

-num: int[]

-gamecount: int

-correct: int

-ex: Exit

-duplicate: int

-exit: boolean

JTabbedPane 초기화

Calendar 형 인스턴스 초기화

현재 날짜를 String형으로 초기화

로또 추첨 버튼

종료 버튼

상황을 표시하는 텍스트 에어리어

도움말을 표시하는 텍스트 에어리어

숫자 입력을 받는 텍스트 필드

숫자 입력을 받는 텍스트 필드

숫자 입력을 받는 텍스트 필드

숫자 입력을 받는 텍스트 필드

숫자 입력을 받는 텍스트 필드

숫자 입력을 받는 텍스트 필드

사용자의 입력값이 저장될 배열

임의의 숫자가 저장될 배열

게임 카운트 변수

일치하는 숫자를 카운트 할 변수

게임이 끝났는지 검사할 변수

숫자의 중복을 체크하는 변수

중복 등으로 초기화를 필요로 하는지 검사하는 변수

-Lotto(): void

-createNumber(): void

-comparelotto(): void

-inputnum(): void

-getPreferredSize(): Dimension

-stateChanged(e: ChangeEvent): void

-actionPerformed(e: ActionEvent): void

-main(s: String[]): void

Lotto 생성자

임의의 숫자를 생성

숫자를 비교

숫자를 입력받음

화면의 크기를 설정함

탭이 전환되는지를 체크함

사용자의 키/클릭 이벤트를 잡아냄

프로그램 메인

3. 소스코드


4. 부분모듈(메소드) 테스트

1. 먼저 탭 윈도우(JPanel)를 만들고 게임 및 도움말 탭으로 나누었습니다.


2. 중간에 텍스트 에어리어를 삽입하고 Lotto게임(게임 시작) 버튼을 삽입했습니다.


3. 이번에는 조금 다르게 해 보자는 생각에 일반적인 TextArea가 아닌, JTextArea로 삽입해 보았습니다. 보통의 텍스트 에어리어를 삽입했을 때와는 달리, 스크롤바가 나타나지 않는 것이 조금 이상하긴 하더군요.

어떻게 보면 깔끔하다는 생각이 들기도 해서 가만히 놔뒀습니다.. 하지만 다음에는 이유를 찾고 스크롤바를 표시하는 방법을 배우고 싶습니다.


4. 도움말 탭을 ‘게임 규칙’으로 변경해서, 로또의 규칙을 설명하도록 만들었습니다. 설명하면 쉬운데, 만들 때는 고생이더군요…^^


5. 마지막으로 게임 종료 버튼까지 구현에 성공, 프로그램에 추가시켰습니다.


비교하는 부분에서 숫자가 일치할 때 마다 int형 correct 변수를 1씩 증가시켜서, 뒤에 나오는 Case 문을 통해 각각의 경우를 알려 주는 식으로 만들어 보았습니다.

5. 시행착오

이번 레포트는 쉬울 듯 하면서도, 많은 시행 착오 때문에 많은 시간을 소모하게 되었습니다.

특히 로또 추첨 프로그램 만들기는 상당히 생각을 많이 하게 만들었습니다. 먼저 사용자에게 입력받는 텍스트 필드의 인터페이스를 어떻게 만들 것인가에 대해 생각을 했습니다.


[사진 설명] 텍스트 필드를 6개로 잘게 만들어서 입력 받기(좌), 하나의 텍스트 필드에서 6개의 숫자를 한꺼번에 입력 받기(우)

이렇게 2가지 방법이 생각났습니다. 가장 비쥬얼하게 만든다면 1~45의 45개 숫자를 모두 버튼으로 만들어서 숫자를 입력받도록 하면 어떨까 하는 생각을 해 봤지만, 지금 제 실력으로는 무리일 것 같아서 가장 무난해 보이는 6개의 텍스트 필드 입력 방식을 사용하기로 했습니다. (앞으로 버튼이 눌러진 상태와 보통 상태를 자유자재로 구사할 수 있고, 그에 따른 액션 리스너 사용을 마음대로 할 수 있도록 공부해 보고 싶습니다)

사용자가 입력한 6개의 숫자를 각 배열마다 저장하고, 그것들을 for 구문을 통해 이미 저장되어 있는 임의의 수(배열)와 비교해야 겠다는 생각은 금방 들었습니다. 하지만 이렇게 텍스트 필드로 받은 경우에, 저장된 숫자들 중에 같은 값들이 있을 때, 어떻게 필터링 할 것인가가 문제였습니다.


그래서 입력 받는 곳에서 for 반복문으로 입력 받은 숫자의 다음 숫자와 비교하는 식으로 검사를 해 보았습니다. 같은 숫자를 입력했다고 잘 잡아 내더군요. 하지만 배열의 +2, +3… 번째 요소와는 값을 비교하지 못하는 단점이 있어서, 이 부분은 i+2, i+3 과 같은 검사문을 뒤에 추가로 달아서 검사해 보니 같은 수를 잡아낼 수 있다는 것을 확인했습니다.


바로 수업 시간에 배웠던 try ~ catch 문으로 예외 상황을 error 없이 잡아낼 수 있더군요.


같은 방법으로 입력 범위(1~45)를 벗어난 크기의 글자도 체크할 수 있었습니다.


문자 입력 시 생기는 오류도 입력 범위에서 초과한 것으로 간주하고, try-catch 를 통해 잡아내는 방식으로 해결했습니다.


6. 게임 시행 과정 및 결과


[사진 설명] 생성된 숫자와 1개가 적중할 때


[사진 설명] 생성된 숫자와 2개(1,6)가 일치할 때


[사진 설명] 적중하는 숫자가 없을 때(보너스 숫자인 4를 잘 걸러낸 모습)


[사진 설명] 4개의 숫자가 일치해서, 4등이 나온 화면


[사진 설명] 6개의 숫자가 모두 일치해서, 1등이 나온 화면


[사진 설명] 3개의 숫자가 일치해서, 5등이 나온 화면


레포트 작성을 마치고

1. 작성 후기

윈도우 프로그래밍이 재미있었습니다.. 콘솔 프로그래밍은 수학적 개념이 중요하고 그것을 해결하면서 즐거움을 얻는다면 윈도우 프로그래밍은 실제로 키보드와 마우스를 통해 느끼는 것을 일반적인 프로그램처럼 만들어서 테스트 해 볼 수 있다는 것이 매우 흥미로웠습니다.

제 생각에는 이러한 윈도우 프로그래밍의 요소들은 내가 어떤 기능을 구현하고자 할 때, 이미 만들어 져 있는 것들을 잘 뽑아내어 사용하는 데 집중해야 할 것 같습니다. 많은 경험과 지식이 그것을 가능하게 하겠지요. 사용자 인터페이스, 내부 구조 등 다양한 요소들을 염두하고 작성하는 프로그램이라 그런지 쉽지 않은 도전이긴 했습니다.

예전에 읽었던 어떤 책에서 프로그래밍의 맛을 보기 위해서는 비쥬얼 베이직을 먼저 다루어 보는 것이 좋다고 쓰여 있었는데, 이제는 그 이유를 조금은 알 것 같습니다.

어릴 적부터 수학적 재능이 부족했지만 컴퓨터를 만지는 것을 즐겨서 지금까지 왔는데, 오래간만에 예전에 느꼈던 열정이 되살아나는 것 같아 기분이 좋았습니다.

고맙습니다.

2. 참고 자료

서적:

  • 명쾌한 JAVA 입문(영진닷컴)
  • 클릭하세요 JAVA 2 JDK 5.0(대림)
반응형
,