您的位置首页  散文评论

恶魔的英文_恶魔的英文单词

python写一个魔鬼般的单词挑战游戏!你敢挑战自己吗?

恶魔的英文_恶魔的英文单词

 

python写一个魔鬼般的单词挑战游戏!你敢挑战自己吗?

引言我们在前面的两篇和小伙伴们一起学习了python操作SQLite数据库,而且我们得到了一个数据库,在接下来的那一篇中,我们又尝试着做了一个单词连连看的游戏以下是前两篇的链接:Python与SQLite3的快乐邂逅:轻松搞定数据库操作。

快乐学单词:Python GUI英语单词配对乐翻天那今天,我们将尝试着将这两个程序合并起来用,从数据库中随机抽取10个单词,然后进行连连看。程序效果主程序的界面:

1,在这个Entry框里,输入数字,则按长度从数据库获取,如果输出是的字母或者字母组合,则按单词成份查找,如果输入的是汉字,则获取有这个中文意思的单词2,单词连连看容易版的调用按钮3,单词连连看魔鬼难度的调用按钮

4 & 5 查询的结果排序方式6 & 7 表头这里点击也可以改变排序方式简单版的连连看:

根据单词找到与其匹配的中文意思魔鬼版单词连连看:单词被拆分成两部分了,难度系统飙升!

代码以下是代码,不再过多解析,代码说明都在注释中:主程序main.pyimport tkinter as tkfrom tkinter import ttkimport sqlite3from ttkbootstrap

import *from word_link_game import open_word_link_gamefrom open_word_link_game_hard import open_word_link_game_hard

import reclassDatabaseManager:def__init__(self): self.conn = sqlite3.connect(words.db) self.cursor = self.conn.cursor()

def__enter__(self):return self.cursordef__exit__(self, exc_type, exc_val, exc_tb): self.conn.commit()

self.conn.close()deffind_words_containing(word):# 根据用户输入的单词查找包含该单词的所有单词if word.isdigit(): # 检查是否为数字

with DatabaseManager() as cursor: cursor.execute("SELECT * FROM words_from_excel WHERE LENGTH(word) = ?"

, (int(word),))return cursor.fetchall()elif re.match(r^[a-zA-Z]+$, word): # 检查是否为英文字母with DatabaseManager()

as cursor: cursor.execute("SELECT * FROM words_from_excel WHERE word LIKE ?", (% + word +

%,))return cursor.fetchall()elif re.search(r[\u4e00-\u9fff], word): # 检查是否包含汉字with DatabaseManager()

as cursor: cursor.execute("SELECT * FROM words_from_excel WHERE meaning LIKE ?", (% + word +

%,))return cursor.fetchall()else:returnNone# 返回空,表示输入不正确defdisplay_results():# 清空树形控件 tree.delete(*tree.get_children())

# 获取用户输入的单词 search_word = entry.get()# 查询包含指定单词的所有单词 words_containing = find_words_containing(search_word)

# 按长度排序if sort_by.get() == Frequency: words_containing_sorted = sorted(words_containing, key=lambda

x: x[0], reverse=True)else: words_containing_sorted = sorted(words_containing, key=lambda x: len(x[

1]))# 在树形控件中显示结果for idx, word_info in enumerate(words_containing_sorted): tags = (even,) if idx %

2 == 0else (odd,) tree.insert(, end, values=word_info, tags=tags)# 提示用户查询到的单词数量 result_count_label.config(text=

f"Total {len(words_containing)} words found.")defsort_tree_column(col):# 按列排序树形控件中的内容 sort_by.set(col)

display_results()# 创建Tkinter窗口root = Window(themename="lumen", size=(1200, 600))root.resizable(False

,False)root.title("Word Search")# 创建主题风格style = Style(theme=flatly) # 使用flatly风格# 添加搜索框和按钮frame = Frame(root)

frame.pack(side=tk.TOP, fill=tk.X, padx=10, pady=10)entry = Entry(frame, width=30)entry.pack(side=tk.LEFT, padx=

5, pady=5)button = Button(frame, text="Search", command=display_results, bootstyle=INFO)button.pack(side=tk.LEFT, padx=

5, pady=5)# 添加按钮以启动单词连连看游戏link_game_button = Button(frame, text="单词连连看(Easy)", command=open_word_link_game, bootstyle=SUCCESS)

link_game_button.pack(side=tk.LEFT, padx=5, pady=5)# 在主程序中添加“困难模式单词连连接”按钮button_hard_mode = Button(frame, text=

"单词连连看(HARD)", command=open_word_link_game_hard, bootstyle=WARNING)button_hard_mode.pack(side=tk.LEFT, padx=

5, pady=5)# 回车键绑定到查询按钮的事件处理函数root.bind(, lambda event: display_results())# 创建样式对象style = Style()

