1.20M
Категория: ИнформатикаИнформатика

Проект «Улица»

1.

ТЕМА
ПРОЕКТ «УЛИЦА»

2.

В проекте «Кто быстрее»
- сценарий поведения у всех черепашек был одинаковый
- черепашки действовали независимо друг от друга
В проекте «Улица» также будет несколько исполнителей-черепашек.
Но, у каждой из них будет свой сценарий поведения.
Более того, в некоторых моментах один исполнитель должен будет
«следить» за тем, что делает другой исполнитель и соотносить свои
действия с его действиями.

3.

В целом картинка будет такая:
1) небо, зеленое поле (трава), автомобильная дорога
2) поперек дороги пешеходный переход (разметка-зебра)
3) вдали несколько небольших домиков и одно большое здание
4) от пешеходного перехода к зданию ведет отдельная дорожка
5) возле перехода – светофор, на котором по очереди зажигаются три
цвета: красный, желтый и зеленый. Красный свет горит дольше всего,
немного меньше горит зеленый и еще меньше – желтый. Свет
меняется постоянно.

4.

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

5.

7) Одновременно с машинами справа и слева нижнего зеленого
поля должны начать свое движение мальчик и девочка. Каждый
из них идет вперед, доходит до светофора, ждет, когда зажжется
зеленый свет, переходит на другую сторону улицы, подходит к
зданию, поднимается по его ступенькам и заходит внутрь.
При этом расстояния, которые должны пройти до светофора
мальчик и девочка разные, поэтому к пешеходному переходу они
будут проходить в разное время (это важно, в конце разберемся).

6.

I. СТАТИЧЕСКАЯ ЧАСТЬ

7.

Сначала нарисуем статическую часть нашей картинки.
Задание 1. Создадим основу улицы: вверху голубое
небо, ниже зеленое поле, далее светло-серая дорога
и внизу снова зеленое поле.

8.

Задание 2. Далее нарисуем разметку на дороге: белую
разделительную линию в середине дороги и полоски
перехода-зебры. Последние для большей
реалистичности нарисуем с небольшим смещением.

9.

Задание 3. Теперь расположим дома на верхнем
зеленом поле. В центре – большое офисное здание, а по
обе стороны от него по 3 малых деревянных домика.
Перенесем нужные домики к себе на лист форм.

10.

Малые домики:
рационально
ставить все 6,
Начиная справа
от офисного
здания, двигаясь в
правую сторону с
автоматическим
переходом на
левую сторону.
Удобно будет использовать команду штамп или stamp, которая
делает копию изображения черепашки
Пример:
setsh 1 pu //1 – это форма, например дом
repeat 6 [stamp fd 40]

11.

Задание 4. Расположим между домиками 5-6 деревьев,
а по обе стороны от здания – другие деревья; для этого
предварительно перенесем их на лист форм.

12.

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

13.

II. ДИНАМИЧЕСКАЯ ЧАСТЬ
Итак, статическую основу нашего проекта мы построили.
Теперь приступим к более сложной динамической части.
Задание 6. Нашим первым динамическим объектом
будет светофор, который мы поставим возле
пешеходного перехода.
Светофор должен будет работать как настоящий постоянно менять горящий свет.
Нам потребуется три формы светофора – с горящим
красным, желтым и зеленым светом.
Готовой картинки-формы светофора нет, поэтому
нарисуем его сами.

14.

Открываем пустую форму и рисуем светофор с
горящим красным цветом.
Например, такой:

15.

Далее копируем его в
две другие формы, но
меняем в них горящий
свет

16.

Светофор – это объект со своим персональным сценарием
действий. Для него потребуется отдельная черепашка.
Мы будем управлять поведением светофора, обращаясь к этой
черепашке и давая ей команды.
Создадим её командой newturtle "имя

17.

Светофор постоянно находится в каком-то из трех состояний,
которые последовательно сменяют друг друга:
1) горит красный свет
2) горит желтый свет
3) горит зелёный свет
forever [список команд]
всегда [список команд]
бесконечно повторяет
список команд
Процесс = [список команд] связанный с данной черепашкой,
исполняется параллельно с другими процессами в программе.
Он начинает исполняться по команде всегда [список команд] и
не останавливается до специальной отменяющей команды.
Параллельно с этим процессом могут исполняться другие
команды и процедуры для других черепашек.

18.

