Глава 19 · Правила игры
Столкновение с собой
Проверять нужно тело после хода, а не до — иначе легальный заезд в клетку освободившегося хвоста ошибочно засчитается столкновением.
Заезд в клетку хвоста — не всегда столкновение
Классическое правило «Змейки»: если змейка не растёт, хвост в этот же тик освобождает свою клетку — заехать туда головой законно. Если растёт — хвост никуда не девается, и та же самая клетка уже занята.
is_self_collision.py
def is_self_collision(new_head, body_after_move):
# body_after_move — тело ПОСЛЕ move_snake(), без самой головы
return new_head in body_after_move
Проверять нужно тело ПОСЛЕ движения, а не до
Если проверить
new_head in snake[1:] на СТАРОМ списке (до move_snake()), клетка старого хвоста всё ещё будет в списке — и легальный заезд в неё ошибочно посчитается столкновением. Правильная проверка идёт против move_snake(...)[1:] — тела, каким оно станет ПОСЛЕ хода, а не каким было до него.| Ситуация | is_self_collision() |
|---|---|
| Голова заезжает в клетку старого хвоста, змейка не растёт | False — хвост уже освободил клетку |
| Голова заезжает в клетку старого хвоста, змейка растёт | True — хвост никуда не делся |
| Голова заезжает в клетку середины тела | True — настоящее столкновение |
Практика: столкновение с собственным телом
Автоматическая проверка — функция is_self_collision(): заезд в клетку хвоста допустим, в середину тела — нет