Глава 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(): заезд в клетку хвоста допустим, в середину тела — нет
Открыть практику →