Про ПРОЦЕСС
Светофор постоянно находится в каком-то из трех состояний,
которые последовательно сменяют друг друга
ПОСТОЯННО – важное слово.
Оно про непрерывность и бесконечность сценария.
В своей программе мы написали список команд, которые
описывают последовательность действий светофора.
Программа начала исполняться
список команд начал исполняться. Это начало сценария.
Далее не предполагается, что в поведении светофора возникнет
остановка. Есть последовательность из 3х его состояний, они
последовательно сменяют друг друга.
И так до бесконечности…… пока работает наша программа

19.

Про ПРОЦЕСС
Смотрим еще раз на команду
forever [список команд]
всегда [список команд]
бесконечно повторяет
список команд
Когда при запуске программы начала исполняться команда
всегда [список команд], начал исполняться её [список команд].
Он выполнился один раз и далее продолжает исполняться в
бесконечном цикле.
Процесс – связанный с одной конкретной черепашкой
[список команд], который описывает ее сценарий поведения.
Он может быть конечным или бесконечным (когда список команд
исполняется в бесконечном цикле).
Он исполняется в программе параллельно с другими процессами
и не влияет на действия других черепашек

20.

Пример:
forever [fd 1] // активная черепашка всегда движется
на 1 шаг
ч2, всегда [вп 1 пр 2] // ч2 будет бесконечно
двигаться по кругу
Остановить такой бесконечный процесс можно либо:
1) через меню – кнопка «остановить»
2) комбинацией клавиш Ctrl+Break
3) командой отмени [список команд]
cancel [список команд]

21.

Команда
отмени [список команд]
cancel [список команд]
останавливает процесс, который был ранее запущен на
исполнение командой всегда [список команд]
forever [список команд]
(или другими командами, запускающими процесс. С ними мы
познакомимся далее)
То есть, команда отмени [команды], это не «сама по
себе»
независимая
команда,
а
парная
«останавливающая» команда для «запускающих»
команд.

22.

Про парные «запускающие» и «останавливающие» команды
как вот этот список команд
Допустим, в программе есть команда
forever [список команд]. Она запустила свой процесс.
Чтобы остановить именно этот процесс командой
cancel [список команд] надо быть внимательным.
Этот список команд должен быть
в ТОЧНОСТИ такой же
Действительно, ведь командами forever и cancel
мы управляем одним и тем же процессом.
Логично, что в скобках должны быть перечислены
СТРОГО одни и те же команды

23.

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

24.

Нам потребуется команда,
которая помещает
данную черепашку
поверх всех остальных черепашек:
infront
поверх_всех
Пример:
ч1, поверх_всех плавно 100 1
ask "ч2 [infront] glide 100 1
Создание новой черепашки с помощью команды нов_черепашка имеет
такой же эффект – новая черепашка оказывается самой верхней
Парная команда ставит
данную черепашку на задний фон
по сравнению со всеми
черепашками на экране.
inback
ниже_всех

25.

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

26.

По дороге будут ехать две машины: легковая и
автобус, а также идти два человека: мальчик и
девочка.
Понятно, что для каждого объекта нужна своя
черепашка. Для их создания используем команду
newturtle "имя.
Перенесем все необходимые формы на лист форм.

27.

Для движения каждого из объектов мы будем писать
свою процедуру.
Для расстановки всех объектов в их исходные
начальные положения напишем отдельную
процедуру с названием «все на старт» (например).

28.

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

29.

Задание 7. организуем движение легкового
автомобиля.
Он должен:
- доехать до светофора
- приостановиться
- проверить, какой горит свет
Если горит зеленый (зеленый - для пешехода,
следовательно, для водителя в этот момент горит красный),
то автомобиль должен остановиться и ждать до тех пор,
пока на светофоре не зажжется красный.
После этого автомобиль должен продолжить движение.
Доехав до правого края, автомобиль снова начинает
движение слева направо. Это как бы уже другой
автомобиль.

30.

Для реализации такого поведения нашего объектаавтомобиля нам понадобятся новые команды.
Waituntil [условие]
жди_пока [условие]
логический датчик (функция);
на выходе сообщает «да» или «нет»
Как это работает и вообще про функцию
обработка входных данных
данные на входе
функция
данные на выходе
жди_пока [условие]
Это входные данные для функции жди_пока

31.

Waituntil [условие]
жди_пока [условие]
логический датчик (функция);
на выходе сообщает «да» или «нет»
Как это работает
оценивает [условие] на истинность
[условие]
жди_пока
Зависит от
оценки
истина
ложь
Значение
Результата
Входные данные у этой функции – это [условие]
Обработка входных данных этой функцией
– это оценка истинности [условия]
Выходные данные:
- если условие истинно, у функция на выходе истина
- если условие ложно, у функции на выходе ложь

