Rozdział 19 · Zasady gry
Zderzenie z samym sobą
Musisz sprawdzić ciało po przeprowadzce, a nie przed nim – w przeciwnym razie legalne wejście do klatki pustego ogona zostanie błędnie uznane za kolizję.
Wjechnięcie w klatkę tylną nie zawsze kończy się kolizją
Klasyczna zasada „wężyk”: jeśli wąż nie rośnie, ogon w tym samym takcie zwalnia swoją komórkę — jazda tam głową jest legalna. Jeśli rośnie — ogon nigdzie się nie rusza, i ta sama komórka jest już zajęta.
is_self_collision.py
def is_self_collision(new_head, body_after_move):
# body_after_move — ciało PO move_snake(), bez samej głowy
return new_head in body_after_move
Musisz sprawdzić ciało PO ruchu, nie przed nim
Jeśli sprawdzisz
new_head in snake[1:] na liście OLD (do move_snake()), komórka starego ogona nadal będzie na liście — i legalny wjazd w nią błędnie zostanie policzony jako kolizja. Poprawne sprawdzenie odbywa się wobec move_snake(...)[1:] jest ciało takim, jakim stanie się PO tej turze, a nie taką, jaka była przed nim.| Sytuacja | is_self_collision() |
|---|---|
| Głowa wjeżdża do klatki starego ogona, wąż nie rośnie | False — ogon już zwolnił komórkę |
| Głowa wjeżdża w kratkę starego ogona, wąż rośnie | True — ogon nigdzie nie zniknął |
| Głowa wsuwa się do klatki na środku ciała | True prawdziwy konflikt |
Praktyka: Zderzenie z własnym ciałem
Automatyczna kontrola – funkcja is_self_collision(): wjeżdżania w klatkę tylną, powiedzmy, na środku kadłuba – nie