style.configure("Treeview", font=("JetBrains Mono", 10))# 添加排序选择sort_by = tk.StringVar()sort_by.set(Word

)sort_radio_frame = Frame(root)sort_radio_frame.pack(pady=5)sort_label = Label(sort_radio_frame, text=

"Sort by:", font=("JetBrains Mono", 10))sort_label.grid(row=0, column=0)freq_radio = tk.Radiobutton(sort_radio_frame, text=

"Frequency", variable=sort_by, value="Frequency", command=

lambda: sort_tree_column("Frequency"), font=("JetBrains Mono", 10))freq_radio.grid(row=

0, column=1, padx=5)word_radio = tk.Radiobutton(sort_radio_frame, text="Word Length", variable=sort_by, value=

"Word", command=lambda: sort_tree_column("Word"), font=(

"JetBrains Mono", 10))word_radio.grid(row=0, column=2, padx=5)# 创建树形控件tree_frame = Frame(root)tree_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=

True, padx=10, pady=10)# 创建样式对象style = Style()style.configure("Treeview", font=("JetBrains Mono", 10))

tree = Treeview(tree_frame, columns=(Frequency, Word, Pronunciation, Meaning, Sentence), show=headings

, style="Treeview")tree.heading(Frequency, text=Frequency, command=lambda: sort_tree_column("Frequency"

))tree.heading(Word, text=Word, command=lambda: sort_tree_column("Word"))tree.heading(Pronunciation, text=

Pronunciation)tree.heading(Meaning, text=Meaning)tree.heading(Sentence, text=Sentence)# 设置列宽tree.column(

"Frequency", width=10)tree.column("Word", width=40)tree.column("Pronunciation", width=40)tree.column(

"Meaning", width=100)tree.column("Sentence", width=600)tree.pack(side=LEFT, fill=BOTH, expand=True)# 添加滚动条

scrollbar = Scrollbar(tree_frame, orient=tk.VERTICAL, command=tree.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

tree.configure(yscrollcommand=scrollbar.set)# 回车键绑定到查询按钮的事件处理函数root.bind(, lambda event: display_results())

# 为奇数行和偶数行添加不同的底色tree.tag_configure(odd, background=#00e0e0)tree.tag_configure(even, background=white

)# 表头上色style.configure(Treeview.Heading, background=green, foreground=white, font=("JetBrains Mono",

12))# 显示查询结果数量result_count_label = Label(root, text="", font=("JetBrains Mono", 10), bootstyle=INFO)result_count_label.pack(side=LEFT)

# 运行Tkinter事件循环root.mainloop()word_link_game.pyimport tkinter as tkimport randomimport sqlite3from ttkbootstrap import *

classWordLink:def__init__(self, master):""" WordLink类的构造函数,初始化游戏界面和数据 """self.master = master。

self.master.title("WordLink") # 设置窗口标题self.word_list = [] # 存储用户点击的单词按钮self.matched_count = 0# 匹配成功的次数

# 创建游戏界面self.create_widgets()# 从数据库中加载单词数据self.load_words_from_database()defload_words_from_database(

self):""" 从数据库中加载单词数据,并排除只有一个字母的单词 """ conn = sqlite3.connect(words.db) cursor = conn.cursor()。

# 从数据库中随机选择10个单词,排除只有一个字母的单词 cursor.execute("SELECT * FROM words_from_excel WHERE length(word) > 1 ORDER BY RANDOM() LIMIT 10"

) words = cursor.fetchall() conn.close()# 将单词数据存储为字典,键为单词,值为含义self.words = {word[1]: word[

3] for word in words}# 在界面上显示单词和含义self.display_words()defcreate_widgets(self):""" 创建游戏界面的各个部件 "

""# 创建标题标签self.lb_title = tk.Label(self.master, text="WordLink", font=("JetBrains Mono", 15,bold))self

.lb_title.pack()# 创建显示匹配完成次数的标签self.lb_matched_count = tk.Label(self.master, text=f"匹配完成:{self.matched_count}"

, font=("Arial", 12))self.lb_matched_count.pack()# 创建显示匹配状态的标签self.status_label = tk.Label(self.master, text=

"", font=("Arial", 12))self.status_label.pack(side=tk.BOTTOM)# 创建单词按钮的框架self.words_frame = tk.Frame(self

.master)self.words_frame.pack(side=tk.LEFT)# 创建含义按钮的框架self.meanings_frame = tk.Frame(self.master)self

