You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python turtle的双人Tron游戏如何添加开场倒计时功能

实现方案

你只需要新增启动状态标记、开场倒计时逻辑,同时在所有玩家操作函数开头增加状态校验即可,顺带修复了原代码里的3个影响运行的问题:

  • 修正按键绑定笔误screeb为screen
  • 修正控制函数红蓝玩家写反、蓝方上移步长异常为100的问题,所有方向移动步长统一为1
  • 把原按键函数里阻塞进程的死循环移动逻辑移到统一主循环,避免按键触发后程序卡死无法响应转向操作,方便你后续补充碰撞、游戏结束判定逻辑

核心逻辑:

  • 初始状态下game_started标记为False,玩家触发按键时直接拦截,不执行方向修改和移动逻辑
  • 游戏资源加载完成后在屏幕中央显示3秒倒计时,倒计时结束显示"GO!"后将启动标记置为True,此时玩家操作才会正式生效

修改后完整代码
import turtle
import time

def tron():
    blueplayer = turtle.Turtle()
    redplayer = turtle.Turtle()
    screen = turtle.Screen()
    # 关闭自动刷新保证画面流畅
    screen.tracer(0)
    blueplayer.speed(0)
    redplayer.speed(0)
    screen.setup(600, 600)
    screen.bgcolor('black')
    # 本地有对应素材时可取消下面4行注释
    # screen.bgpic('TronBg.png')
    # screen.addshape('BlueBike.gif')
    # screen.addshape('RedBike.gif')
    # blueplayer.shape('BlueBike.gif')
    # redplayer.shape('RedBike.gif')
    redplayer.pencolor("red")
    redplayer.pensize(4)
    blueplayer.pencolor("blue")
    blueplayer.pensize(4)
    redplayer.pu()
    blueplayer.pu()
    blueplayer.goto(-200, 50)
    # 初始蓝方朝右、红方朝左
    blueplayer.setheading(0)
    redplayer.goto(200, 50)
    redplayer.setheading(180)
    redplayer.pd()
    blueplayer.pd()

    # 游戏启动状态标记,初始为未启动
    game_started = False

    # 倒计时专用画笔
    countdown_pen = turtle.Turtle()
    countdown_pen.hideturtle()
    countdown_pen.penup()
    countdown_pen.color("white")
    countdown_pen.goto(0, 0)

    # 红方WASD控制逻辑
    def RedUp():
        if not game_started:
            return
        redplayer.tilt(90)
        redplayer.setheading(90)
    def RedDown():
        if not game_started:
            return
        redplayer.tilt(270)
        redplayer.setheading(270)
    def RedLeft():
        if not game_started:
            return
        redplayer.tilt(180)
        redplayer.setheading(180)
    def RedRight():
        if not game_started:
            return
        redplayer.setheading(0)

    # 蓝方方向键控制逻辑
    def BlueUp():
        if not game_started:
            return
        blueplayer.tilt(90)
        blueplayer.setheading(90)
    def BlueDown():
        if not game_started:
            return
        blueplayer.tilt(270)
        blueplayer.setheading(270)
    def BlueLeft():
        if not game_started:
            return
        blueplayer.tilt(180)
        blueplayer.setheading(180)
    def BlueRight():
        if not game_started:
            return
        blueplayer.setheading(0)

    # 绑定按键
    screen.listen()
    screen.onkey(RedUp, "w")
    screen.onkey(RedDown, "s")
    screen.onkey(RedLeft, "a")
    screen.onkey(RedRight, "d")
    
    screen.onkey(BlueUp, "Up")
    screen.onkey(BlueDown, "Down")
    screen.onkey(BlueLeft, "Left")
    screen.onkey(BlueRight, "Right")

    # 游戏主循环,约60帧刷新率
    def game_loop():
        if game_started:
            blueplayer.forward(1)
            redplayer.forward(1)
        screen.update()
        screen.ontimer(game_loop, 16)

    # 执行开场倒计时
    for cnt in [3, 2, 1, "GO!"]:
        countdown_pen.clear()
        countdown_pen.write(cnt, align="center", font=("Arial", 64, "bold"))
        screen.update()
        time.sleep(1)
    countdown_pen.clear()
    # 倒计时结束开放操作
    game_started = True

    game_loop()
    screen.mainloop()

tron()

后续你要加游戏结束逻辑,直接在game_loop函数内补充碰撞检测、胜负判定即可,不需要改动现有启动控制逻辑。


内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:45:36