Rozdział 19 · Finał
Snake Pro - Finałowa gra
Ten sam prototyp z sekcji 19.1 — ale teraz z modelem stanu, tickiem gry i architekturą, która wytrzyma rozwój projektu.
Program końcowy
Plik jest kompletny, samodzielny i nie posiada niewidzialnych zależności od innych lekcji:
projects/turtle/snake/snake.py
snake.py — struktura
class Direction(Enum): ...
class GameStatus(Enum): ...
@dataclass
class GameState: ...
def next_head(head, direction): ...
def move_snake(snake, new_head, *, grow): ...
def is_wall_collision(head): ...
def is_self_collision(new_head, body_after_move): ...
def choose_food(snake, rng): ...
def calculate_delay(score): ...
def new_game_state(rng, *, high_score=0): ...
class SnakeApp:
def __init__(self, *, rng=None): ...
def bind_keys(self): ...
def request_direction(self, direction): ...
def game_tick(self): ...
def toggle_pause(self): ...
def restart(self): ...
def render(self): ...
def run(self): ...
def main():
app = SnakeApp()
app.run()
if __name__ == "__main__":
main()
Uruchom grę u siebie
python snake.py w terminalu. Strzałki lub WASD — ruch, Space — pauza, R to nowa gra. Porównaj z snake_basic.py (Rozdział 19.8) to ten sam pomysł dla gry, ale z zupełnie inną architekturą wewnętrzną.Lista kontrolna gotowej aplikacji
MODEL
- GameState — snake, direction, food: Position | None, score, status, delay_ms, bez Turtle w środku
- czyste funkcje reguł to next_head, move_snake, is_wall_collision, is_self_collision, choose_food, calculate_delay
- nowa głowa + stare ciało zamiast cyklu po segmentach
CYKL
- tik przez screen.ontimer(), bez cyklu blokującego i time.sleep()
- kierunek klawiatury żąda, kliknij go stosuje
- generowanie (generation) jest wyłączane natychmiast zarówno podczas przerwy, jak i wznowienia – nie tylko podczas restart()
- dokładnie jeden aktywny łańcuch tików w dowolnym momencie czasu
FUNKCJE GRY
- pause/resume bez ponownego tworzenia węża
- restart z zachowaniem zapisu
- prędkość rośnie wraz z wynikiem, nie spadając poniżej minimum
- zapełnione pole to wyraźny GameStatus.WON, a nie pożywienie wewnątrz węża
- HUD — osobny pas nad polem, a nie nad legalnymi kratkami
TESTY
- testowane zasady bez żadnego prawdziwego okna
- deterministyczne jedzenie przez random.Random(seed)
- render() ponownie wykorzysta pulę segmentów Turtle-0
Paleta Gier
Ostateczna wersja gry używa tylko pięciu kolorów – nie po to, by wyglądać skromnie, ale Ponieważ łatwiej jest rozróżnić głowę, ciało i jedzenie po porównaniu, a nie po liczbie odcieni:
Tło
#000000
#000000
Głowa
#FFFFFF
#FFFFFF
Korpus
#4ECDC4
#4ECDC4
Jedzenie
#FF5D5D
#FF5D5D
Tekst
#FFFFFF
#FFFFFF
Praktyka: Snake Pro w całości
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie