бражения хвоста таким образом, чтобы длина змеи не изменялась. Положение хвоста в программе задается значением переменной ktail. По прочтении содержимого ячейки ЗУ, в которую занесено изображение хвоста, ее содержимое стирается. Если код изображения был равен 220, то змея при прохождении этой точки не двигалась вверх. В этом случае проверяется содержимое ячейки с адресом на 160 больше текущего значения адреса хвоста. Если там содержится код 219, то змея двигалась вниз. Тогда текущий адрес хвоста увеличивается на 160 и в эту ячейку записывается код 220. Если же движения вниз не было, то проверяются ячейки слева и справа (адреса отличаются от текущего на -2 и +2 соответственно). При ненулевом содержимом их содержимое стирается, а текущий адрес изображения хвоста изменяется на -4 или +4 соответственно. Если же змея при прохождении этой точки двигалась вверх, то текущий адрес изображения хвоста уменьшается на 160 (и более ничего не нужно, так как в этом случае изображение хвоста уже стерто).

Как видите, усложнение алгоритма стирания изображения хвоста по сравнению с алгоритмом построения изображения головы связано с выяснением вопроса в каком направлении двигалась змея в момент прохождения той точки, в которой производится стирание изображения. Но это общая закономерность всех математических задач: решение обратной задачи всегда сложнее решения прямой задачи. Вспомните насколько вычитание сложнее сложения, деление — умножения, а извлечение корня и логарифмирование — возведения в степень.

К сожалению по причинам изложенным выше программа не так проста для чтения как предыдущие и более похожа на ассемблерную абракадабру. Необходимость привести подробное описание программы в этом занятии связана с тем, что разделить вопросы математического моделирования и программирования задачи в данном случае очень трудно. В связи с этой игрой стоит также остановиться еще на одном секрете программистской "кухни". При решении более или менее трудной задачи программист первоначально старается добиться правильного решения задачи, не особо заботясь о таких характеристиках программы как объем, быстродействие или читаемость. И только после того, как программа более или менее "задышала", начинается улучшение ее характеристик, в ходе которого зачастую сами собой выявляются такие ошибки, которые другими способами выявить и устранить было бы гораздо сложнее. Так например, совершенствуя описанную программу, удалось сократить ее объем по сравнению с первоначальным более чем на 30%, но что более важно, переход к логически завершенной структуре программы сделал понятным (даже автору!) ее функционирование и позволил включить ее в "Практикум по программированию".

Что касается советов играющему о способах достижения наивысших результатов, то при достаточно большой длине змеи стоит складывать ее в компактную гармошку, чтобы программа не смогла вставить "пищу" среди изгибов ее туловища.