这不会改变 Pong 中球拍的位置

This isn't changing the position of the paddles in Pong

这是我写的代码;不确定我在这里做错了什么。当您按下 W 和 S 时,左桨应该上下移动,a 和 d 应该适用于另一个桨。我目前只是在网上学习教程,但我已经碰壁了。我就是一辈子都看不出这有什么问题;除非 if python 不允许像这样将变量放入函数中

import turtle

#window set up
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

ball = turtle.Turtle()
ball.speed(0)
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0,0)

#function
def paddle(paddle, dir):
    y = paddle.ycor()
    y += 20 * dir
    paddle.sety(y)

#Keyboard Binding

wn.listen()
wn.onkeypress(paddle(paddleA, 1), "w")
wn.onkeypress(paddle(paddleA, -1), "s")
wn.onkeypress(paddle(paddleB, 1), "a")
wn.onkeypress(paddle(paddleB, -1), "d")

#Main Game Loop
while True:
    wn.update()

onkeypress 要求:

a function with no arguments or None

作为第一个参数。您实际上是在传递 None,因为那是 函数调用 的计算结果。你可以通过执行自己看到:

print(type(paddle(paddleA, 1)))

函数call不是函数!


解决此问题的一种方法是使用 lambda 将函数调用包装到匿名函数中,如下所示:

wn.listen()
wn.onkeypress(lambda: paddle(paddleA, 1), "w")
wn.onkeypress(lambda: paddle(paddleA, -1), "s")
wn.onkeypress(lambda: paddle(paddleB, 1), "a")
wn.onkeypress(lambda: paddle(paddleB, -1), "d")

@JanezKuhar 的 lambda 解决方案 (+1) 的替代方法是使用 functools 库中的 partial 函数。下面是一个通过包装 paddle 方法来消除 paddle() 函数的示例实现:

from turtle import Screen, Turtle
from functools import partial

# Window set up
screen = Screen()
screen.setup(width=800, height=600)
screen.title = ("Main Test")
screen.bgcolor('black')

# Paddle A

paddleA = Turtle()
paddleA.speed('fastest')
paddleA.shape('square')
paddleA.color('white')
paddleA.shapesize(stretch_len=5)
paddleA.setheading(90)
paddleA.penup()
paddleA.setx(-350)

# Paddle B

paddleB = paddleA.clone()
paddleB.setx(350)

# Ball

ball = Turtle()
ball.speed('fastest')
ball.shape('circle')
ball.color('white')
ball.penup()

# Keyboard Binding

screen.onkeypress(partial(paddleA.forward, 20), 'w')
screen.onkeypress(partial(paddleA.backward, 20), 's')
screen.onkeypress(partial(paddleB.forward, 20), 'a')
screen.onkeypress(partial(paddleB.backward, 20), 'd')

screen.listen()
screen.mainloop()

请注意,我已将你的桨向另一个方向拉伸并旋转它们,这样我们就可以使用 forward(20)backward(20) 来移动它们,而不是 sety(ycor() + 20) 的组合