Rozdział 19 · Projekt: „Wąż”

Pełny kod pierwszego prototypu

Złożenie wszystkich części w jedną pętlę gry — i przejście od szczerego prototypu do dokładnej analizy tego, jak gra naprawdę działa.

Zbieraj jeden krok gry ze wszystkich części rozdziału – ta cecha jest sercem gry, Powtarzane wielokrotnie, aż gra się zakończy:

igrovoj_shag.py
import time

ZADERZHKA_SEK = 0.12   #pause między krokami

def igrovoj_shag():
    if igra_okonchena:
        return False

    dvigat_telo()
    dvigat_golovu()
    proverit_edu()
    proverit_stolknoveniya()
    screen.update()
    return not igra_okonchena

def glavnyj_cikl():
    global napravlenie
    napravlenie = "right"
    while igrovoj_shag():
        screen.update()
        time.sleep(ZADERZHKA_SEK)
    tablo.goto(0, 0)
    tablo.write(f"Koniec gry! Wynik: {schet}", align="center", font=("Arial", 20, "bold"))
Bez time.sleep() gra kończyłaby się, zanim zdążyłeś nacisnąć klawisz
Cykl while obraca się z prędkością Python, a nie ludzką: od środka do ściany tylko 14 kroków i bez pauzy przechodzą w około dwie tysięczne sekundy — okno zdążyłoby tylko mrugnąć napisem „Koniec gry! Wynik: 0”. time.sleep(0.12) wyznacza ludzkie tempo: około ośmiu kroków na sekundę. Tutaj sleep() jest uzasadniony właśnie dlatego, że pętla i tak jest blokująca — dopóki działa, w programie i tak nic innego się nie dzieje, a screen.update() na końcu każdego kroku udaje się uporządkować zgromadzone naciśnięcia klawiszy. W architekturze, screen.ontimer() (sekcja 19.13) ten sam sleep() już będzie błędem – Debug Lab 4 w sekcji 19.31 wyjaśnia dlaczego.
Real Window: Zmontowana gra – Ocena 30, Wąż z Trzech Segmentów, Jabłko na polu
Prawdziwe okno pierwszego prototypu: wszyscy razem – ruch, jedzenie, liczenie.

Kompletny, już złożony i przetestowany program pierwszego prototypu jest dostępny jako osobny plik:

projects/turtle/snake/snake_basic.py

Uruchom grę u siebie
python snake_basic.py w terminalu — sterowanie klawiszami strzałek.
Szczera, ale nie ostateczna wersja
Zbudowaliśmy prawdziwą działającą grę — z ruchem, jedzeniem, wynikiem i kolizjami. Ale while igrovoj_shag(): ... jest pętlą blokującą z stałym opóźnieniem: prędkości nie można zmieniać podczas gry, a pauza i restart musiałyby być wplecione bezpośrednio w ciało pętli. Cały stan znajduje się w globalnych zmiennych modułu. Zaczynając od następnej sekcji, rozdział przygląda się grze bliżej: czym jest siatka i odtyk gry, jak zorganizować pauzę i restart bez drugiego równoległego łańcucha timerów oraz jak rozwinąć architekturę poziomu na podstawie tego prototypu SnakeApp (Rozdział 19.32).
Challenge
Poziomy trudności

Dodaj wybór trudności przed grą (input() z rozdziału 8) – który wpływa na początkową szybkość przez opóźnienie między krokami.

Praktyka: Kompletna gra
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →

Wyniki pierwszego prototypu

Czego nauczyliśmy się w pierwszych ośmiu sekcjach

  • screen.tracer(0) + Manual screen.update() — standardowy trik dla płynnej animacji w grach na Turtle.
  • screen.onkeypress() łączy strzałki z funkcjami kierunkowymi; Zakaz zawracania o 180° zapobiega natychmiastowej kolizji samobójczej.
  • Ciało węża — lista poszczególnych segmentów, z których każdy podąża za poprzednim; kolejność aktualizacji (najpierw ciało, potem głowa) jest krytycznie ważna.
  • .distance() między dwoma żółwiami to wygodny sposób, by sprawdzić, czy są „wystarczająco blisko”
  • Pętla gry to funkcja wywoływana wielokrotnie, aż do osiągnięcia warunku końcowego gry.
  • To dopiero pierwszy prototyp – potem rozdział analizuje siatkę, odznaczenie, stan i architekturę znacznie dokładniej.