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

Python Turtle双人赛跑游戏问题求助:循环崩溃与结束逻辑缺失

解决Turtle双人赛跑游戏的按键监听+胜负判断问题

嘿,这个问题我熟!你遇到的核心问题其实是Turtle库的事件循环机制——它基于Tkinter,自带了自己的主循环来处理按键、绘图这些事件,你自己加的while循环会直接把这个主循环卡死,导致程序崩溃;而去掉while之后,又没了定期检查胜负的逻辑,所以游戏没法结束。

给你一套可行的解决方案,用Turtle自带的定时器来实现定期胜负检查,同时不影响按键监听:

核心思路

  1. 用ontimer()方法定期触发胜负检查,这个方法不会阻塞主事件循环,能和按键监听和平共处
  2. 用onkeypress()绑定玩家移动的按键,记得调用listen()开启监听
  3. 一旦检测到玩家到达终点,就终止游戏并显示结果

完整示例代码

import turtle

# 初始化游戏屏幕
screen = turtle.Screen()
screen.title("双人赛跑游戏")
screen.setup(width=400, height=200)

# 创建玩家1(红乌龟,W键控制)
player1 = turtle.Turtle()
player1.shape("turtle")
player1.color("red")
player1.penup()
player1.goto(-180, 50)  # 初始位置

# 创建玩家2(蓝乌龟,上箭头控制)
player2 = turtle.Turtle()
player2.shape("turtle")
player2.color("blue")
player2.penup()
player2.goto(-180, -50)

# 玩家移动函数
def move_player1():
    player1.forward(10)  # 每次按W前进10像素

def move_player2():
    player2.forward(10)  # 每次按上箭头前进10像素

# 胜负检查函数
def check_winner():
    # 判断玩家1是否到达终点(x坐标超过100)
    if player1.xcor() > 100:
        screen.textinput("游戏结束", "玩家1获胜!🎉")
        screen.bye()  # 关闭游戏窗口
        return
    # 判断玩家2是否到达终点
    if player2.xcor() > 100:
        screen.textinput("游戏结束", "玩家2获胜!🎉")
        screen.bye()
        return
    # 每隔100毫秒再次检查(可以调整这个间隔,数值越小检查越频繁)
    screen.ontimer(check_winner, 100)

# 绑定按键事件
screen.onkeypress(move_player1, "w")
screen.onkeypress(move_player2, "Up")
screen.listen()  # 必须调用这个,屏幕才会开始监听按键

# 启动胜负检查定时器
check_winner()

# 启动Turtle主事件循环(这个要放在最后)
turtle.done()

关键细节解释

  • 为什么不用while循环?:Turtle的mainloop()(也就是turtle.done())会处理所有的用户事件(按键、窗口操作),如果你自己写while True,会让这个主循环根本跑不起来,自然没法监听按键,甚至直接卡死程序。
  • ontimer的作用:screen.ontimer(check_winner, 100)相当于设置了一个“定时任务”,每100毫秒自动调用一次check_winner函数,这样既能持续检查胜负,又不会影响主循环处理按键。
  • listen()不能忘:绑定按键后必须调用screen.listen(),否则屏幕不会主动监听按键输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:24:25