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.
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
Wyniki pierwszego prototypu
Czego nauczyliśmy się w pierwszych ośmiu sekcjach
screen.tracer(0)+ Manualscreen.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.