这不会改变 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)
的组合
这是我写的代码;不确定我在这里做错了什么。当您按下 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)
的组合