【问题标题】:This isn't changing the position of the paddles in Pong这不会改变 Pong 中桨的位置
【发布时间】:2021-11-10 01:54:55
【问题描述】:

这是我写的代码;不知道我在这里做错了什么。当您按 W 和 S 时,左桨应上下移动,a 和 d 应适用于另一个桨。我目前只是在网上学习一个教程,而且我已经碰壁了。我一辈子都看不出这有什么问题;除非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()

【问题讨论】:

  • 你还没有告诉我们发生了什么

标签: python turtle-graphics python-turtle pong


【解决方案1】:

onkeypress 需要:

一个没有参数的函数None

作为第一个参数。您实际上是在传递None,因为这就是 函数调用 的评估结果。您可以通过执行以下命令自己查看:

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

函数调用不是函数!


解决此问题的一种方法是使用 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")

【讨论】:

    【解决方案2】:

    @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) 的组合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多