闲来无事,就把之前给学生讲到随机数知识点做的一个猜数字游戏案例。通过ai来加持增加了UI界面,然后给反馈了几次需求最终写出来了。打包好的成品EXE在文章底部下载即可(温馨提示:一定要把杀毒关闭掉,不然会误报)!!!
演示效果:
成品代码:
import tkinter as tk from tkinter import ttk, messagebox import random # 初始化窗口 root = tk.Tk() root.title("猜数字游戏") root.geometry("600x400") # 创建自适应布局 root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7), weight=1) root.grid_columnconfigure((0, 1, 2), weight=1) # 变量声明 min_var = tk.IntVar(value=1) # 最小值,默认为1 max_var = tk.IntVar(value=100) # 最大值,默认为100 guess_var = tk.IntVar() # 用户猜测的数字 target_number = random.randint(min_var.get(), max_var.get()) # 生成目标数字 result_label_text = tk.StringVar(value="请输入你的猜测") # 结果标签的文本 last_guess_text = tk.StringVar(value="上一次猜测: 无") # 上一次猜测的数字 # 定义猜数字函数 def check_guess(): global target_number guess = guess_var.get() # 检查猜测数字是否在设定范围内 if guess < min_var.get() or guess > max_var.get(): messagebox.showwarning("警告", f"请输入一个在{min_var.get()}到{max_var.get()}之间的数字") return last_guess_text.set(f"上一次猜测: {guess}") # 更新上一次猜测的数字显示 if guess < target_number: result_label_text.set("数字小了哟") elif guess > target_number: result_label_text.set("数字大了哟") else: result_label_text.set("恭喜你,猜中了") show_result_dialog() # 展示结果对话框 # 展示结果对话框 def show_result_dialog(): result = messagebox.askquestion("恭喜", "你猜对了数字!\n你想继续游戏吗?") if result == 'yes': reset_game() # 重新开始游戏 else: root.quit() # 退出游戏 # 重新开始游戏 def reset_game(): global target_number target_number = random.randint(min_var.get(), max_var.get()) result_label_text.set("请输入你的猜测") last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 # 设置最小值的输入框 min_label = ttk.Label(root, text="最小值", font=("Helvetica", 12)) min_label.grid(row=0, column=0, padx=20, pady=10, sticky="e") min_entry = ttk.Entry(root, textvariable=min_var, width=15) min_entry.grid(row=0, column=1, padx=20, pady=10) # 设置最大值的输入框 max_label = ttk.Label(root, text="最大值", font=("Helvetica", 12)) max_label.grid(row=1, column=0, padx=20, pady=10, sticky="e") max_entry = ttk.Entry(root, textvariable=max_var, width=15) max_entry.grid(row=1, column=1, padx=20, pady=10) # 设置用户输入猜测的框架 guess_frame = ttk.Frame(root) guess_frame.grid(row=2, column=0, columnspan=3, padx=20, pady=10) guess_label = ttk.Label(guess_frame, text="猜一个数字", font=("Helvetica", 12)) guess_label.pack(side=tk.LEFT, padx=5, pady=5) guess_entry = ttk.Entry(guess_frame, textvariable=guess_var, width=15) guess_entry.pack(side=tk.LEFT, padx=5, pady=5) # 创建猜数字按钮 guess_button = ttk.Button(root, text="猜数字", command=check_guess, width=30) guess_button.grid(row=3, column=0, columnspan=3, padx=20, pady=10) # 结果显示标签 result_label = ttk.Label(root, textvariable=result_label_text, font=("Helvetica", 16)) result_label.grid(row=4, column=0, columnspan=3, padx=20, pady=10) # 上一次猜测显示标签 last_guess_label = ttk.Label(root, textvariable=last_guess_text, font=("Helvetica", 14), borderwidth=2, relief="ridge") last_guess_label.grid(row=5, column=0, columnspan=3, padx=20, pady=10) # 设置重置范围的函数 def reset_range(): global target_number try: min_value = min_var.get() max_value = max_var.get() if min_value >= max_value: raise ValueError("最小值必须小于最大值") target_number = random.randint(min_value, max_value) result_label_text.set("请输入你的猜测") last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 messagebox.showinfo("成功", "范围已重置") except ValueError as e: messagebox.showerror("错误", str(e)) # 创建重置范围按钮 reset_button = ttk.Button(root, text="重置范围", command=reset_range, width=30) reset_button.grid(row=6, column=0, columnspan=3, padx=20, pady=10) # 运行主循环 root.mainloop()
代码注释版:
import tkinter as tk # 导入 tkinter 模块,用于创建图形用户界面 from tkinter import ttk, messagebox # 导入 ttk 组件和消息框 import random # 导入 random 模块,用于生成随机数 # 初始化窗口 root = tk.Tk() # 创建主窗口 root.title("猜数字游戏") # 设置窗口标题 root.geometry("600x400") # 设置窗口大小为600x400像素 # 创建自适应布局 root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7), weight=1) # 设置行的权重,使其自适应大小 root.grid_columnconfigure((0, 1, 2), weight=1) # 设置列的权重,使其自适应大小 # 变量声明 min_var = tk.IntVar(value=1) # 最小值,默认为1 max_var = tk.IntVar(value=100) # 最大值,默认为100 guess_var = tk.IntVar() # 用户猜测的数字 target_number = random.randint(min_var.get(), max_var.get()) # 生成在指定范围内的目标数字 result_label_text = tk.StringVar(value="请输入你的猜测") # 结果标签的文本,初始提示 last_guess_text = tk.StringVar(value="上一次猜测: 无") # 上一次猜测的数字,初始状态 # 设置最小值的输入框 min_label = ttk.Label(root, text="最小值", font=("Helvetica", 12)) # 创建最小值标签 min_label.grid(row=0, column=0, padx=20, pady=10, sticky="e") # 将标签放置在网格的特定位置 min_entry = ttk.Entry(root, textvariable=min_var, width=15) # 创建最小值输入框 min_entry.grid(row=0, column=1, padx=20, pady=10) # 将输入框放置在网格的特定位置 # 设置最大值的输入框 max_label = ttk.Label(root, text="最大值", font=("Helvetica", 12)) # 创建最大值标签 max_label.grid(row=1, column=0, padx=20, pady=10, sticky="e") # 将标签放置在网格的特定位置 max_entry = ttk.Entry(root, textvariable=max_var, width=15) # 创建最大值输入框 max_entry.grid(row=1, column=1, padx=20, pady=10) # 将输入框放置在网格的特定位置 # 设置用户输入猜测的框架 guess_frame = ttk.Frame(root) # 创建一个框架来容纳猜测相关的控件 guess_frame.grid(row=2, column=0, columnspan=3, padx=20, pady=10) # 将框架放置在网格的特定位置 guess_label = ttk.Label(guess_frame, text="猜一个数字", font=("Helvetica", 12)) # 创建猜测标签 guess_label.pack(side=tk.LEFT, padx=5, pady=5) # 将标签放置在框架的左侧 guess_entry = ttk.Entry(guess_frame, textvariable=guess_var, width=15) # 创建用户输入的猜测输入框 guess_entry.pack(side=tk.LEFT, padx=5, pady=5) # 将输入框放置在框架的左侧 # 创建猜数字按钮 guess_button = ttk.Button(root, text="猜数字", command=check_guess, width=30) # 创建按钮并绑定猜测函数 guess_button.grid(row=3, column=0, columnspan=3, padx=20, pady=10) # 将按钮放置在网格的特定位置 # 结果显示标签 result_label = ttk.Label(root, textvariable=result_label_text, font=("Helvetica", 16)) # 创建结果标签 result_label.grid(row=4, column=0, columnspan=3, padx=20, pady=10) # 将标签放置在网格的特定位置 # 上一次猜测显示标签 last_guess_label = ttk.Label(root, textvariable=last_guess_text, font=("Helvetica", 14), borderwidth=2, relief="ridge") # 创建上一次猜测的标签 last_guess_label.grid(row=5, column=0, columnspan=3, padx=20, pady=10) # 将标签放置在网格的特定位置 # 猜数字函数 def check_guess(): global target_number # 使用全局变量 target_number guess = guess_var.get() # 获取用户的猜测 # 检查猜测数字是否在设定范围内 if guess < min_var.get() or guess > max_var.get(): messagebox.showwarning("警告", f"请输入一个在{min_var.get()}到{max_var.get()}之间的数字") # 弹出警告框提示 return last_guess_text.set(f"上一次猜测: {guess}") # 更新上一次猜测的数字显示 if guess < target_number: result_label_text.set("数字小了哟") # 提示用户数字小了 elif guess > target_number: result_label_text.set("数字大了哟") # 提示用户数字大了 else: result_label_text.set("恭喜你,猜中了") # 提示用户猜中 show_result_dialog() # 展示结果对话框 # 展示结果对话框 def show_result_dialog(): result = messagebox.askquestion("恭喜", "你猜对了数字!\n你想继续游戏吗?") # 弹出选择框 if result == 'yes': reset_game() # 继续游戏 else: root.quit() # 退出游戏 # 重新开始游戏 def reset_game(): global target_number # 使用全局变量 target_number target_number = random.randint(min_var.get(), max_var.get()) # 生成新的目标数字 result_label_text.set("请输入你的猜测") # 提示用户输入猜测 last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 # 设置重置范围的函数 def reset_range(): global target_number # 使用全局变量 target_number try: min_value = min_var.get() # 获取最小值 max_value = max_var.get() # 获取最大值 if min_value >= max_value: raise ValueError("最小值必须小于最大值") # 检查最小值是否小于最大值 target_number = random.randint(min_value, max_value) # 重新生成目标数字 result_label_text.set("请输入你的猜测") # 提示用户输入猜测 last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 messagebox.showinfo("成功", "范围已重置") # 弹出提示框 except ValueError as e: messagebox.showerror("错误", str(e)) # 弹出错误提示框 # 创建重置范围按钮 reset_button = ttk.Button(root, text="重置范围", command=reset_range, width=30) # 创建重置按钮 reset_button.grid(row=6, column=0, columnspan=3, padx=20, pady=10) # 将按钮放置在网格的特定位置 # 运行主循环 root.mainloop() # 启动事件循环,使窗口保持开放