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

Ostatnie okno Snake Pro: kilka segmentów ciała, jabłko, partyturę i płytę na ciemnym polu
Właściwe okno w ostatecznej wersji to ten sam pomysł, który otwierał rozdział w sekcji 19.1, ale teraz wiemy, z czego jest zrobiony.

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
Głowa
#FFFFFF
Korpus
#4ECDC4
Jedzenie
#FF5D5D
Tekst
#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
Otwórz praktykę →