32.

Waituntil [условие]
жди_пока [условие]
логический датчик (функция);
на выходе сообщает «да» или «нет»
Как это работает и что такое логический датчик
оценивает [условие] на истинность
[условие]
жди_пока
истина
ложь
ЛОГИЧЕСКИЙ = на выходе у функции значение логического типа
логический тип данных - параметр может иметь только два значения:
либо истина (ДА), либо ложь (НЕТ)
Функция жди_пока принимает на анализ [условие] и в зависимости от
результата обработки [условия] сама принимает одно из двух значений
ДАТЧИК – дает ответ.
В Лого это такая функция, которой можно «задать вопрос»
и получить ответ «истина» или «ложь»

33.

Waituntil [условие]
жди_пока [условие]
логический датчик (функция);
на выходе сообщает «да» или «нет»
В программе эта функция выполняет роль «крана/вентиля» .
Пока [условие] ложно, «вентиль» закрыт, исполнение
программы или процедуры останавливается на этой команде.
Представим, что исполняется такой фрагмент программы (или
процедуры); сейчас [условие] ложно:
предыдущая команда // выполнилась
waitunlil [условие]
// если условие ложно здесь стоп
следующая команда // не выполняется

34.

Если [условие] истинно:
предыдущая команда // выполнилась
waitunlil [условие]
// если условие истинно
следующая команда
// выполняется
Пример:
Пусть черепашка с именем ч1 движется по направлению к
красному пятну на листе - это препятствие , которое надо
обойти
это препятствие
ч1, всегда [вп 1]
жди_пока [цп = 15]
пр 180

35.

Про датчик, из электроники
Обработка входного сигнала
входной
сигнал
датчик
выходной
сигнал
То, с чем вы точно имели дело – это датчик движения, связанный с
автоматическими дверями.
Когда вы двигаетесь в «его поле зрения», он передает устройству,
открывающему двери, свой «разрешающий» выходной сигнал, по
которому они открываются.
Если движения нет, «разрешающий» сигнал не передается, дверь закрыта.
Относительно дверей датчик движения также выполняет функцию
«крана/вентиля». Его смысл в связке датчик-дверь – давать ответ ДА или
НЕТ на вопрос: «надо ли сейчас открыть дверь?»
«вентиль» закрыт – дверь закрыта
«вентиль» открыт – дверь открыта

36.

Логический датчик, Лого
условие
результат
датчик
Логический датчик – обрабатывает «логический сигнал»
Значение «логического сигнала» здесь это оценка истинности условия:
истина или ложь
вход
выход
1 (истина)
1 (открылся)
0 (ложь)
0 (закрылся)
На входной сигнал = истина
логический датчик «открывает вентиль»
= позволяет следующим после него командам исполняться.
Все команды программы последовательно исполняются, нет остановки.
На входной сигнал = ложь
логический датчик «закрывает вентиль»
= останавливает исполнение следующих после него команд.
Это остановка в исполнении программы или процедуры.

37.

Еще две нужные команды
Xcor
х_коор
сокращение от «Х-координата»
cообщает х-координату активной черепашки (число)
Ycor
y_коор
сокращение от «Y-координата»
cообщает y-координату активной черепашки (число)
Использование в программе:
Присвоим значение переменной:
make ’’ a Xcor
В результате значение переменной а будет равно координате
активной черепашки по оси Х.

38.

Для активной черепашки:
кроме экранных координат можно узнать, в какую форму она
сейчас одета. Функция Shape возвращает номер формы
активной черепашки (это число)
узнает номер формы
имя активной
черепашки
передается
неявно
номер формы
shape
это число
Пример использования:
Make ”a shape
В [условии]
[shape = 3] истина, если активная черепашка в данный
момент в форме номер 3

39.

Теперь мы готовы написать процедуру движения
автомобиля:
7.1 для движения до светофора используем команду
forever [команды]
всегда [команды]
7.2 для остановки у светофора команду
waituntil [условие]
жди_пока [условие]
Условием будет достижение автомобилем координаты по
оси х возле пешеходного перехода.
При выполнении условия отменим команду всегда с
помощью команды cancel [команды]
отмени [команды]

40.

