想学习更多知识,请加我公众号【Python学在坚持】
这段代码实现了一个简单的成语接龙小游戏,整体功能完整,但存在一些小问题和可优化的地方。以下是对代码的分析和改进建议:
存在的问题
import
语句格式错误,缺少空格submit_btn
被重复定义check_idiom
方法中有一行无效代码self.idiom_entry = self.idiom_entry
- 成语判断逻辑可以优化(如不区分大小写)
- 缺少游戏结束的判断逻辑
优化后的代码
import tkinter as tk
from tkinter import messagebox, ttk
import random
import json
import osclass IdiomGame:def __init__(self, root):self.root = rootself.root.title("成语接龙小游戏")self.root.geometry("600x500")# 加载成语库self.load_idioms()# 游戏状态self.used_idioms = []self.current_char = Noneself.score = 0# 创建UIself.create_widgets()# 开始新游戏self.new_game()def load_idioms(self):# 尝试从本地文件加载成语库if os.path.exists("idioms.json"):try:with open("idioms.json", "r", encoding="utf-8") as f:self.idioms = json.load(f)except:# 处理文件读取错误self.idioms = self.get_default_idioms()else:# 如果文件不存在,使用一个基础的成语库self.idioms = self.get_default_idioms()# 保存成语库到本地文件self.save_idioms()def get_default_idioms(self):"""返回默认成语库"""return ["一心一意", "画龙点睛", "惊弓之鸟", "鸟语花香", "香车宝马","马到成功", "功成名就", "就事论事", "事倍功半", "半途而废","废寝忘食", "食古不化", "化为乌有", "有目共睹", "睹物思人","人山人海", "海阔天空", "空穴来风", "风花雪月", "月黑风高","高瞻远瞩", "煮豆燃萁", "奇珍异宝", "饱经风霜", "双管齐下","下笔成章", "张冠李戴", "戴罪立功", "功败垂成", "成人之美"]def save_idioms(self):"""保存成语库到文件"""try:with open("idioms.json", "w", encoding="utf-8") as f:json.dump(self.idioms, f, ensure_ascii=False, indent=2)except Exception as e:messagebox.showerror("错误", f"保存成语库失败: {str(e)}")def create_widgets(self):# 标题self.title_label = tk.Label(self.root, text="成语接龙", font=("楷体", 24, "bold"))self.title_label.pack(pady=10)# 当前接龙字self.char_frame = tk.Frame(self.root)self.char_frame.pack(pady=10)tk.Label(self.char_frame, text="接龙字:", font=("宋体", 14)).pack(side=tk.LEFT)self.current_char_label = tk.Label(self.char_frame, text="", font=("宋体", 14, "bold"), fg="red")self.current_char_label.pack(side=tk.LEFT, padx=5)# 分数显示self.score_label = tk.Label(self.root, text=f"分数: 0", font=("宋体", 12))self.score_label.pack()# 输入框和提交按钮self.input_frame = tk.Frame(self.root)self.input_frame.pack(pady=20)tk.Label(self.input_frame, text="输入成语:", font=("宋体", 12)).pack(side=tk.LEFT)self.idiom_entry = tk.Entry(self.input_frame, font=("宋体", 12), width=20)self.idiom_entry.pack(side=tk.LEFT, padx=5)self.idiom_entry.bind("<Return>", lambda event: self.check_idiom())self.submit_btn = tk.Button(self.input_frame, text="提交", command=self.check_idiom)self.submit_btn.pack(side=tk.LEFT)# 提示按钮self.hint_btn = tk.Button(self.root, text="提示", command=self.give_hint)self.hint_btn.pack(pady=5)# 新游戏按钮self.new_game_btn = tk.Button(self.root, text="新游戏", command=self.new_game)self.new_game_btn.pack(pady=5)# 已用成语列表tk.Label(self.root, text="已用成语:", font=("宋体", 12)).pack(pady=5)self.used_idioms_listbox = tk.Listbox(self.root, height=10, width=50, font=("宋体", 12))self.used_idioms_listbox.pack(pady=5)# 添加滚动条scrollbar = ttk.Scrollbar(self.root, orient="vertical", command=self.used_idioms_listbox.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.used_idioms_listbox.config(yscrollcommand=scrollbar.set)def new_game(self):# 重置游戏状态self.used_idioms = []self.score = 0self.score_label.config(text=f"分数: {self.score}")self.used_idioms_listbox.delete(0, tk.END)# 随机选择一个起始成语start_idiom = random.choice(self.idioms)self.used_idioms.append(start_idiom)self.current_char = start_idiom[-1]self.current_char_label.config(text=self.current_char)self.used_idioms_listbox.insert(tk.END, start_idiom)# 聚焦到输入框self.idiom_entry.focus_set()def check_idiom(self):user_input = self.idiom_entry.get().strip()if not user_input:messagebox.showwarning("提示", "请输入一个成语!")returnif len(user_input) != 4:messagebox.showwarning("提示", "成语应该是4个字!")self.idiom_entry.delete(0, tk.END)return# 检查是否以正确的字开头(不区分大小写)if user_input[0].lower() != self.current_char.lower():messagebox.showwarning("提示", f"成语应该以'{self.current_char}'开头!")self.idiom_entry.delete(0, tk.END)return# 检查是否是成语normalized_input = user_input.lower()is_valid = any(idiom.lower() == normalized_input for idiom in self.idioms)if not is_valid:if messagebox.askyesno("提示", "这不是一个常见成语,确定要使用吗?"):# 添加到成语库self.idioms.append(user_input)self.save_idioms()else:self.idiom_entry.delete(0, tk.END)return# 检查是否已经使用过(不区分大小写)if any(idiom.lower() == normalized_input for idiom in self.used_idioms):messagebox.showwarning("提示", "这个成语已经使用过了!")self.idiom_entry.delete(0, tk.END)return# 有效成语self.used_idioms.append(user_input)self.current_char = user_input[-1]self.current_char_label.config(text=self.current_char)self.used_idioms_listbox.insert(tk.END, user_input)self.used_idioms_listbox.see(tk.END) # 滚动到最后一项# 更新分数self.score += 1self.score_label.config(text=f"分数: {self.score}")# 清空输入框self.idiom_entry.delete(0, tk.END)# 检查是否还有可用成语self.check_game_end()def check_game_end(self):"""检查游戏是否结束(没有可用成语)"""possible_idioms = [idiom for idiom in self.idioms if idiom[0].lower() == self.current_char.lower() and idiom not in self.used_idioms]if not possible_idioms:if messagebox.askyesno("游戏结束", f"恭喜你赢了!最终得分: {self.score}\n是否开始新游戏?"):self.new_game()else:self.root.quit()def give_hint(self):if not self.current_char:messagebox.showinfo("提示", "游戏尚未开始!")return# 找出所有以当前字开头且未使用过的成语possible_idioms = [idiom for idiom in self.idioms if idiom[0].lower() == self.current_char.lower() and idiom not in self.used_idioms]if possible_idioms:hint = random.choice(possible_idioms)messagebox.showinfo("提示", f"你可以试试: {hint}")else:messagebox.showinfo("提示", "没有找到可用的成语,你可能赢了!")if __name__ == "__main__":root = tk.Tk()game = IdiomGame(root)root.mainloop()
主要改进点
- 修复了
import
语句格式错误 - 移除了重复定义的
submit_btn
- 删除了无效代码
self.idiom_entry = self.idiom_entry
- 增加了成语库加载和保存的异常处理
- 优化了成语判断逻辑,使其不区分大小写
- 增加了
check_game_end
方法,实现游戏结束判断 - 将默认成语库提取为单独方法,使代码结构更清晰
- 改进了成语验证方式,更准确地判断用户输入是否为有效成语
这些改进使游戏更加健壮,用户体验也得到了提升。