Stany gry
Menu, rozgrywka, pauza i game over — to różne stany gry i kod musi wyraźnie wiedzieć, w którym z nich jest w danej chwili.
Już teraz Twoje projekty mają przynajmniej jeden niejawny stan — «gra trwa». W praktyce prawie każda gra przechodzi przez kilka wyraźnie rozróżnialnych stanów i w każdym z nich zachowuje się inaczej.
Państwo jako wyliczenie
Znany z rozdziału 19 sposób — przechowywać bieżący stan jako wartość
enum.Enum (Rozdział 18), nie jako kilku niezależnych Boolean
flagi takie jak na_pauze oraz igra_okonchena
oddzielnie. Enum nie może znajdować się w dwóch stanach jednocześnie —
u poszczególnych flag boolean taka pomyłka jest całkowicie możliwa przypadkowo:
from enum import Enum, auto
class SostoyanieIgry(Enum):
MENU = auto()
IGRA = auto()
PAUZA = auto()
GAME_OVER = auto()
tekushee_sostoyanie = SostoyanieIgry.MENU
Przejścia między stanami
Stany tej mini-gry tworzą nie linię prostą, lecz graf: z PAUZA
gra wraca z powrotem do IGRAi nie idzie dalej
do przodu, podobnie jak powrót z GAME_OVER w
MENU. Bezpieczniej jest narysować wyraźne lista dozwolone przejścia
Tabela „od → do”
| Spoza stanu | W stanie | Kiedy |
|---|---|---|
| MENU | IGRA | naciśnięto „Graj” |
| IGRA | PAUZA | nacisnął pauzę |
| IGRA | GAME_OVER | kolizja / porażka |
| PAUZA | IGRA | ponownie nacisnąć pauzę (odpauzować) |
| GAME_OVER | MENU | kliknął „Jeszcze raz” |
Ważne, że nie każdy ruch jest dozwolony: z MENU nie możesz
bezpośredni dostęp do GAME_OVER, omijając samą grę, i z
PAUZA nie można trafić do GAME_OVER
bezpośrednio — najpierw gra musi wrócić do IGRA. Kod, który
obsługuje wprowadzanie danych i aktualizacje, musi wcześniej wyraźnie sprawdzać aktualny stan
Wykonywanie czynności dozwolonych tylko w nim jest dokładnie takie samo jak w rozdziale 19
Potrzebne było oczyszczenie GameStatus dla węża.