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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:09:21