Python Turtle双人赛跑游戏问题求助:循环崩溃与结束逻辑缺失
解决Turtle双人赛跑游戏的按键监听+胜负判断问题
嘿,这个问题我熟!你遇到的核心问题其实是Turtle库的事件循环机制——它基于Tkinter,自带了自己的主循环来处理按键、绘图这些事件,你自己加的while循环会直接把这个主循环卡死,导致程序崩溃;而去掉while之后,又没了定期检查胜负的逻辑,所以游戏没法结束。
给你一套可行的解决方案,用Turtle自带的定时器来实现定期胜负检查,同时不影响按键监听:
核心思路
- 用
ontimer()方法定期触发胜负检查,这个方法不会阻塞主事件循环,能和按键监听和平共处 - 用
onkeypress()绑定玩家移动的按键,记得调用listen()开启监听 - 一旦检测到玩家到达终点,就终止游戏并显示结果
完整示例代码
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
相关产品推荐
相关产品推荐

