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
相关产品推荐
相关产品推荐