7.3 подъехав к пешеходному переходу, ожидаем, когда на
светофоре загорится красный свет с помощью той же
команды жди_пока [условие].
Условием будет принятие черепашкой ч2 (черепашкасветофор) формы, соответствующей красному сигналу
светофора.
После этого машина должна продолжить свое движение и
доехать до правого края экрана.
Далее автомобиль должен снова появиться слева и весь
процесс движения должен начаться сначала.
Для этого в конце процедуры движения автомобиля
добавим рекурсивный вызов.

41.

Задание 8. Напишем процедуру движения автобуса,
аналогичную процедуре движения автомобиля.
Пока работаем с ней, используем статичный фон
(запускаем последовательно все процедуры, которые
его отрисовывают), а процедуру движения
автомобиля не запускаем.

42.

Задание 9. Далее нам нужно, чтобы
автомобиль и автобус поехали одновременно.
Launch [список команд]
запусти [список команд]
Команда Launch/запусти позволяет запускать процесс,
описанный в квадратных скобках [списком команд],
параллельно с другими процессами.
Наша команда, запускающая одновременно оба движения:
Launch [car] // здесь car – процедура движения автомобиля
car 2
// car 2 – процедура движения автобуса
Если требуется остановить процесс, запущенный
командой Launch [....], используем команду cancel [….].

43.

Задание 10. Теперь организуем движение мальчика.
Временно не запускаем процедуры движения
автомобиля и автобуса.
Сценарий движения мальчика:
1. он должен идти с правой стороны
2. дойти до светофора, остановиться
3. дождаться, пока загорится зеленый свет
4. перейти улицу
5. потом подойти к зданию по дорожке
6. подняться по ступенькам
7. зайти в здание

44.

Движение мальчика складывается из 4х частей:
1. движение до светофора и ожидание зеленого света
2. движение через дорогу
3. движение к зданию
4. движение по лестнице и вход в здание
При этом, все время пока мальчик движется, он будет
делать шаги
Напишем отдельную процедуру для его шага, где
входной параметр – величина шага.
Параметр «величина шага» позволит нам регулировать
скорость хода мальчика.

45.

10.1 Движение до светофора и ожидание зеленого
цвета организуется аналогично движению машины
или автобуса. Величина одного шага = 2.

46.

10.2 При переходе мальчика через дорогу, машины
могут начать своё движение еще до того момента,
когда он полностью ее пересечет.
При этом мальчик должен находиться за ними. Значит,
нам надо использовать команду inback (ниже_всех).

47.

10.2 Для организации перехода через дорогу возможны
разные варианты, например:
1. с помощью команды Repeat (повтори)
2. командой forever (всегда), Waituntil (жди_пока)
и Cancel (отмени)

48.

10.3 Движение к зданию организуем с помощью команды
repeat
Для создания большей реалистичности движения вглубь
картинки, размер формы (изображение мальчика) будем
уменьшать. Для этого заведем переменную «размер формы». В
начале процедуры зададим ей начальное значение, далее в
цикле будем эту величину постоянно уменьшать.
Величина шага при движении через дорогу = 1.

49.

10.4 Подъем по лестнице организуем аналогично, только
коэффициент уменьшения формы должен быть меньше. По
достижении верхней ступеньки, после небольшой паузы,
удаляем форму мальчика, создавая иллюзию, что он вошел в
здание.

50.

Задание 11. Аналогично организуем движение девочки, но
идти она должна слева направо, навстречу мальчику.

51.

Задание 12. Организуем общую запускающую
программу с одновременным движением всех
объектов.
В ней:
- сначала запускаем отрисовку всей статической
картинки
- потом
расставляем
объекты
в
исходные
положения.
Для
организации
одновременного
движения
используем команду Launch (запусти), запуская
параллельно процедуры движения автомобиля,
автобуса, девочки и мальчика.

52.

Проблема:
Если один из параллельных процессов, которые
есть в нашей программе, закончится раньше других,
могут возникнуть неожиданные и не нужные нам эффекты.
Сценарии поведения светофора и машин бесконечные.
У сценариев движения мальчика и девочки есть конец
– человек зашел в здание.
Расстояние, которое пройдет мальчик немного меньше, чем
то, что пройдет девочка.
Поэтому мальчик может зайти в здание раньше девочки.
В этом случае процесс, связанный с ним, закончится раньше.
Для правильной согласованной работы программы
необходимо, чтобы процедура движения мальчика
завершилась одновременно с процедурой движения девочки

53.

