본문 바로가기
게임

랜덤 숫자를 맞추는 추측 게임

by note1328 2025. 8. 22.

Create With Whisk

이 게임은 1부터 64까지의 랜덤 숫자를 맞추는 추측 게임으로, 주역(周易)의 64괘를 힌트로 활용합니다. 코드는 Grok AI를 활용하여 작성하였습니다.

1. 임포트 부분

import tkinter as tk
from tkinter import messagebox
import random
  • tkinter as tk: GUI를 만들기 위한 표준 Python 라이브러리. 창, 버튼, 레이블 등의 위젯을 제공합니다.
  • from tkinter import messagebox: 메시지 박스(팝업 창)를 사용하기 위해 임포트. 예를 들어, 승리나 게임 오버 시 알림을 띄웁니다.
  • import random: 랜덤 숫자 생성을 위해 사용. 게임의 정답 숫자를 무작위로 선택합니다.

2. 클래스 정의: NumberMasterGUI

class NumberMasterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("숫자 마스터")
        self.root.geometry("400x300")
  • class NumberMasterGUI: 게임의 메인 클래스로, GUI 요소와 로직을 캡슐화합니다.
  • __init__(self, root): 생성자 메서드. root는 Tkinter의 최상위 창 객체입니다.
    • self.root.title("숫자 마스터"): 창 제목을 설정.
    • self.root.geometry("400x300"): 창 크기를 400x300 픽셀로 설정.

2.1. 주역 64괘 목록 초기화

        # 주역 64괘 목록 (1~64)
        self.gua_list = [
            "",  # index 0 비움
            "건위천(乾爲天)", "곤위지(坤爲地)", "수뢰둔(水雷屯)", "산수몽(山水蒙)",
            "수천수(水天需)", "천수송(天水訟)", "지수사(地水師)", "수지비(水地比)",
            "풍천소축(風天小畜)", "천택리(天澤履)", "지천태(地天泰)", "천지비(天地否)",
            "천화동인(天火同人)", "화천대유(火天大有)", "지산겸(地山謙)", "뇌지예(雷地豫)",
            "택뢰수(澤雷隨)", "산풍고(山風蠱)", "지택림(地澤臨)", "풍지관(風地觀)",
            "화뢰서합(火雷噬嗑)", "산화비(山火賁)", "산지박(山地剝)", "지뢰복(地雷復)",
            "천뢰무망(天雷無妄)", "산천대축(山天大畜)", "산뢰이(山雷頤)", "택풍대과(澤風大過)",
            "수수감(水水坎)", "화화이(火火離)", "택산함(澤山咸)", "뇌풍항(雷風恒)",
            "천산둔(天山遯)", "뇌천대장(雷天大壯)", "화지진(火地晉)", "지화명이(地火明夷)",
            "풍화가인(風火家人)", "화택규(火澤睽)", "수산건(水山蹇)", "뇌수해(雷水解)",
            "산택손(山澤損)", "풍뇌익(風雷益)", "택천쾌(澤天夬)", "천풍구(天風姤)",
            "택지취(澤地萃)", "지풍승(地風升)", "택수곤(澤水困)", "수풍정(水風井)",
            "택화혁(澤火革)", "화풍정(火風鼎)", "뇌뇌진(雷雷震)", "산산간(山山艮)",
            "풍산점(風山漸)", "뇌택귀매(雷澤歸妹)", "뇌화풍(雷火豐)", "화산여(火山旅)",
            "풍풍손(風風巽)", "택택태(澤澤兌)", "풍수환(風水渙)", "수택절(水澤節)",
            "풍택중부(風澤中孚)", "뇌산소과(雷山小過)", "수화기제(水火旣濟)", "화수미제(火水未濟)"
        ]

self.gua_list: 주역의 64괘를 문자열 리스트로 저장. 인덱스 1부터 64까지 매핑됩니다. (인덱스 0은 비워둠)

  • 이는 힌트나 정답 공개 시 사용되며, 숫자(예: 1)가 "건위천(乾爲天)" 같은 괘 이름에 대응합니다.    

2.2. 게임 변수 초기화

        # 게임 변수 초기화
        self.answer = random.randint(1, 64)
        self.attempts = 0
        self.max_attempts = 10
        self.hints_used = 0
        self.max_hints = 3

 

  • self.answer: 1~64 사이의 랜덤 정답 숫자 생성.
  • self.attempts: 현재 시도 횟수 (초기 0).
  • self.max_attempts: 최대 시도 횟수 (10회).
  • self.hints_used: 사용한 힌트 횟수 (초기 0).
  • self.max_hints: 최대 힌트 횟수 (3회).

2.3. UI 요소 생성

        # UI 요소 생성
        self.label = tk.Label(root, text="1부터 64 사이의 숫자를 맞춰보세요!\n(힌트: 3회 사용 가능)", font=("Arial", 12))
        self.label.pack(pady=10)
        
        self.entry = tk.Entry(root, width=10, font=("Arial", 14))
        self.entry.pack(pady=5)
        
        self.guess_button = tk.Button(root, text="Guess", command=self.guess_number)
        self.guess_button.pack(pady=5)
        
        self.hint_button = tk.Button(root, text="Hint", command=self.get_hint)
        self.hint_button.pack(pady=5)
        
        self.reveal_button = tk.Button(root, text="Reveal Answer", command=self.reveal_answer)
        self.reveal_button.pack(pady=5)
        
        self.exit_button = tk.Button(root, text="Exit", command=self.root.quit)
        self.exit_button.pack(pady=5)
        
        self.feedback = tk.Label(root, text="", font=("Arial", 12), fg="blue")
        self.feedback.pack(pady=10)
        
        self.attempts_label = tk.Label(root, text=f"시도 횟수: {self.attempts}/{self.max_attempts}", font=("Arial", 10))
        self.attempts_label.pack(pady=5)
        
        self.hints_label = tk.Label(root, text=f"힌트 남음: {self.max_hints - self.hints_used}", font=("Arial", 10))
        self.hints_label.pack(pady=5)