Python乒乓球游戏,击球后加快球速

时间:2019-02-20 22:17:18

标签: python

我是新来的,我是初学者。我从5个月开始学习编程,作为主要语言,我决定坚持使用python。我写了我的第一个简单的游戏是ping-pong(基于yt教程),我想通过在每次击球桨后加快球速并在得分时恢复到正常速度来对它进行一些改进。我知道我把ball.dx + = 1放在错误的位置。它可以加快速度,但是只有在球上升时才加速。当它下降时,它会恢复正常速度,并且速度当然会循环,即使被计分,它仍然会加速。感谢您的帮助。

import turtle

wn = turtle.Screen()
wn.title("gra by mati")
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)

# Paddle A
paddle_a = turtle.Turtle()
paddle_a.shape("square")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.speed(0)
paddle_a.color("white")
paddle_a.penup()
paddle_a.goto(-350, 0)


# Paddle B
paddle_b = turtle.Turtle()
paddle_b.shape("square")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.speed(0)
paddle_b.color("white")
paddle_b.penup()
paddle_b.goto(350, 0)


# ball
ball = turtle.Turtle()
ball.shape("square")
ball.speed(0)
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = 1/5
ball.dy = 1/5

# Pen
pen = turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Player A: 0  Player B: 0", align="center", font=("Courier", 24, "normal"))

# Score
score_a = 0
score_b = 0




# Function
def paddle_a_up():
    y = paddle_a.ycor()
    y += 20
    paddle_a.sety(y)

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

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

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






#keyboard biding
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")   

# Main game loop
while True:
    wn.update()

    # move the ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # border checking
    if ball.ycor() > 290:
        ball.sety(290)
        ball.dy *= -1


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

    if ball.xcor() > 390: 
        ball.goto(0, 0)
        ball.dx *= -1
        score_a += 1
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))


    if ball.xcor() < -390: 
        ball.goto(0, 0)
        ball.dx *= -1
        score_b += 1
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))


    # paddle and ball collision
    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() -40):
        ball.setx(340)
        ball.dx +=1
        ball.dx *= -1





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

1 个答案:

答案 0 :(得分:0)

因此,在回顾了一下游戏后,我发现一个错误,球会“粘在”左侧的球拍上,就像您说的那样,速度并没有重置每个得分。我已经在几个地方进行了调整,而且似乎有所改善。

首先,每次得分时我都会重置速度:

if ball.xcor() > 390:
    ball.goto(0, 0)
    ball.dx = 1 / 5 # reset to initial speed
    score_a += 1
    pen.clear()
    pen.write("Player A: {}  Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

if ball.xcor() < -390:
    ball.goto(0, 0)
    ball.dx = 1 / 5 # reset to initial speed
    ball.dx *= -1
    score_b += 1
    pen.clear()
    pen.write("Player A: {}  Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

我认为可以通过在顶部放置一个变量,例如initial_speed = 1/5来改善此问题,然后可以将ball.dx = initial_speed放在重置的位置。这样一来,您只需在程序顶部更改一个数字,即可在任何地方调整速度,从而不必每次重新设置时都必须追查!

其次,我稍微修正了桨碰

if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() -40):
    ball.setx(340)
    ball.dx *= -1 # flip direction first
    ball.dx -=1 # speed it up

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

同样可以通过创建变量speed_up_by = 1然后使用ball.dx += speed_up_by对其进行轻松调整来改善这一点。我认为1太大了,如果您很幸运,您将无法获得超过5个匹配。为了回答您对为什么一个是ball.dx +=1而另一个是ball.dx -=1的评论,我敦促您用数字来思考。初始速度为.2(或1/5),然后在其达到右侧后应将其反转(至-.2,现在它向左移动),然后提高其速度(通过减1->- 1.2)。现在,当它到达另一侧时,再次将其反转(至1.2),然后提高其速度(通过添加1-> 2.2)。您可以看到,即使我们从速度中减去它,它实际上会增加速度的大小!!我认为这也向您表明,将每个命中速度提高1真是太疯狂了。第一次击球后,球的运动速度是初始速度的 6倍!击中2次后,初始速度将 11次!您可能希望每次将速度的大小增加.1。这样一来,击打后的速度仅为初始速度的1.5倍。 2次击中后,速度是初始速度的两倍...依此类推。