Задача, которую нам надо решить:
если мальчик завершил движение, а девочка еще нет,
мальчик должен «постоять на паузе», подождать девочку.
То есть, его процедура движения должна «прирасти» еще
одним логическим блоком – ожиданием завершения
процедуры движения девочки.
Нам надо, чтобы процессы закончились синхронно
Мы знаем команду жди_пока [условие]
Будем использовать ее в процедуре движения мальчика
для реализации его «ожидания».
Вопрос: каким должно быть [условие]?
Ответ: жди_пока [процедура движения девочки остановится]
Условие истинно?
– можно завершить процедуру движения мальчика.

54.

Будем использовать вот такую функцию (логический датчик)
done? [команды]
готово? [команды ]
это функция; результат ее
исполнения истина / ложь
Если процесс, описанный списком команд в квадратных скобках,
завершился, результат исполнения функции = истина
Если не завершился, результат работы функции = ложь
Анализ: процесс завершился?
истина
[список команд]
Done?
Вход (процесс завершился?)
выход
1 (истина)
1 (истина)
0 (ложь)
0 (ложь)
ложь

55.

done? [команды]
готово? [команды ]
это функция; результат ее
исполнения истина / ложь
Чтобы мы могли использовать функцию готово?
процесс, описанный
[списком команд в квадратных скобках] = [команды]
должен существовать в программе.
Это значит, что процесс, про который мы спрашиваем
готово? должен быть ПРЕДВАРИТЕЛЬНО ЗАПУЩЕН
«запускающими» командами
launch / запусти или forever /всегда

56.

Еще раз в обратную сторону:
1. Есть черепашка.
2. С ней связан процесс = ее сценарий поведения =
набор команд
3. Её процесс запущен на исполнение командой
Launch [команды] или командой forever [команды]
4. В этом случае мы можем спросить:
процесс, связанный с этой черепашкой завершился?
используя в программе функцию
done? [команды, описывающие сценарий поведения
черепашки]
И получить ответ: ДА = истина или НЕТ = ложь

57.

Мы можем использовать функцию
done? [команды]
В качестве условия внутри команды жди_пока [условие]
Получим:
waituntil [done? [ команды]]
Пояснения:
Квадрат и круг - это процедуры.
Есть две черепашки с именами ч1 и ч2.
Пример:
to круг_и_кв
ч1, launch [круг]
В процедуре круг_и_квадрат
ч2, launch [квадрат]
ч1 рисует круг, а ч2 - квадрат.
Waituntil [done?[круг]]
Круг рисуется дольше, но система
Waituntil [done?[квадрат]]
ч1, rt random 360 fd random 50 подождет, пока обе фигуры не будут
закончены и только после этого
ч2, rt random 360 fd random 50
черепашки переместятся в другое
круг_и_кв
место и снова начнут рисовать круг и
end
квадрат.
(См. код в заметках к слайду)

58.

Возвращаемся к нашей задаче.
Вот эта длинная команда решает нашу задачу
синхронизации двух событий.
waituntil [done? [ движение_девочки]]
жди_пока [готово? [движение_девочки]]
Первое событие: окончание процесса, связанного с девочкой.
Второе событие: окончание процесса, связанного с мальчиком.
Заметьте, что потенциально наоборот, девочка может
закончить свое движение раньше мальчика.
Если, например, ее движение будет быстрее за счет
размера шага

59.

В конце программы
нужно удалить все неудаленные (в соответствующих
процедурах) черепашки командой удали и закончить
все процедуры командой stopall или останов.
Команда останов
/ stopall останавливает все
работающие в процедуры и процессы.
Если останов вызывается из процедуры, то она
останавливает не только ту процедуру, в которой
написана, но и все прочие работающие процедуры.

60.

Предложения по развитию проекта:
- Можно добавить еще один светофор на другой
стороне перехода, движение машин во встречном
направлении, движение человека вдоль
противоположной стороны дороги, переход его на эту
сторону и движение уже по этой стороне к краю
листа.
- Можно добавить человека выходящего из здания и
идущего по переходу на эту сторону дороги и далее
вдоль неё.
- Можно добавить своих персонажей.
- и так далее….

61.

КОМАНДЫ
FOREVER [список команд] / ВСЕГДА [список команд]
CANCEL [список команд] / ОТМЕНА [список команд]
Infront, Inback
WAITUNTIL [условие] / ЖДИ_ПОКА [условие]
Xcor, Ycor
SHAPE
LAUNCH [список команд] / ЗАПУСТИ [список команд]
DONE?[команды] / ГОТОВО?[команды ]
English     Русский Правила