基于Turtle图形库的Pong游戏:pen.clear()失效与球移动缓慢问题求助
Pong游戏Turtle库开发问题:球速变慢+计分板不更新
问题现象
- 添加Pen计分模块后,球移动异常缓慢,调整
ball.dx/ball.dy数值无任何效果 - 球越过边界时,
pen.clear()无法正常工作,预期的分数更新(0→1)没有实现,计分板始终显示初始值
原始代码
# simple pong for beginners import turtle wn = turtle.Screen() wn.title("Pong by Flameo") wn.bgcolor("black") wn.setup(width=1000, height=1000) wn.tracer(0) # Score score_a = 0 score_b = 0 # Paddle A paddle_a = turtle.Turtle() paddle_a.speed(0) paddle_a.shape("square") paddle_a.color("white") paddle_a.shapesize(stretch_wid=5, stretch_len=1 ) paddle_a.penup() paddle_a.goto(-450, 0) # Paddle B paddle_b = turtle.Turtle() paddle_b.speed(0) paddle_b.shape("square") paddle_b.color("white") paddle_b.shapesize(stretch_wid=5, stretch_len=1 ) paddle_b.penup() paddle_b.goto(+450, 0) # Ball ball = turtle.Turtle() ball.speed(0) ball.shape("circle") ball.color("red") ball.penup() ball.goto(0, 0) ball.dx = 2 ball.dy = 2 # function def paddle_a_up(): y = paddle_a.ycor() y += 40 paddle_a.sety(y) def paddle_a_down(): y = paddle_a.ycor() y -= 40 paddle_a.sety(y) def paddle_b_up(): y = paddle_b.ycor() y += 40 paddle_b.sety(y) def paddle_b_down(): y = paddle_b.ycor() y -= 40 paddle_b.sety(y) # keyboard binding wn.listen() wn.onkeypress(paddle_a_up, "w") wn.onkeypress(paddle_a_down, "s") wn.onkeypress(paddle_b_up, "i") wn.onkeypress(paddle_b_down, "k") # 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() > 490: ball.sety(490) ball.dy *= -1 if ball.ycor() < -490: ball.sety(-490) ball.dy *= -1 if ball.xcor() > 490: ball.goto(0,0) ball.dx *= -1 score_a += 1 pen.clear() pen.write("Humans: {} Aliens: {}".format(score_a, score_b), align ="center", font=("Courier", 30, "normal")) if ball.xcor() < -490: ball.goto(0,0) ball.dx *= -1 score_b += 1 pen.clear() pen.write("Humans: {} Aliens: {}".format(score_a, score_b), align ="center", font=("Courier", 30, "normal")) # paddle and ball collisions if ball.xcor() > 440 and ball.xcor() < 450 and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -50): ball.setx(340) ball.dx *= -1 if ball.xcor() < -440 and ball.xcor() > -450 and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -50): ball.setx(-340) ball.dx *= -1 # Pen pen = turtle.Turtle() pen.speed(0) pen.color("white") pen.penup() pen.hideturtle() pen.goto(0, 450) pen.write("Humans: 0 Aliens: 0", align ="center", font=("Courier", 30, "normal"))
问题根源与修复方案
核心问题
Pen对象的初始化代码被放在了while True主循环内部,这会导致每一次游戏循环都创建一个新的Pen实例:
- 频繁创建Turtle对象会占用大量系统资源,直接造成游戏运行卡顿、球速变慢
- 出界时调用的
pen.clear()操作的是上一次循环创建的Pen对象,而当前循环又会重新绘制初始分数,导致计分板看起来完全没有更新
修复步骤
- 将Pen对象的初始化代码移到主循环外部,和其他游戏元素的初始化代码放在一起
- 初始化时仅绘制一次初始分数,后续仅在分数变化时更新计分板
修改后的完整代码
# simple pong for beginners import turtle wn = turtle.Screen() wn.title("Pong by Flameo") wn.bgcolor("black") wn.setup(width=1000, height=1000) wn.tracer(0) # Score score_a = 0 score_b = 0 # Paddle A paddle_a = turtle.Turtle() paddle_a.speed(0) paddle_a.shape("square") paddle_a.color("white") paddle_a.shapesize(stretch_wid=5, stretch_len=1 ) paddle_a.penup() paddle_a.goto(-450, 0) # Paddle B paddle_b = turtle.Turtle() paddle_b.speed(0) paddle_b.shape("square") paddle_b.color("white") paddle_b.shapesize(stretch_wid=5, stretch_len=1 ) paddle_b.penup() paddle_b.goto(+450, 0) # Ball ball = turtle.Turtle() ball.speed(0) ball.shape("circle") ball.color("red") ball.penup() ball.goto(0, 0) ball.dx = 2 ball.dy = 2 # Pen - 移到主循环外初始化 pen = turtle.Turtle() pen.speed(0) pen.color("white") pen.penup() pen.hideturtle() pen.goto(0, 450) pen.write("Humans: {} Aliens: {}".format(score_a, score_b), align ="center", font=("Courier", 30, "normal")) # function def paddle_a_up(): y = paddle_a.ycor() y += 40 paddle_a.sety(y) def paddle_a_down(): y = paddle_a.ycor() y -= 40 paddle_a.sety(y) def paddle_b_up(): y = paddle_b.ycor() y += 40 paddle_b.sety(y) def paddle_b_down(): y = paddle_b.ycor() y -= 40 paddle_b.sety(y) # keyboard binding wn.listen() wn.onkeypress(paddle_a_up, "w") wn.onkeypress(paddle_a_down, "s") wn.onkeypress(paddle_b_up, "i") wn.onkeypress(paddle_b_down, "k") # 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() > 490: ball.sety(490) ball.dy *= -1 if ball.ycor() < -490: ball.sety(-490) ball.dy *= -1 if ball.xcor() > 490: ball.goto(0,0) ball.dx *= -1 score_a += 1 pen.clear() pen.write("Humans: {} Aliens: {}".format(score_a, score_b), align ="center", font=("Courier", 30, "normal")) if ball.xcor() < -490: ball.goto(0,0) ball.dx *= -1 score_b += 1 pen.clear() pen.write("Humans: {} Aliens: {}".format(score_a, score_b), align ="center", font=("Courier", 30, "normal")) # paddle and ball collisions if ball.xcor() > 440 and ball.xcor() < 450 and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -50): ball.setx(340) ball.dx *= -1 if ball.xcor() < -440 and ball.xcor() > -450 and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -50): ball.setx(-340) ball.dx *= -1
内容的提问来源于stack exchange,提问作者John Reed
相关产品推荐
相关产品推荐

