Rozdział 19 · Model gry
Kierunek jako wektor
Kierunek to nie łańcuch znaków porównywany w if/elif, lecz dane: para liczb (dx, dy).
Od czterech if/elif do jednego słownika
Pierwszy prototyp definiował ruch głowy za pomocą czterech gałęzi if/elif
(Rozdział 19.4) — czytelna, ale gdy dodana jest nowa logika (na przykład ruch diagonalny w
inna gra) musiałaby powtórzyć strukturę. Wskazówki można przedstawić inaczej —
Jak to zrobić wektor przemieszczenia:
↑
UP
(0, +STEP)
↓
DOWN
(0, −STEP)
←
LEFT
(−STEP, 0)
→
RIGHT
(+STEP, 0)
direction_vectors.py
DIRECTION_VECTORS = {
Direction.UP: (0, STEP),
Direction.DOWN: (0, -STEP),
Direction.LEFT: (-STEP, 0),
Direction.RIGHT: (STEP, 0),
}
def next_head(head, direction):
dx, dy = DIRECTION_VECTORS[direction]
return (head[0] + dx, head[1] + dy)
if/elif kontra słownik wektorów
Jawnie, ale rośnie wraz z liczbą kierunków
if napravlenie == "up":
golova.sety(golova.ycor() + RAZMER_SHAGA)
elif napravlenie == "down":
golova.sety(golova.ycor() - RAZMER_SHAGA)
# ... I tak dla left, right
Jedna słownik, jedna formuła
dx, dy = DIRECTION_VECTORS[direction]
new_x, new_y = x + dx, y + dy
Co używać dzisiaj: Obie opcje dają taki sam wynik dla czterech kierunków. Różnica pojawia się w tym, jak kod rośnie: słownik — to dane, a nie rozgałęzienie, więc testowanie i rozwijanie jest łatwiejsze, bez zmieniania samej formuły ruchu.
Praktyka: kierunek jako wektor
Automatyczna kontrola — funkcja next_head() dla wszystkich czterech kierunków