PyCharm中turtle.write方法无法显示屏幕分数的问题咨询
Python Turtle贪吃蛇分数不显示问题排查
核心问题点
- 分数初始绘制位置超出屏幕可视范围:main.py中设置的屏幕高度为
500,turtle屏幕坐标原点在画布正中心,垂直方向可视范围为y ∈ [-250, 250],但scoreboard初始化时将绘制坐标设为(0, 270),文字完全落在屏幕上边界之外,启动后自然看不到分数。 - 分数更新逻辑缺失:
increase_score()方法中仅完成了分数自增、清空旧画布的操作,清空后没有调用self.update_scoreboard()重新渲染新分数,后续即使触发加分逻辑,旧分数被清除后新分数也不会显示。 - 主循环缺失核心交互逻辑:现有主循环仅实现了蛇的自动移动,没有添加食物碰撞检测、边界/自身碰撞检测逻辑,既不会触发分数更新,也不会触发游戏结束提示。
- 缺少窗口保活逻辑:部分PyCharm运行环境下,turtle程序如果没有添加点击关闭的配置,程序跑完主逻辑后会直接关闭窗口,看不到渲染内容。
修正后代码
scoreboard.py
from turtle import Turtle ALIGNMENT = "center" FONT = ("Courier", 14, "normal") class Scoreboard(Turtle): def __init__(self): super().__init__() self.score = 0 self.color("white") self.penup() # 调整分数坐标到屏幕可视范围内,预留顶部边距 self.goto(0, 230) self.hideturtle() self.update_scoreboard() def update_scoreboard(self): self.write(f"Score: {self.score}", align=ALIGNMENT, font=FONT) def game_over(self): self.goto(0, 0) self.write("GAME OVER", align=ALIGNMENT, font=FONT) def increase_score(self): self.score += 1 self.clear() # 清空旧分数后重新渲染最新分数 self.update_scoreboard()
main.py
from turtle import Screen from snake import Snake from food import Food import time from scoreboard import Scoreboard screen = Screen() screen.setup(width=600, height=500) screen.bgcolor("black") screen.title("my snake game") screen.tracer(0) snake = Snake() food = Food() scoreboard = Scoreboard() screen.listen() screen.onkey(snake.up, "Up") screen.onkey(snake.down, "Down") screen.onkey(snake.left, "Left") screen.onkey(snake.right, "Right") game_is_on = True while game_is_on: screen.update() time.sleep(0.1) snake.move() # 检测碰撞食物,触发加分、食物刷新、蛇身加长 if snake.head.distance(food) < 15: food.refresh() snake.extend() scoreboard.increase_score() # 检测碰撞边界,触发游戏结束 if snake.head.xcor() > 280 or snake.head.xcor() < -280 or snake.head.ycor() > 230 or snake.head.ycor() < -240: game_is_on = False scoreboard.game_over() # 检测碰撞蛇身,触发游戏结束 for segment in snake.segments[1:]: if snake.head.distance(segment) < 10: game_is_on = False scoreboard.game_over() # 保持窗口显示,点击屏幕后关闭 screen.exitonclick()
注:上述main.py中调用的
snake.extend()、food.refresh()是贪吃蛇项目中蛇身加长、食物随机刷新的常规方法,如果你现有snake.py和food.py中已经实现对应方法可以直接复用,没有的话补充对应逻辑即可。
内容的提问来源于stack exchange,提问作者Kenny Okoye
相关产品推荐
相关产品推荐

