Python基于turtle开发Pong游戏时paddle无法响应按键移动问题
问题原因
- 按键绑定逻辑错误:
wn.onkeypress()的第一个参数需要传入未执行的函数引用,你写的paddle(paddleA, 1)属于直接调用函数,会在代码运行到绑定逻辑时直接执行一次,返回的None会被绑定给按键事件,所以按下按键时没有对应逻辑执行。 - 窗口方法调用错误:
wn.tracer是控制窗口刷新的方法,不能直接赋值为0,正确写法是wn.tracer(0),你的赋值操作相当于给窗口对象新增了一个无关属性,没有生效关闭自动刷新的逻辑wn.title是设置窗口标题的方法,直接赋值无法修改标题,需要写成wn.title("Main Test")
修正代码
我们可以用lambda匿名函数封装移动逻辑,实现给回调函数传参的需求,同时把函数名和参数名做区分避免语义混淆,完整可运行代码如下:
import turtle # 窗口初始化 wn = turtle.Screen() wn.title("Main Test") wn.bgcolor("black") wn.setup(width=800, height=600) wn.tracer(0) # 左侧 paddleA paddleA = turtle.Turtle() paddleA.speed(0) paddleA.shape("square") paddleA.color("white") paddleA.shapesize(stretch_wid=5, stretch_len= 1) paddleA.penup() paddleA.goto(-350,0) # 右侧 paddleB paddleB = turtle.Turtle() paddleB.speed(0) paddleB.shape("square") paddleB.color("white") paddleB.shapesize(stretch_wid=5, stretch_len= 1) paddleB.penup() paddleB.goto(350,0) # 球 ball = turtle.Turtle() ball.speed(0) ball.shape("circle") ball.color("white") ball.penup() ball.goto(0,0) # paddle移动通用函数 def paddle_move(paddle, dir): y = paddle.ycor() y += 20 * dir paddle.sety(y) # 按键绑定 wn.listen() wn.onkeypress(lambda: paddle_move(paddleA, 1), "w") wn.onkeypress(lambda: paddle_move(paddleA, -1), "s") wn.onkeypress(lambda: paddle_move(paddleB, 1), "a") wn.onkeypress(lambda: paddle_move(paddleB, -1), "d") # 游戏主循环 while True: wn.update()
内容的提问来源于stack exchange,提问作者whensocksplay
相关产品推荐
相关产品推荐

