|
ГусеницаОпишем проект, который может заинтересовать учителя, решившего познакомить учеников с использованием списков. Не будет утомительных расчетов, и все закончится созданием игр. Идея заключается в следующем. Черепашка движется по экрану небольшими шагами и оставляет отпечатки. Получается цепочка следов. Можно представить, что выползает гусеница (или змейка, или червячок — кому как угодно). Чем дальше идет черепашка, тем длиннее становится “гусеница”. В некоторый момент отпечатки в “хвосте” гусеницы начинают исчезать и гусеница продолжает движение, а ее длина остается неизменной. Такое движение в среде ЛогоМиры можно реализовать разными способами. Например, движется не одна черепашка, а целый “состав” из черепашек, все повторяют движение первой. Здесь описывается такой вариант, когда черепашка одна-единственная, а реализовать движение гусеницы удается благодаря списку. В этом списке хранится история перемещений черепашки. То есть результат достигается только средствами программирования на Лого, почти без привлечения многообразных дополнительных возможностей среды. Итак, подготавливаем несколько форм — разноцветных кружков (здесь это формы с номерами 13–16). Заливаем поле выбранным цветом (здесь оно бледно-серое, номер цвета — 1). Подготавливаем еще один кружок такого же цвета, как и цвет поля. Это “стерка для хвоста”. Пишем первую процедуру для получения одного отпечатка: это голова setsh 13 + random 4 rt -40 + random 80 fd 5 pd stamp pu end Форма случайная, выбирается из подготовленных (с 13-й по 16-ю). Направление перемещения случайное (поворот случайный, на угол от –40 до +40). это появление :n repeat :n [голова] end Эта процедура позволит посмотреть, все ли нас устраивает в предварительных действиях. А теперь создаем список, в котором будут последовательно сохраняться координаты всех отпечатков. Точнее сказать, координаты центров отпечатков. это появление :n make "L [] repeat :n [голова wait 1] end
это голова setsh 13 + random 4 rt -40 + random 80 fd 5 pd stamp pu make "L fput pos :L end В процедуре “появление” заводим
новую переменную с именем L, ее
начальное значение — пустой список. Обязательно попросите учеников посмотреть на этот список, вывести его, скажем, в поле команд (с помощью команды show :L). На экране появились, например, пять первых отпечатков, а значение списка видим такое: [-3,55936 23,384641] [-0,086069 19,787942] [0,523278 14,825211] [1,391519 9,901172] [0,609347 4,962731] Наша программа формирует список списков, поскольку операция pos возвращает список из двух чисел — абсциссы и ординаты центра формы черепашки. Теперь у нас есть информация о том, где находится хвост гусеницы, и мы можем написать процедуру для стирания на каждом шаге последнего, хвостового отпечатка. это хвост setsh 29 pu setpos last :L pd stamp make "L bl :L pu setpos first :L end Черепашка принимает форму “стерки для хвоста” (не забудьте, предварительно все рабочее поле надо залить таким же цветом, как цвет этой формы). Затем черепашка прыгает на последний отпечаток и “заштамповывает” его. Затем в списке координат удаляется последний элемент, этого отпечатка уже не существует на экране. Наконец, черепашка возвращается обратно, в голову гусеницы, на первый отпечаток. И получается такая программа для движения гусеницы: это движение голова wait 1 хвост движение end Все, основа для конструирования разнообразных вариантов с улучшениями готова: это гусеница cg setc 1 fill question [Сколько сегментов у гусеницы?] make "n answer появление :n движение end Первое, что можно сделать, — не разрешать гусенице уползать за границы рабочего поля. Для этого можно написать логическую функцию для выявления препятствия и усовершенствовать процедуру “голова”. это нет_препятствия op (and xcor < 300 xcor > -300 ycor < 200 ycor > -200) end
это голова setsh 13 + random 4 rt -40 + random 80 fd 5 if нет_препятствия [pd stamp pu make "L fput pos :L stop] bk 5 голова end Процедура “голова” стала рекурсивной. Если на очередном шаге, после перемещения, обнаружено препятствие, черепашка возвращается на исходную позицию, и процедура “голова” запускается заново. Поворот будет на другой угол, возможно, в другую сторону. Черепашка как бы осторожно ощупывает преграду и в конце концов отворачивает. Дальше можно запретить самопересечение. Еще можно изменить принцип движения: гусеница не сама выбирает направление, а управляется с клавиатуры. Вот уже и игра получается. Сценариев можно придумать много: например, цель игры — управляя гусеницей, собирать “клады”. Штрафы назначаются за соприкосновения с границами или с собственным хвостом. После съедания клада гусеница подрастает на несколько сегментов, и управлять ей становится все сложнее. Это далеко не все, что напридумывают ваши ученики. То есть мотивация работы над программой будет высокая. А основная польза для учителя информатики, как мне кажется, в том, что удается привнести необходимую наглядность, когда пришло время познакомить учеников со сложной, сухой, требующей абстрактного мышления темой — обработкой структур данных. Ал. Ге. Юдина |