Files
024-snake/src/snake_game/scoreboard.py
T
Tirsvad 4ef3874bb1 Read and write the high score file and show the stored high score
Refs #24
Refs #25
Refs #26
Task: MIL-004#2
Task: MIL-004#3
Task: MIL-004#4
2026-10-13 14:38:51 +08:00

72 lines
2.5 KiB
Python

"""! @file
@brief The scoreboard: the text at the top of the screen that shows the score.
The class follows the day-21 lecture on inheritance: `Scoreboard` is a `Turtle`
that writes text. Like `food`, this module needs `turtle` when it is imported;
the game imports it only when it starts, and the tests install a fake `turtle`
module first.
"""
from turtle import Turtle
from snake_game.constants import (
HIGH_SCORE_FILE,
HIGH_SCORE_LABEL,
SCORE_LABEL,
SCOREBOARD_ALIGNMENT,
SCOREBOARD_COLOR,
SCOREBOARD_FONT,
SCOREBOARD_POSITION,
)
from snake_game.high_score_file import read_high_score, write_high_score
class Scoreboard(Turtle):
"""! @brief Shows the score as text at the top centre of the screen."""
def __init__(self, path: str = HIGH_SCORE_FILE) -> None:
"""! @brief Set the scoreboard up and write the score 0 and the stored best.
@param path The file that keeps the high score; defaults to
`HIGH_SCORE_FILE`.
"""
super().__init__()
## @brief The file that keeps the high score between games.
self.path = path
## @brief The number of foods the snake has eaten since the last reset.
self.score = 0
## @brief The largest score reached so far, as stored in the file.
self.high_score = read_high_score(path)
self.color(SCOREBOARD_COLOR)
self.penup()
self.hideturtle()
self.goto(SCOREBOARD_POSITION)
self.update_scoreboard()
def update_scoreboard(self) -> None:
"""! @brief Wipe the old text and write the score and the high score."""
self.clear()
self.write(
f"{SCORE_LABEL}{self.score} {HIGH_SCORE_LABEL}{self.high_score}",
align=SCOREBOARD_ALIGNMENT,
font=SCOREBOARD_FONT,
)
def increase_score(self) -> None:
"""! @brief Add 1 to the score and write it."""
self.score += 1
self.update_scoreboard()
def reset(self) -> None:
"""! @brief Keep the best score, start a new game and write the scoreboard.
When the score is higher than the high score, it becomes the new high
score and is written to the file; a lower or equal score does not write
the file. The score then goes back to 0.
"""
if self.score > self.high_score:
self.high_score = self.score
write_high_score(self.high_score, self.path)
self.score = 0
self.update_scoreboard()