我是新来的,我是初学者。我已经学习编程5个月了,作为主要语言,我决定坚持使用python。我写了我的第一个简单的游戏是乒乓球(基于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
发布于 2019-02-21 06:55:34
因此,在回顾了一下你的游戏后,我发现了一个错误,那就是球会“粘”在左边的球拍上,就像你说的那样,速度不会重置每个分数。我已经在一些地方调整了它,它似乎有了很大的改进。
首先,每次有得分时,我都会重新设置速度:
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次命中后,速度仅为初始速度的1.5倍。两次命中后,速度是初始speed...and的两倍,依此类推。
https://stackoverflow.com/questions/54796089
复制相似问题