Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №14/2009


Только в номере
Лого-карнавал: опыт и плодотворные идеи

Гусеница

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

Идея заключается в следующем. Черепашка движется по экрану небольшими шагами и оставляет отпечатки. Получается цепочка следов. Можно представить, что выползает гусеница (или змейка, или червячок — кому как угодно). Чем дальше идет черепашка, тем длиннее становится “гусеница”. В некоторый момент отпечатки в “хвосте” гусеницы начинают исчезать и гусеница продолжает движение, а ее длина остается неизменной. Такое движение в среде ЛогоМиры можно реализовать разными способами. Например, движется не одна черепашка, а целый “состав” из черепашек, все повторяют движение первой.

Здесь описывается такой вариант, когда черепашка одна-единственная, а реализовать движение гусеницы удается благодаря списку. В этом списке хранится история перемещений черепашки. То есть результат достигается только средствами программирования на Лого, почти без привлечения многообразных дополнительных возможностей среды.

Итак, подготавливаем несколько форм — разно­цветных кружков (здесь это формы с номерами 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

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

Дальше можно запретить самопересечение. Еще можно изменить принцип движения: гусеница не сама выбирает направление, а управляется с клавиатуры. Вот уже и игра получается. Сценариев можно придумать много: например, цель игры — управляя гусеницей, собирать “клады”. Штрафы назначаются за соприкосновения с границами или с собственным хвостом. После съедания клада гусеница подрастает на несколько сегментов, и управлять ей становится все сложнее. Это далеко не все, что напридумывают ваши ученики. То есть мотивация работы над программой будет высокая.

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

Ал. Ге. Юдина

TopList