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

Pong游戏小球卡出屏幕故障求助:得分正常但小球不可见

Pong游戏故障修复方案

问题根源分析

  • 垂直边界判断逻辑错误:第二个y轴边界判断误用大于号,导致小球刚启动就被强制拉到屏幕底部(-290位置),无法正常运动。
  • 右侧 paddle 碰撞处理错误:碰撞后错误设置y坐标并反转y方向,应设置x坐标并反转x方向。
  • 左侧 paddle 碰撞条件逻辑颠倒:坐标范围判断写反,导致碰撞检测完全失效。
  • 分数显示字体参数缺失:更新分数时未指定字体大小和样式,可能导致显示异常。

修正后的完整代码

import turtle as t
playerAscore = 0
playerBscore = 0

window = t.Screen()
window.title("Pong-Game")
window.bgcolor("black")
window.setup(width=800, height=600)
window.tracer(0)

leftpaddle = t.Turtle()
leftpaddle.speed(0)
leftpaddle.shape("square")
leftpaddle.color("green")
leftpaddle.shapesize(stretch_wid=5, stretch_len=1)
leftpaddle.penup()
leftpaddle.goto(-350, 0)

rightpaddle = t.Turtle()
rightpaddle.speed(0)
rightpaddle.shape("square")
rightpaddle.color("green")
rightpaddle.shapesize(stretch_wid=5, stretch_len=1)
rightpaddle.penup()
rightpaddle.goto(350, 0)

ball = t.Turtle()
ball.speed(0)
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ballxdirection = 0.2
ballydirection = 0.2

pen = t.Turtle()
pen.speed(0)
pen.color("blue")
pen.penup()
pen.goto(0, 260)
pen.write("Score", align="center", font=("Arial", 24, "normal"))

# Movement & Logic
def leftpaddleup():
    y = leftpaddle.ycor()
    y += 90
    leftpaddle.sety(y)

def leftpaddledown():
    y = leftpaddle.ycor()
    y -= 90
    leftpaddle.sety(y)

def rightpaddleup():
    y = rightpaddle.ycor()
    y += 90
    rightpaddle.sety(y)

def rightpaddledown():
    y = rightpaddle.ycor()
    y -= 90
    rightpaddle.sety(y)

window.listen()
window.onkeypress(leftpaddleup, "w")
window.onkeypress(leftpaddledown, "s")
window.onkeypress(rightpaddleup, "Up")
window.onkeypress(rightpaddledown, "Down")

while True:
    window.update()
    ball.setx(ball.xcor() + ballxdirection)
    ball.sety(ball.ycor() + ballydirection)

    # 垂直边界碰撞处理
    if ball.ycor() > 290:
        ball.sety(290)
        ballydirection *= -1
    if ball.ycor() < -290:
        ball.sety(-290)
        ballydirection *= -1

    # 右侧得分处理
    if ball.xcor() > 390:
        ball.goto(0, 0)
        ballxdirection *= -1
        playerAscore += 1
        pen.clear()
        pen.write(f"Player A: {playerAscore}       Player B: {playerBscore}", align='center', font=("Arial", 24, "normal"))

    # 左侧得分处理
    if ball.xcor() < -390:
        ball.goto(0, 0)
        ballxdirection *= -1
        playerBscore += 1
        pen.clear()
        pen.write(f"Player A: {playerAscore}       Player B: {playerBscore}", align='center', font=("Arial", 24, "normal"))

    # 右侧 paddle 碰撞处理
    if (ball.xcor() > 340) and (ball.xcor() < 350) and (ball.ycor() < rightpaddle.ycor() + 40) and (ball.ycor() > rightpaddle.ycor() - 40):
        ball.setx(340)
        ballxdirection *= -1

    # 左侧 paddle 碰撞处理
    if (ball.xcor() < -340) and (ball.xcor() > -350) and (ball.ycor() < leftpaddle.ycor() + 40) and (ball.ycor() > leftpaddle.ycor() - 40):
        ball.setx(-340)
        ballxdirection *= -1

关键修正点说明

  • 将垂直边界的第二个判断条件从ball.ycor() > -290改为ball.ycor() < -290,让小球触碰到底部边界时正常反弹。
  • 右侧 paddle 碰撞时,把ball.sety(340)改为ball.setx(340),同时将反转方向从ballydirection改为ballxdirection,确保碰撞后小球正确反弹。
  • 左侧 paddle 碰撞条件调整为ball.xcor() < -340 and ball.xcor() > -350,修复碰撞检测逻辑。
  • 更新分数时补全字体参数("Arial",24,"normal"),保证分数显示样式一致。

内容的提问来源于stack exchange,提问作者Advaith Kandaswamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:15:29