今天我们使用Tkinter构建一个猜数字游戏。我们将采用面向对象与模块化的设计方法,将界面、逻辑与控制分离,以实现清晰的结构、良好的代码复用性,并使程序更易于维护与扩展。
我们将创建一个简单的猜数字游戏,使用Tkinter,并采用面向对象和模块化的方式。
main.py # 主程序入口,创建主窗口和控制器
game_page.py # 游戏页面
welcome_page.py # 欢迎页面
result_page.py # 结果显示页面
a.欢迎页面:用户点击开始按钮进入游戏页面。
b.游戏页面:用户输入一个数字,点击猜测按钮。
c.结果页面:显示猜测结果(太大、太小或正确),并提供返回游戏页面或欢迎页面的按钮。
我们将使用面向对象的方式,每个页面都是一个类,继承自Frame,便于在同一个窗口中切换。
注意:为了简化,我们只用一个窗口,通过切换不同的Frame来实现分页效果。
guess_number/
├── main.py # 主程序入口
├── welcome_page.py # 欢迎页面
├── game_page.py # 游戏页面
└── result_page.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()
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)
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()
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" "再试一次吧!" )
(1)分页设计:
欢迎页面:显示游戏规则和开始按钮
游戏页面:用户输入猜测数字并得到反馈
结果页面:显示游戏结果并提供选项
(2)面向对象编程:
GuessNumberApp类:主应用程序类,管理页面切换
WelcomePage类:欢迎页面类
GamePage类:游戏逻辑实现类
ResultPage类:结果显示类
(3)功能特点:
随机生成1-100之间的数字
用户有10次猜测机会
每次猜测后提供反馈(太大/太小)
游戏结束后显示结果和统计信息
支持重新开始或返回主菜单
(4)用户交互:
友好的界面设计
支持回车键提交猜测
清晰的游戏状态反馈
简洁的导航按钮
今日学习完毕,课后作业:
大家可以跟进上面的小程序,利用前面所学的东西,继续优化改进。希望大家能通过这些自制小程序,对python越来越喜欢。明天开始,我们继续学习新的python知识。