.meanings_frame.pack(side=tk.RIGHT)defdisplay_words(self):""" 在界面上显示单词和含义的按钮 """ words_list = list(。

self.words.keys()) # 单词列表 meanings_list = list(self.words.values()) # 含义列表 random.shuffle(meanings_list)

# 随机打乱含义列表# 创建单词和含义的按钮,并绑定点击事件for i in range(10): word_button = tk.Button(self.words_frame, text=words_list[i], width=

20, font=("JetBrains Mono", 12),anchor=w) word_button.grid(row=i, column=0, padx=10, pady=

5) word_button.bind("", self.button_click) # 绑定点击事件 meaning_button = tk.Button(

self.meanings_frame, text=meanings_list[i], width=80, font=("楷体", 16),anchor=w) meaning_button.grid(row=i, column=

1, padx=10, pady=5) meaning_button.bind("", self.button_click) # 绑定点击事件defbutton_click

(self, event):""" 处理按钮点击事件,判断是否匹配成功,并更新界面和数据 """# 获取点击按钮的文本 text = event.widget.cget(。

"text")# 如果点击的是word_buttonif event.widget.master == self.words_frame:if len(self.word_list) < 2:self.word_list.append(event.widget)

# 如果点击的是meaning_button elif event.widget.master == self.meanings_frame and len(self.word_list) ==

1:self.word_list.append(event.widget)if len(self.word_list) == 2: word_text = self.word_list[

0].cget("text") # 获取单词按钮的文本 meaning_text = self.word_list[1].cget("text") # 获取含义按钮的文本# 判断是否匹配成功

ifself.words[word_text] == meaning_text:self.matched_count += 1self.lb_matched_count.config(text=f"匹配完成:{self.matched_count}"

)self.word_list[0].config(state=tk.DISABLED) # 禁用匹配成功的单词按钮self.word_list[1].config(state=tk.DISABLED)

# 禁用匹配成功的含义按钮self.status_label.config(text="★匹配成功★", fg="white", bg="green")else:self.status_label.config(text=

"☆匹配错误☆", fg="white", bg="red")self.word_list = [] # 清空列表# 检查匹配完成的按钮并移除for button inself.words_frame.winfo_children():

if button.cget("state") == "disabled": button.grid_forget()for button inself.meanings_frame.winfo_children():

if button.cget("state") == "disabled": button.grid_forget()defopen_word_link_game()

: word_link = Window(themename="lumen") # 创建窗口 word_link.resizable(False,False) app = WordLink(word_link)

# 创建WordLink游戏实例 word_link.mainloop() # 运行游戏界面的事件循环open_word_link_game_hard.pyimport tkinter as tk

import randomimport sqlite3from ttkbootstrap import *classWordLinkHard:def__init__(self, master):""" WordLinkHard类的构造函数,初始化游戏界面和数据。

""" self.master = master self.master.title("WordLink") # 设置窗口标题 self.word_list = []

# 存储用户点击的单词按钮 self.matched_count = 0# 匹配成功的次数# 创建游戏界面 self.create_widgets()# 从数据库中加载单词数据

self.load_words_from_database()defload_words_from_database(self):""" 从数据库中加载单词数据,并排除只有一个字母的单词。

""" conn = sqlite3.connect(words.db) cursor = conn.cursor()# 从数据库中随机选择10个单词,排除只有一个字母的单词

cursor.execute("SELECT * FROM words_from_excel WHERE length(word) > 1 ORDER BY RANDOM() LIMIT 10"

) words = cursor.fetchall() conn.close()# 将单词数据存储为字典,键为单词,值为含义 self.words = {word[

1]: word[3] for word in words}# 在界面上显示单词和含义 self.display_words()defcreate_widgets(self):""" 创建游戏界面的各个部件。

