如何在仅使用Tkinter的Python游戏中添加分级关卡?
Tkinter寻红球记忆游戏分级关卡实现
核心调整点
- 新增可扩展的关卡配置:通过字典存储每个关卡对应的目标寻球数量,后续新增关卡仅需向字典添加对应规则,无需修改核心游玩逻辑
- 移除原代码中硬编码的「找满5个红球即结束游戏」判断,替换为动态读取当前关卡的目标数值
- 优化关卡流转逻辑:当前关卡达标后不直接终止游戏,展示通关提示,自动重置寻球计数、刷新关卡计时,进入下一轮游玩
- 保留原有按键操控、画布绘制、计分规则的基础流程,不改动原有交互逻辑
调整后的完整代码
from tkinter import * from random import * import time # 全局变量定义 posPlayer = [0, 0] posGoal = [0, 0] n = 15 c = 50 score = 0 nbGoal = 0 gameTime = [] currentLevel = 1 # 关卡配置:键为关卡数,值为该关需要找到的红球总数,可自行扩展 levelTargets = {1: 5, 2: 10, 3: 15} ########### 方向移动控制 ################################# def right(event=None): posPlayer[0] += 50 if posPlayer[0] > 700: posPlayer[0] = 700 dep_right() def dep_right(): c1.delete(ALL) rond = c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') play() def left(event=None): posPlayer[0] -= 50 if posPlayer[0] < 0: posPlayer[0] = 0 dep_left() def dep_left(): c1.delete(ALL) rond = c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') play() def down(event=None): posPlayer[1] += 50 if posPlayer[1] > 700: posPlayer[1] = 700 dep_down() def dep_down(): c1.delete(ALL) rond = c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') play() def up(event=None): posPlayer[1] -= 50 if posPlayer[1] < 0: posPlayer[1] = 0 dep_up() def dep_up(): c1.delete(ALL) rond = c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') play() ################# 游戏流程管理 ######################################### def startGame(): global score, gameTime, nbGoal, posPlayer, posGoal, currentLevel # 重置到初始第一关 currentLevel = 1 nbGoal = 0 gameTime = [time.time(), 0] score = 0 posPlayer = [0, 0] posGoal = [0, 0] # 清空画布启动游戏 c1.delete(ALL) c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') Goal() def Goal(): global nbGoal nbGoal += 1 posGoal[0] = randint(0, 14) * 50 posGoal[1] = randint(0, 14) * 50 but = c1.create_oval(posGoal[0], posGoal[1], posGoal[0] + c, posGoal[1] + c, fill="red") play() def nextLevel(): global currentLevel, nbGoal, gameTime, posPlayer, posGoal # 判断是否所有关卡已通关 if currentLevel not in levelTargets: c1.create_text(c * n / 2, c * n / 2, font="Purisa", text="全部关卡通关!游戏结束", fill="red") return # 重置下一局初始状态 currentLevel += 1 nbGoal = 0 posPlayer = [0, 0] posGoal = [0, 0] gameTime = [time.time(), 0] c1.delete(ALL) c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') Goal() def play(): global score, currentLevel, levelTargets if posPlayer[0] == posGoal[0] and posPlayer[1] == posGoal[1]: # 判断是否达到当前关卡的目标 if nbGoal == levelTargets[currentLevel]: gameTime[1] = time.time() levelScore = round(1 / (gameTime[1] - gameTime[0]) * 1000, 2) score += levelScore displayScore.set(f"当前关卡: {currentLevel} | 累计得分: {score:.2f}") c1.create_text(c * n / 2, c * n / 2, font="Purisa", text=f"第{currentLevel}关完成!即将进入下一关", fill="yellow") # 1.5秒后自动跳转下一关 f1.after(1500, nextLevel) else: Goal() ################# 主程序界面 #################################### f1 = Tk() f1.title("Python Game Challenge") f1.bind("<Right>", right) f1.bind("<Left>", left) f1.bind("<Down>", down) f1.bind("<Up>", up) l1 = Label(f1, text="Welcome to my GAME !") l1.pack(side="top", ipadx=30, ipady=30) displayScore = StringVar() displayScore.set("Score =00.00") l2 = Label(f1, textvariable=displayScore) l2.pack(side="right", ipadx=10, ipady=10) b1 = Button(f1, text="play", fg='yellow', bg="black", command=startGame) b1.pack(side="left", ipadx=10, ipady=10) b2 = Button(f1, text="Close", fg='yellow', bg="black", command=f1.destroy) b2.pack(side="left", ipadx=10, ipady=10) c1 = Canvas(f1, width=n * c, height=n * c, bg="black") rond = c1.create_oval(posPlayer[0], posPlayer[1], posPlayer[0] + c, posPlayer[1] + c, fill='#fff') c1.pack() f1.mainloop()
内容的提问来源于stack exchange,提问作者Abdelmalek Mallek
相关产品推荐
相关产品推荐

