You need to enable JavaScript to run this app. 如何在仅使用Tkinter的Python游戏中添加分级关卡?
优惠活动
大模型
产品
解决方案
定价
更多

如何在仅使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 15:15:04