72 lines
2.5 KiB
Python
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()
|