"""# 创建标题标签 self.lb_title = tk.Label(self.master, text="WordLink", font=("JetBrains Mono"

, 15,bold)) self.lb_title.pack()# 创建显示匹配完成次数的标签 self.lb_matched_count = tk.Label(self.master, text=

f"匹配完成:{self.matched_count}", font=("Arial", 12)) self.lb_matched_count.pack()# 创建显示匹配状态的标签 self.status_label = tk.Label(self.master, text=

"", font=("Arial", 12)) self.status_label.pack(side=tk.BOTTOM)# 创建用于显示单词的框架 self.words_frame = tk.Frame(self.master)

self.words_frame.pack(side=tk.LEFT)# 创建用于显示含义的框架 self.meanings_frame = tk.Frame(self.master)

self.meanings_frame.pack(side=tk.RIGHT)defdisplay_words(self):""" 在界面上显示单词和含义的按钮 """。

words_list = list(self.words.keys()) # 单词列表 meanings_list = list(self.words.values())

# 含义列表 random.shuffle(meanings_list) # 随机打乱含义列表# 创建单词和含义的按钮,并绑定点击事件for i in range(10): word_part1 = words_list[i][:len(words_list[i]) //

2] # 单词的第一部分 word_part2 = words_list[i][len(words_list[i]) // 2:] # 单词的第二部分# 创建单词的两部分按钮 word_button_part1 = tk.Button(self.words_frame, text=word_part1, width=

10, font=("JetBrains Mono", 12), anchor=w) word_button_part1.grid(row=i, column=0, padx=5, pady=

5) word_button_part1.bind("", self.button_click) # 绑定点击事件 word_button_part2 = tk.Button(self.words_frame, text=word_part2, width=

10, font=("JetBrains Mono", 12), anchor=w) word_button_part2.grid(row=i, column=1, padx=5, pady=

5) word_button_part2.bind("", self.button_click) # 绑定点击事件# 创建含义按钮 meaning_button = tk.Button(self.meanings_frame, text=meanings_list[i], width=

80, font=("楷体", 16), anchor=w) meaning_button.grid(row=i, column=2, padx=5, pady=5) meaning_button.bind(

"", self.button_click) # 绑定点击事件defbutton_click(self, event):""" 处理按钮点击事件,判断是否匹配成功,并更新界面和数据。

"""# 获取点击按钮的文本 text = event.widget.cget("text")# 如果点击的是单词的第一部分按钮if event.widget.master == self.words_frame:

if len(self.word_list) < 2: self.word_list.append(text)# 如果点击的是单词的第二部分按钮elif event.widget.master == self.words_frame:

if len(self.word_list) == 1: # 只有在第一部分单词按钮被点击后才能点击第二部分按钮 self.word_list.append(text)# 如果点击的是含义按钮

elif event.widget.master == self.meanings_frame and len(self.word_list) == 2: # 只有在两部分单词按钮都被点击后才能点击含义按钮

self.word_list.append(text)# 当列表中有三个元素时,拼接单词并检查匹配if len(self.word_list) == 3: word_text = self.word_list[

0] + self.word_list[1] # 拼接单词 meaning_text = self.word_list[2] # 含义文本# 判断是否匹配成功if self.words.get(word_text) == meaning_text:

self.matched_count += 1 self.lb_matched_count.config(text=f"匹配完成:{self.matched_count}

") self.status_label.config(text="★匹配成功★", fg="white", bg="green")# 将匹配成功的按钮从界面移除for button

in self.words_frame.winfo_children():if button.cget("text") in self.word_list[:2]: button.grid_forget()

for button in self.meanings_frame.winfo_children():if button.cget("text") == self.word_list[2]: button.grid_forget()

else: self.status_label.config(text="☆匹配错误☆", fg="white", bg="red") self.word_list = []

# 清空列表defopen_word_link_game_hard():""" 打开WordLinkHard游戏界面的函数 """# root = tk.Tk() root = Window(themename=。

"sandstone") # 创建窗口 app = WordLinkHard(root) # 创建WordLinkHard游戏实例 root.mainloop() # 运行游戏界面的事件循环

后面的两个子程序的代码基本上是一样的,小伙伴们可以想想如何合并成一个。运行程序以下是程序的运行演示:关闭观看更多更多退出全屏视频加载失败,请刷新页面再试

刷新

视频详情 新增一个用户数据表在数据库中新增一个数据表,用来存放用户数据(注意路径)import sqlite3# 连接到数据库(如果不存在,则会自动创建)conn = sqlite3.connect(EngStudy\words.db)

# 创建一个游标对象来执行SQL语句cursor = conn.cursor()# 创建user表cursor.execute(CREATETABLEIFNOTEXISTSuser (idINTEGER

PRIMARY KEY AUTOINCREMENT, username TEXTNOTNULLUNIQUE,passwordTEXTNOTNULL, correct_answers

INTEGERDEFAULT0, incorrect_answers INTEGERDEFAULT0, accuracy REALDEFAULT0.0,levelINTEGER

DEFAULT1 ))# 提交更改并关闭连接conn.commit()conn.close()print("user表创建成功")总结小伙伴们,这个例子暂时就到这了,各位可以自行扩展,比如单词连连看的时候限制错误次数,超出次数挑战失败,增加时间限制,增加用户信息,用户等级随着挑战次数/答对次数提升等级,总之,你能想得到好主意都可以尝试去实现。

如果你对其他创意项目感兴趣,请继续关注我的公众号获取更多有趣的内容和教程。如果你有任何问题欢迎联系我,我们可以一起学习讨论。赠人玫瑰,手有余香!别忘了转发分享给有需要的小伙伴!谢谢!

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186