【问题标题】:Ping pong paddle not hitting ball correctly乒乓球拍打不准
【发布时间】:2022-01-11 10:23:54
【问题描述】:

我正在尝试使用 Python 3 制作乒乓球游戏,并且可以说我已经走得很远了。我现在遇到了一个错误(错误不是错误),球在击中桨边缘时不会反弹。相反,它一直等到它击中桨的中心;可能是由于我使用的 ycor 函数。这是我到目前为止的代码:

import turtle
    


wn = turtle.Screen()
wn.bgcolor('white')
wn.title("Ping Pong")
wn.tracer(0)
wn.setup(width=800, height=600)


pad1 = turtle.Turtle()
pad1.shape('square')
pad1.penup()
pad1.shapesize(5, 1)
pad1.speed(0)
pad1.goto(-340, 0)
pad1.speed(0)


pad2 = turtle.Turtle()
pad2.shape('square')
pad2.penup()
pad2.shapesize(5, 1)
pad2.speed(0)
pad2.goto(340, 0)
pad2.speed(0)

ball = turtle.Turtle()
ball.shape("circle")
ball.penup()

ball.color('black')
ball.speed(0)
ball.dy = -0.2
ball.dx = -0.2


def paddle_a_up():
    y = pad1.ycor()
    y += 20
    pad1.sety(y)


def paddle_a_down():
    y = pad1.ycor()
    y -= 20
    pad1.sety(y)


def paddle_b_up():
    y = pad2.ycor()
    y += 20
    pad2.sety(y)


def paddle_b_down():
    y = pad2.ycor()
    y -= 20
    pad2.sety(y)


wn.listen()
wn.onkeypress(paddle_a_up, "w")
wn.onkeypress(paddle_a_down, "s")

wn.onkeypress(paddle_b_up, "Up")
wn.onkeypress(paddle_b_down, "Down")
while True:
    wn.update()
    ball.sety(ball.ycor() + ball.dy)
    ball.setx(ball.xcor() + ball.dx)



    if ball.ycor() < -270:
        ball.dy *= -1


    if ball.ycor() > 280:
        ball.dy *= -1

    if ball.xcor() < -380:
        ball.goto(0, 0)
        ball.dx *= -1



    if ball.xcor() > 380:
        ball.goto(0, 0)
        ball.dx *= -1



    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < pad2.ycor() + 40 and 
ball.ycor() > pad2.ycor - 40):
        ball.setx(340)
        ball.dx *= -1

这是

if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < pad2.ycor() + 40 and 
ball.ycor() > pad2.ycor - 40):

给我带来所有麻烦的声明。我是一个初学者程序员,但所有类型的答案都值得赞赏。提前致谢!

【问题讨论】:

    标签: python python-3.x pong


    【解决方案1】:

    给我带来这么多麻烦的声明。

    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < pad2.ycor() + 40 and 
    ball.ycor() > pad2.ycor - 40):
    

    没有问题,只是您的错字问题,您将方法作为属性调用,这就是为什么您在上面的行中将pad2.ycor替换为pad2.ycor(),这样您的行就变成了

    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < pad2.ycor() + 40 and 
    ball.ycor() > pad2.ycor() - 40):
    

    对于第一个垫子,在优化并添加额外条件后,您错过了条件对来评估其与球的碰撞,您的代码现在变为以下状态

    import turtle
        
    
    
    wn = turtle.Screen()
    wn.bgcolor('white')
    wn.title("Ping Pong")
    wn.tracer(0)
    wn.setup(width=800, height=600)
    
    
    pad1 = turtle.Turtle()
    pad1.shape('square')
    pad1.penup()
    pad1.shapesize(5, 1)
    pad1.speed(0)
    pad1.goto(-340, 0)
    pad1.speed(0)
    
    
    pad2 = turtle.Turtle()
    pad2.shape('square')
    pad2.penup()
    pad2.shapesize(5, 1)
    pad2.speed(0)
    pad2.goto(340, 0)
    pad2.speed(0)
    
    ball = turtle.Turtle()
    ball.shape("circle")
    ball.penup()
    
    ball.color('black')
    ball.speed(0)
    ball.dy = -0.2
    ball.dx = -0.2
    
    
    def paddle_a_up():
        y = pad1.ycor()
        y += 20
        pad1.sety(y)
    
    
    def paddle_a_down():
        y = pad1.ycor()
        y -= 20
        pad1.sety(y)
    
    
    def paddle_b_up():
        y = pad2.ycor()
        y += 20
        pad2.sety(y)
    
    
    def paddle_b_down():
        y = pad2.ycor()
        y -= 20
        pad2.sety(y)
    
    
    wn.listen()
    wn.onkeypress(paddle_a_up, "w")
    wn.onkeypress(paddle_a_down, "s")
    
    wn.onkeypress(paddle_b_up, "Up")
    wn.onkeypress(paddle_b_down, "Down")
    while True:
        wn.update()
        ball.sety(ball.ycor() + ball.dy)
        ball.setx(ball.xcor() + ball.dx)
    
        if ball.ycor() < -270 or ball.ycor() > 280:
            ball.dy *= -1
    
        if ball.xcor() < -380 or ball.xcor() > 380:
            ball.goto(0, 0)
            ball.dx *= -1
        
        if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < pad1.ycor() + 40 and ball.ycor() > pad1.ycor() - 40):
            ball.setx(-340)
            ball.dx *= -1
    
        if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < pad2.ycor() + 40 and ball.ycor() > pad2.ycor() - 40):
            ball.setx(340)
            ball.dx *= -1
    

    【讨论】:

    • 我修好了,但还是不行
    • 我在修复这个问题后执行了你的代码,现在碰撞从边缘和中心两个很好地工作,我的意思是垫的任何部分。
    • 你的python版本?
    • 我更新了我的答案
    • 还是不行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多