当前位置:首页>python>python小程序之Tkinter猜数字游戏

python小程序之Tkinter猜数字游戏

  • 2026-09-08 16:18:59
python小程序之Tkinter猜数字游戏

3.26

Tkinter猜数字游戏

今天我们使用Tkinter构建一个猜数字游戏。我们将采用面向对象与模块化的设计方法,将界面、逻辑与控制分离,以实现清晰的结构、良好的代码复用性,并使程序更易于维护与扩展。

1

构思

我们将创建一个简单的猜数字游戏,使用Tkinter,并采用面向对象和模块化的方式。

(1)文件结构

main.py       # 主程序入口,创建主窗口和控制器

game_page.py     # 游戏页面

welcome_page.py  # 欢迎页面

result_page.py   # 结果显示页面

(2)游戏流程

a.欢迎页面:用户点击开始按钮进入游戏页面。

b.游戏页面:用户输入一个数字,点击猜测按钮。

c.结果页面:显示猜测结果(太大、太小或正确),并提供返回游戏页面或欢迎页面的按钮。

我们将使用面向对象的方式,每个页面都是一个类,继承自Frame,便于在同一个窗口中切换。

注意:为了简化,我们只用一个窗口,通过切换不同的Frame来实现分页效果。

2

文件结构

guess_number/

├── main.py          # 主程序入口

├── welcome_page.py  # 欢迎页面 

├── game_page.py     # 游戏页面 

└── result_page.py   # 结果显示页面

3

代码实现

(1)main.py(主程序)

import tkinter as tkfrom welcome_page import WelcomePagefrom game_page import GamePagefrom result_page import ResultPageclass GuessNumberApp(tk.Tk):    def __init__(self):        super().__init__()        self.title("猜数字游戏")        self.geometry("400x300")        self.resizable(False, False)        # 创建容器框架        container = tk.Frame(self)        container.pack(side="top", fill="both", expand=True)        container.grid_rowconfigure(0, weight=1)        container.grid_columnconfigure(0, weight=1)        # 存储所有页面        self.pages = {}        # 初始化所有页面        for PageClass in (WelcomePage, GamePage, ResultPage):            page_name = PageClass.__name__            page = PageClass(parent=container, controller=self)            self.pages[page_name] = page            page.grid(row=0, column=0, sticky="nsew")        # 显示欢迎页面        self.show_page("WelcomePage")    def show_page(self, page_name):        """显示指定页面"""        page = self.pages[page_name]        page.tkraise()    def start_game(self):        """开始新游戏"""        self.pages["GamePage"].reset_game()        self.show_page("GamePage")    def show_result(self, attempts, is_win):        """显示结果页面"""        self.pages["ResultPage"].set_result(attempts, is_win)        self.show_page("ResultPage")if __name__ == "__main__":    app = GuessNumberApp()    app.mainloop()

(2)welcome_page.py(欢迎页面)

import tkinter as tkclass WelcomePage(tk.Frame):    def __init__(self, parent, controller):        super().__init__(parent)        self.controller = controller        self.create_widgets()    def create_widgets(self):        # 标题        title_label = tk.Label(            self,            text="欢迎来到猜数字游戏",            font=("Arial", 20, "bold"),            fg="#333333"        )        title_label.pack(pady=30)        # 游戏说明        instructions = tk.Label(            self,            text="游戏规则:\n\n"                 "1. 系统会随机生成一个1-100之间的数字\n"                 "2. 你有10次机会猜出这个数字\n"                 "3. 每次猜测后,系统会提示你猜的数字是太大还是太小",            font=("Arial", 12),            justify="left"        )        instructions.pack(pady=10)        # 开始按钮        start_button = tk.Button(            self,            text="开始游戏",            font=("Arial", 14, "bold"),            bg="#4CAF50",            fg="white",            padx=20,            pady=10,            command=lambda: self.controller.start_game()        )        start_button.pack(pady=30)

(3)game_page.py(游戏页面)

