You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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对象,而当前循环又会重新绘制初始分数,导致计分板看起来完全没有更新

修复步骤

  1. 将Pen对象的初始化代码移到主循环外部,和其他游戏元素的初始化代码放在一起
  2. 初始化时仅绘制一次初始分数,后续仅在分数变化时更新计分板

修改后的完整代码

# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:12:21