前言
距离最强大脑第十一季心算赛道的国际先遣赛已经过去两周了,看完后,我立马决定要把挑战项目做成小游戏!
过了一周,也就是上周,我终于把它做了出来!😎
又过了一周,我整理出了这篇博客——那么,正片开始!
如果你也是最强大脑的粉丝的话,别忘记点个赞哦!
正片
项目简介
关于这个项目,我已经把它在 Gitee 上开源了,如有bug或建议欢迎提出!最强大脑第十一季同款挑战项目:闪电心算https://gitee.com/yaoqx/mental-arithmetic
这个项目我选择使用 Pytho 中的 GUI 库 Tkinter,方便与用户进行按钮交互
(不了解 tkinter 的可以先去其他博客看一看)
实现逻辑
我设计了两个模式,一个是最强大脑原版挑战,也就是专业模式。但这我们也玩不起呀,于是我又加了一个简单模式,绝对能上手!
具体代码
这里的代码不一定会更新,还是以 Gitee 上的为最新版本
import tkinter as tk
from tkinter import messagebox
import random
# 主窗口
class Main(tk.Tk):
width, height = 300, 400
# 专业模式参数
nums_dif = ["三位数", "四位数", "五位数", "六位数"]
op_dif = ["加法", "加减混合"]
bet_dif = ["0.7s", "0.5s", "0.3s", "0.25s", "0.2s"]
cnt_dif = ["20", "30", "50", "80", "100"]
# 简单模式参数
nums_easy = ["一位数", "两位数"]
op_easy = ["加法", "加减混合"]
bet_easy = ["2s", "1.5s", "1s", "0.8s"]
cnt_easy = ["5", "10", "15", "20"]
# 全局变量
num = []
ans = 0
nums, op, bet, cnt = "", "", "", "" # 参数
dif_win, easy_win, game_win = None, None, None # 窗口
entry, label, label1, label2, label3, label4 = None, None, None, None, None, None # 全局控件
#初始化
def __init__(self):
super().__init__()
self.title("闪电心算 - 主页")
self.geometry("%sx%s+100+100" % (self.width, self.height))
self.page()
# 界面
def page(self):
# 文字
tk.Label(self, text="闪电心算", font=("仿宋", 30)).pack(pady=40)
# 按钮
tk.Button(self, text="简单模式", font=("宋体", 15), command=self.easy, relief=tk.GROOVE, padx=50).pack(pady=20)
tk.Button(self, text="专业模式", font=("宋体", 15), command=self.dif, relief=tk.GROOVE, padx=50).pack(pady=20)
tk.Button(self, text="退出", font=("宋体", 15), command=self.destroy, relief=tk.GROOVE, padx=70).pack(pady=20)
# 简单模式
def easy(self):
# 初始化
self.easy_win = tk.Tk()
self.easy_win.title("闪电心算 - 题目选择")
self.nums, self.op, self.bet, self.cnt = "", "", "", ""
# 位数
self.label1 = tk.Label(self.easy_win, text=" 位数", font=("", 10))
self.label1.grid(row=0, column=0, ipady=10, sticky="w")
tk.Button(self.easy_win, text="一位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(1, 0)).grid(row=0, column=1, sticky="ew")
tk.Button(self.easy_win, text="二位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(1, 1)).grid(row=0, column=2, sticky="ew")
# 运算
self.label2 = tk.Label(self.easy_win, text=" 运算符号", font=("", 10))
self.label2.grid(row=1, column=0, ipady=10, sticky="w")
tk.Button(self.easy_win, text="加法", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(2, 0)).grid(row=1, column=1, sticky="ew")
tk.Button(self.easy_win, text="加减混合", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(2, 1)).grid(row=1, column=2, sticky="ew")
# 间隔
self.label3 = tk.Label(self.easy_win, text=" 间隔", font=("", 10))
self.label3.grid(row=2, column=0, ipady=10, sticky="w")
tk.Button(self.easy_win, text="2s", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(3, 0)).grid(row=2, column=1, sticky="ew")
tk.Button(self.easy_win, text="1.5s", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(3, 1)).grid(row=2, column=2, sticky="ew")
tk.Button(self.easy_win, text="1s", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(3, 2)).grid(row=2, column=3, sticky="ew")
tk.Button(self.easy_win, text="0.8s", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(3, 3)).grid(row=2, column=4, sticky="ew")
# 笔数
self.label4 = tk.Label(self.easy_win, text=" 笔数", font=("", 10))
self.label4.grid(row=3, column=0, ipady=10, sticky="w")
tk.Button(self.easy_win, text="5", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(4, 0)).grid(row=3, column=1, sticky="ew")
tk.Button(self.easy_win, text="10", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(4, 1)).grid(row=3, column=2, sticky="ew")
tk.Button(self.easy_win, text="15", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(4, 2)).grid(row=3, column=3, sticky="ew")
tk.Button(self.easy_win, text="20", padx=10, relief=tk.GROOVE, command=lambda:self.set_easy(4, 3)).grid(row=3, column=4, sticky="ew")
# 按钮
tk.Button(self.easy_win, text="确定", relief=tk.GROOVE, command=lambda:self.game(False)).grid(row=4, column=0, columnspan=6, sticky="ew")
self.easy_win.mainloop()
# 专业模式
def dif(self):
#初始化
self.dif_win = tk.Tk()
self.dif_win.title("闪电心算 - 题目选择")
self.nums, self.op, self.bet, self.cnt = "", "", "", ""
# 位数
self.label1 = tk.Label(self.dif_win, text="位数", font=("", 10))
self.label1.grid(row=0, column=0, ipady=10, sticky="w")
tk.Button(self.dif_win, text="三位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(1, 0)).grid(row=0, column=1, sticky="ew")
tk.Button(self.dif_win, text="四位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(1, 1)).grid(row=0, column=2, sticky="ew")
tk.Button(self.dif_win, text="五位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(1, 2)).grid(row=0, column=3, sticky="ew")
tk.Button(self.dif_win, text="六位数", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(1, 3)).grid(row=0, column=4, sticky="ew")
# 运算
self.label2 = tk.Label(self.dif_win, text="运算符号", font=("", 10))
self.label2.grid(row=1, column=0, ipady=10, sticky="w")
tk.Button(self.dif_win, text="加法", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(2, 0)).grid(row=1, column=1, sticky="ew")
tk.Button(self.dif_win, text="加减混合", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(2, 1)).grid(row=1, column=2, sticky="ew")
# 间隔
self.label3 = tk.Label(self.dif_win, text="间隔", font=("", 10))
self.label3.grid(row=2, column=0, ipady=10, sticky="w")
tk.Button(self.dif_win, text="0.7s", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(3, 0)).grid(row=2, column=1, sticky="ew")
tk.Button(self.dif_win, text="0.5s", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(3, 1)).grid(row=2, column=2, sticky="ew")
tk.Button(self.dif_win, text="0.3s", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(3, 2)).grid(row=2, column=3, sticky="ew")
tk.Button(self.dif_win, text="0.25s", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(3, 3)).grid(row=2, column=4, sticky="ew")
tk.Button(self.dif_win, text="0.2s", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(3, 4)).grid(row=2, column=5, sticky="ew")
# 笔数
self.label4 = tk.Label(self.dif_win, text="笔数", font=("", 10))
self.label4.grid(row=3, column=0, ipady=10, sticky="w")
tk.Button(self.dif_win, text="20", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(4, 0)).grid(row=3, column=1, sticky="ew")
tk.Button(self.dif_win, text="30", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(4, 1)).grid(row=3, column=2, sticky="ew")
tk.Button(self.dif_win, text="50", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(4, 2)).grid(row=3, column=3, sticky="ew")
tk.Button(self.dif_win, text="80", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(4, 3)).grid(row=3, column=4, sticky="ew")
tk.Button(self.dif_win, text="100", padx=10, relief=tk.GROOVE, command=lambda:self.set_dif(4, 4)).grid(row=3, column=5, sticky="ew")
# 按钮
tk.Button(self.dif_win, text="确定", relief=tk.GROOVE, command=lambda:self.game(True)).grid(row=4, column=0, columnspan=6, sticky="ew")
self.dif_win.mainloop()
# 设置数据
def set_dif(self, x, y):
if x == 1:
self.nums = self.nums_dif[y]
self.label1["text"] = "[当前选择:"+self.nums+"]"+"位数"
elif x == 2:
self.op = self.op_dif[y]
self.label2["text"] = "[当前选择:"+self.op+"]"+"运算符号"
elif x == 3:
self.bet = self.bet_dif[y]
self.label3["text"] = "[当前选择:"+self.bet+"]"+"间隔"
elif x == 4:
self.cnt = self.cnt_dif[y]
self.label4["text"] = "[当前选择:"+self.cnt+"]"+"笔数"
# 设置数据
def set_easy(self, x, y):
if x == 1:
self.nums = self.nums_easy[y]
self.label1["text"] = "[当前选择:"+self.nums+"]"+"位数"
elif x == 2:
self.op = self.op_easy[y]
self.label2["text"] = "[当前选择:"+self.op+"]"+"运算符号"
elif x == 3:
self.bet = self.bet_easy[y]
self.label3["text"] = "[当前选择:"+self.bet+"]"+"间隔"
elif x == 4:
self.cnt = self.cnt_easy[y]
self.label4["text"] = "[当前选择:"+self.cnt+"]"+"笔数"
# 游戏主函数
def game(self, flag):
# 检测数据
if (self.nums == "" or self.op == "" or self.bet == "" or self.cnt == ""):
messagebox.showerror("警告", "有选项未选择!")
return 0
if flag: self.dif_win.destroy()
else: self.easy_win.destroy()
# 重新设置数据
if flag: self.nums = self.nums_dif.index(self.nums) + 3
else: self.nums = self.nums_easy.index(self.nums) + 1
if self.op == "加法": self.op = False
elif self.op == "加减混合": self.op = True
self.bet = int(float(self.bet[:len(self.bet)-1])*1000)
self.cnt = int(self.cnt)
# 初始化
# 窗口
self.game_win = tk.Tk()
self.game_win.geometry("500x500+500+200")
self.game_win.title("闪电心算 - 挑战")
self.label = tk.Label(self.game_win, font=("宋体", 80))
self.label.pack(expand=True, anchor="center")
self.num = []
# 开始挑战
messagebox.showinfo("提示", "按下“确定”开始挑战")
self.change()
self.game_win.after(self.bet*self.cnt, self.ask)
# 数字切换
def change(self):
self.timer = self.game_win.after(self.bet, self.change) # 定时循环
# 生成数字
self.now = random.randint(int("1"+"0"*(self.nums-1)), int("1"+"0"*self.nums)-1)
if self.op:
self.c = random.randint(1, 10)
if self.c <= 3:
self.now = -self.now
# 避免重复
if self.num != []:
while self.now == self.num[len(self.num)-1]:
self.now = random.randint(int("1"+"0"*(self.nums-1)), int("1"+"0"*self.nums)-1)
self.label["text"] = str(self.now)
self.num.append(self.now)
# 结束
if len(self.num) == self.cnt:
self.game_win.after_cancel(self.timer)
# 提交答案
def ask(self):
# 窗口
self.game_win.destroy()
self.ask_win = tk.Tk()
self.ask_win.geometry("250x150")
self.ask_win.title("请作答")
self.entry = tk.Entry(self.ask_win, relief=tk.GROOVE)
self.entry.pack(padx=20, pady=20, ipadx=5, ipady=5)
tk.Button(self.ask_win, text="确定", padx=60, command=self.check, relief=tk.GROOVE).pack(padx=20, pady=20)
# 答案检查
def check(self):
self.ans = sum(self.num)
self.my = self.entry.get()
self.ask_win.destroy()
if self.my == str(self.ans):
messagebox.showinfo("结果", "回答正确!")
else:
messagebox.showinfo("结果", "回答错误\n正确答案:"+str(self.ans))
win = Main()
win.mainloop()
根据以上的注释和代码,大家应该能看懂,如果想要具体教程的话可以私信我,我再更新!
最后,恳请大家看看我的项目,给个三连或提一点建议是给我的最大支持!
大家想让我下一个做什么挑战项目呢?欢迎留言!