import tkinter as tkimport randomclass GamePage(tk.Frame):    def __init__(self, parent, controller):        super().__init__(parent)        self.controller = controller        # 游戏变量        self.secret_number = 0        self.attempts = 0        self.max_attempts = 10        self.create_widgets()        self.reset_game()    def create_widgets(self):        # 标题        self.title_label = tk.Label(            self,            text="猜数字游戏",            font=("Arial", 18, "bold"),            fg="#333333"        )        self.title_label.pack(pady=10)        # 提示标签        self.hint_label = tk.Label(            self,            text="请输入1-100之间的数字:",            font=("Arial", 12)        )        self.hint_label.pack(pady=5)        # 输入框        self.entry = tk.Entry(            self,            font=("Arial", 14),            width=10,            justify="center"        )        self.entry.pack(pady=5)        self.entry.bind("<Return>", self.check_guess)  # 绑定回车键        # 猜测按钮        self.guess_button = tk.Button(            self,            text="猜",            font=("Arial", 12, "bold"),            bg="#2196F3",            fg="white",            padx=15,            pady=5,            command=self.check_guess        )        self.guess_button.pack(pady=10)        # 结果标签        self.result_label = tk.Label(            self,            text="",            font=("Arial", 12),            fg="#FF5722"        )        self.result_label.pack(pady=5)        # 剩余次数        self.attempts_label = tk.Label(            self,            text=f"剩余次数: {self.max_attempts}",            font=("Arial", 10)        )        self.attempts_label.pack(pady=5)        # 返回按钮        back_button = tk.Button(            self,            text="返回主菜单",            font=("Arial", 10),            bg="#9E9E9E",            fg="white",            command=lambda: self.controller.show_page("WelcomePage")        )        back_button.pack(pady=10)    def reset_game(self):        """重置游戏状态"""        self.secret_number = random.randint(1, 100)        self.attempts = 0        self.entry.delete(0, tk.END)        self.result_label.config(text="")        self.attempts_label.config(text=f"剩余次数: {self.max_attempts}")        self.entry.focus_set()    def check_guess(self, event=None):        """检查用户猜测的数字"""        try:            guess = int(self.entry.get())            if guess < 1or guess > 100:                self.result_label.config(text="请输入1-100之间的数字!")                return        except ValueError:            self.result_label.config(text="请输入有效的数字!")            return        self.attempts += 1        remaining = self.max_attempts - self.attempts        self.attempts_label.config(text=f"剩余次数: {remaining}")        if guess == self.secret_number:            self.controller.show_result(self.attempts, True)        elif remaining <= 0:            self.controller.show_result(self.attempts, False)        elif guess < self.secret_number:            self.result_label.config(text=f"太小了!再试一次")        else:            self.result_label.config(text=f"太大了!再试一次")        self.entry.delete(0, tk.END)        self.entry.focus_set()

(4)result_page.py(结果页面)

import tkinter as tkclass ResultPage(tk.Frame):    def __init__(self, parent, controller):        super().__init__(parent)        self.controller = controller        self.create_widgets()    def create_widgets(self):        # 结果标题        self.result_title = tk.Label(            self,            text="",            font=("Arial", 18, "bold"),            fg="#333333"        )        self.result_title.pack(pady=20)        # 结果详情        self.result_details = tk.Label(            self,            text="",            font=("Arial", 12),            justify="center"        )        self.result_details.pack(pady=10)        # 按钮框架        button_frame = tk.Frame(self)        button_frame.pack(pady=20)        # 再玩一次按钮        play_again_button = tk.Button(            button_frame,            text="再玩一次",            font=("Arial", 12, "bold"),            bg="#4CAF50",            fg="white",            padx=15,            pady=5,            command=lambda: self.controller.start_game()        )        play_again_button.pack(side="left", padx=10)        # 返回主菜单按钮        menu_button = tk.Button(            button_frame,            text="返回主菜单",            font=("Arial", 12),            bg="#9E9E9E",            fg="white",            padx=15,            pady=5,            command=lambda: self.controller.show_page("WelcomePage")        )        menu_button.pack(side="left", padx=10)    def set_result(self, attempts, is_win):        """设置结果信息"""        if is_win:            self.result_title.config(text="恭喜你赢了!", fg="#4CAF50")            self.result_details.config(                text=f"你用了 {attempts} 次猜中了数字!\n\n"                     "真是太棒了!"            )        else:            self.result_title.config(text="游戏结束", fg="#F44336")            self.result_details.config(                text=f"很遗憾,你没有在 {attempts} 次内猜中数字。\n\n"                     "再试一次吧!"            )

4

功能说明

(1)分页设计:

欢迎页面:显示游戏规则和开始按钮

游戏页面:用户输入猜测数字并得到反馈

结果页面:显示游戏结果并提供选项

(2)面向对象编程:

GuessNumberApp类:主应用程序类,管理页面切换

WelcomePage类:欢迎页面类

GamePage类:游戏逻辑实现类

ResultPage类:结果显示类

(3)功能特点:

随机生成1-100之间的数字

用户有10次猜测机会

每次猜测后提供反馈(太大/太小)

游戏结束后显示结果和统计信息

支持重新开始或返回主菜单

(4)用户交互:

友好的界面设计

支持回车键提交猜测

清晰的游戏状态反馈

简洁的导航按钮

5

运行结果

今日学习完毕,课后作业:

大家可以跟进上面的小程序,利用前面所学的东西,继续优化改进。希望大家能通过这些自制小程序,对python越来越喜欢。明天开始,我们继续学习新的python知识。

最新文章

随机文章