首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >巨蟒乒乓球游戏,拍球后加速击球

巨蟒乒乓球游戏,拍球后加速击球
EN

Stack Overflow用户
提问于 2019-02-21 06:17:18
回答 1查看 2.4K关注 0票数 0

我是新来的,我是初学者。我已经学习编程5个月了,作为主要语言,我决定坚持使用python。我写了我的第一个简单的游戏是乒乓球(基于yt教程),我想通过在每次击球后加快球的速度来提高它,并在得分时恢复到正常速度。我知道我把ball.dx +=1放错地方了。不过,只有当球上升时,它才会加速。当它下降时,它会回到正常速度,当然速度是循环的,即使得分,它仍然会加速。感谢您的帮助。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-21 06:55:34

因此,在回顾了一下你的游戏后,我发现了一个错误,那就是球会“粘”在左边的球拍上,就像你说的那样,速度不会重置每个分数。我已经在一些地方调整了它,它似乎有了很大的改进。

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

代码语言:javascript
复制
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放在它重置的任何地方。这只允许你在你的程序顶部更改一个数字,它会在所有地方调整速度,防止你每次都不得不在任何地方重新设置它!

其次,我修复了一点球拍碰撞。

代码语言:javascript
复制
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次命中后,速度仅为初始速度的1.5倍。两次命中后,速度是初始speed...and的两倍,依此类推。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54796089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档