Задание конкурса построено на базе материала первых 2-х уроков учебника (о координатах на плоскости можно дополнительно прочитать в разделе библиотеки «Координаты» урока 3).
Особенности первого конкурса
Когда присылать
Контрольный срок: 29 октября 2017 года, но работы на проверку принимаются и до этого срока.
Посмотрите на видео, как должна работать программа:
Шаблон алгоритма
Программист — человек способный наступить на грабли, даже если они спрятаны в сарай и заперты на замок. Размышлизм программиста СидороваУважаемые коллеги!
В этой публикации -- важные моменты зачётного конкурса "Белый Кролик", те, которые вызвали затруднения и те, которые, по мнению кураторов, должны быть в фокусе внимания педагога и ученика.
Алгоритм
О важности продумывания алгоритма перед кодированием было сказано в сообщении "[srobi:41] Зачем составлять алгоритмы".
Вероятно, никто не будет возражать, что надо учить детей сначала думать, потом делать.
Хороший способ "подумать" -- это записать (или нарисовать) алгоритм. То есть материальная фиксация дум. Можно возразить: зачем записывать алгоритм отдельно, если программа в Скретч собирается из "говорящих" блоков, фактически, она есть блок-схема, а, значит, сама программа есть алгоритм! Скретч специально придуман так, чтобы в нём можно было собирать алгоритмы которые работают как программы!
Да, действительно, Скретч был задуман как язык блок-схем, максимально приспособленный для новичка.
Но дело в том, что собирая код, мы невольно начинаем думать командами, которые даёт нам Скретч. В то время, как довольно часто (а чем дальше в нашем курсе, тем больше) мы должны при построении алгоритма подниматься над командами языка и думать категориями с ними напрямую не связанными.
Простой пример из Белого Кролика. Нужно провести исполнителя по равностороннему треугольнику. Начиная с ходу собирать код, ученик с большой вероятностью, поведёт исполнителя по вершинам, от первой ко второй, от второй к третьей, от третьей к первой, подбирая нужные направления сторон в паспорте исполнителя, поворачивая мышкой соответствующий рычаг (см. урок 2. Подробнее о паспорте исполнителя). Получится такой код:
Повернуть в направлении 120Идти 150 шаговПовернуть в направлении 0Идти 150 шаговПовернуть в направлении -120Идти 150 шаговЗаметив, что исполнитель перемещается по вершинам прыжками, ученик может использовать команду Плыть, подбирая координаты следующим образом: установить исполнителя мышкой в нужную вершину и перенести команду Плыть на программное поле -- в ней уже будут записаны нужные координаты. Получится примерно так:
Повернуть в направлении 120Плыть 1 секунду в x:129 y:-125Повернуть в направлении 0Плыть 1 секунду в x:129 y:33Повернуть в направлении -120Плыть 1 секунду в x:0 y:-50Всё это, конечно, забавно, но привязано только к среде Скретча, и мало что даёт ученику в алгоритмическом плане.
Если же предварительно ПОДУМАТЬ, то можно вспомнить геометрию (у равностороннего треугольника стороны и углы равны) и записать универсальный алгоритм прохождения равностороннего треугольника:
ПОВТОРИ 3{ Идти на величину стороны в текущем направлении Повернуться на 120 градусов против часовой стрелки }И потом уже собрать код (на Скретч или другом языке программирования).
Практическая важность алгоритма (и вторичность кода) будет хорошо прочувствована, начиная с урока 4 (задачи, разбираемые в уроке и проекты к уроку). И чем дальше, тем больше это будет ощущаться. Сложный проект без предварительной алгоритмизации не построить!
Об этом хорошо рассуждать, нам учителям. Но как "заставить" школьника, который не любит текст, не любит
абстракций, думать над алгоритмом перед кодированием и фиксировать его в виде отдельного документа?
Этот вопрос поднимается в сообщении "[srobi:43] Re: Зачем составлять алгоритмы".
Пожалуйста, подумайте над этим и поделитесь своими мыслями и, возможно, опытом на нашем курсовом списке рассылки.
Плавное движение
Как реализовать на сцене плавное движение персонажа?
Команды
"Идти ... шагов" "Перейти в x:... y:...""Изменить x на ...""Установить x в ...""Изменить y на ...""Установить y в ..."мгновенно перемещают спрайт в новое положение на сцене.
Чтобы переместить спрайт плавно, нужно выполнять перемещение дискретно, маленькими порциями, с небольшими задержками после каждой порции (как это делается в мультипликации).
В Скретч есть специальная команда
"Плыть ... секунд в x:... y:..." В ней реализовано такое дискретное движение на уровне алгоритма работы самой команды Плыть. Задержка между составными перемещениями вычисляются при выполнении команды так, чтобы общий сдвиг из текущей точки в конечную совершался за заданное в команде время.
Это удобная команда. Ирина Анатольевна Шелегова (команда 1521) написала:
ИШ> Очень жать, что нет команды "Плыть на заданное число шагов".
Согласны. Это упущение разработчиков языка. Команда "Плыть в" есть, (надо знать конечные координаты), а команды "Плыть на" (конечные координаты знать не надо) нет.
Команду "Плыть в" реально в Белом Кролике можно было использовать (без математических вычислений или пробных установок исполнителя) только при возврате в известную начальную точку (0, -50).
В других случаях разумнее дискретизировать движение, разбивая прыжок на цепочку маленьких перемещений, выполняемых в цикле.
После каждого маленького перемещения ставим небольшую задержку при помощи команды "Ждать ... секунд". Например, 150 шагов можно разбить на 30 прыжков по 5 шагов в одном прыжке с задержкой в 0.01 секунды:
ПОВТОРИ 30{ Идти 5 шагов // Мгновенный прыжок Ждать 0.01 секунд // Задержка}Но сами циклы в Скретч работают со специальной небольшой задержкой (которая подобна команде Ждать, то есть не зависит от скорости работы компьютера), поэтому дополнительно команду "Ждать ... секунд" внутри цикла можно и не использовать:
// Подбираем число оборотов цикла и величину перемещения// в теле цикла для необходимой визуальной плавности движения ПОВТОРИ 15 { Идти 10 шагов }Возврат в начальную точку
По ТЗ луч звезды Мурлыка должен проходить так:
Движение вперёд по лучу на L задаём командой "Идти ... шагов", помещённой в цикл для реализации плавности движения.
А как вернуться назад? И сохранить при этом направление?
Можно:
А можно проще, без всяких разворотов на 180 градусов:
Идти -L шагов То есть, учитываем, что команда "Идти на ОТРИЦАТЕЛЬНОЕ количество шагов" означает:
пятиться назад, сохраняя текущее направление.
Ещё вариант -- можно использовать команду "Плыть в", так как координаты начальной точки известны. По ТЗ это (0,-50).
Останов скриптов и алгоритм работы Зелёного флажка
Если в программе реализовано несколько переключаемых эпизодов, то в скрипте каждого эпизода необходимо остановить выполнение других эпизодов, иначе скрипты будут выполняться параллельно.
Чтобы этого не происходило, надо использовать команды
"Стоп другие скрипты спрайта" -- для спрайтов
"Стоп другие скрипты сцены" -- для сцены
Но нет надобности вставлять эти команды в скрипты зелёного флажка. Нажатие на зелёный флажок само останавливает скрипты всех спрайтов и сцены, если они в момент нажатия на флажок работали.
Цикл как тело другого цикла
Понятно, что код вроде:
ВСЕГДА { ПОВТОРИ 3 // Этот цикл является телом внешнего цикла { Пройти сторону Повернуться на 120 }}
можно упростить:
ВСЕГДА { Пройти сторону Повернуться на 120}С другой стороны, если имеется готовая процедура
ЭТО Треугольник ПОВТОРИ 3 { Пройти сторону Повернуться на 120 }КОНЕЦкоторая используется и в других скриптах спрайта, то вполне можно записывать
ВСЕГДА { Треугольник}несмотря на некоторое (весьма не существенное) замедление работы кода.
Установить в направлении
Речь о команде "Повернуть в направлении ..." Отмечаем, что русский вариант названия этой команды не
точно отражает оригинал на английском языке: point in direction — установить в направлении (а не «повернуть в направлении»). Лучше в алгоритмах записывать "установить в направлении" (или "встать в направлении"), чем «повернуть в направлении», ибо спрайт по этой команде не выполняет поворот, а именно устанавливается в заданном направлении (вне зависимости от текущего направления).
Выравнивание скриптов
Человек читает по-русски слева направо по строкам, а строки расположены сверху вниз. По этой привычке взгляд скользит из верхнего левого угла слева направо и сверху вниз, и не только по тексту книги, но и по тексту программы.
Значит, главный скрипт надо располагать в левом верхнем углу, а дальше располагать скрипты так, чтобы облегчить чтение программы слева направо и сверху вниз.
Как добиться выравнивания?
Сначала вручную располагаем скрипты в нужном порядке, потом смело нажимаем пункт "Очистить" в контекстном меню поля программ (щелчок правой кнопкой).
Название этого пункта (clean up) неверно переведено на русский язык. Правильный перевод: навести порядок.
Неплохой вариант расположения скриптов в Белом Кролике:
Ф 01 23Очистка от мусора
Мусор -- это незадействованные черновики кода на поле программы, с шапочками и без шапочек. Незадействованные в проекте спрайты, костюмы, фоны и звуки. Выполняем уборку перед тем, как демонстрировать проект миру. Не забываем, что весь этот мусор, кроме эстетического нестроения,
утяжеляет файл с программой.
Стиль вращения "кругом"
Некоторые участники ограничились тем, что использовали эту команду только в скрипте флажка, другие включили во все другие скрипты Мурлыки.
Кто прав?
По умолчанию каждый спрайт имеет стиль вращения "кругом". И казалось бы, можно не использовать эту команду вовсе. Но пользователь может переустановить стиль вращения в паспорте спрайта. Чтобы исключить влияние такого воздействия, разумно установить стиль вращения в начальном скрипте программы, то есть в скрипте зелёного флажка.
А если пользователь запустит программу не флажком, а нажатием на клавиши 0, 1, 2 или 3? В этом случае мы будем правы, если не будем гарантировать корректность работы программы (нарушено условие запуска), и будем правы, если предусмотрим реакцию на такое "не протокольное" действие пользователя. Последний вариант мне нравится больше, хотя в решении кураторов он не используется.
Реакция скрипта на "шапочное" событие во время его работы
В одной из присланных работ было два таких скрипта (среди прочих) для Мурлыки:
// Первый скриптКогда клавиша 1 нажата Стоп другие скрипты этого спрайта Подготовка ВСЕГДА { Идти по прямоугольнику }КОНЕЦ// Второй скриптКогда клавиша 1 нажата ВСЕГДА { Играть музыку }КОНЕЦНажимаем 1, и Мурлыка начинает бегать по прямоугольнику, но музыки нет. Но если 1 нажать ещё раз, музыка появляется, веселя бегуна.
Вопрос: почему так происходит?Давайте проанализируем работу кода.
Нажимаем 1 первый раз, оба скрипта начинают работу, но первый скрипт останавливает второй и музыки нет.
Нажимаем 1 второй раз, начинает работу второй скрипт, и мы слышим музыку. А почему первый скрипт не начал свою работу заново? Ведь событие (нажатие на 1) случилось?
Делаем вывод: скрипт во время своей работы (а он работает, ибо в нём бесконечный цикл) на своё "шапочное" событие не реагирует.
В программировании есть такой термин: "реентерабельность". Код называется реентерабельным, если его можно вызвать повторно до того, как он завершит свою работу.
Получается, что скрипты в Скретч не являются реентерабельными. Будем учитывать это при сборке программ в среде Скретч.
Интересные находки участников
1. Команда 1511 (Саночкина Мария Сергеевна) провела внутрикомандный конкурс по решению задач Белого кролика, ввела систему оценивания из 20-ти критериев, по которым были определены победители (3 работы, набравшие по 20 баллов). Таким образом было сформировано общее решение от команды на конкурс.Отличный способ вовлечения всей команды в конкурсную работу. Отличный способ вовлечения всех учеников в процесс оценивания решений.
2. Команда 1504 (Кутарева Анастасия Евгеньевна) использовала возможность Скретч по закреплению на сцене индикатора текущего направления спрайта. В группе Движение таких индикаторов три:
Чтобы индикаторы отображались на сцене, нужно пометить их флажками в СКИ исполнителя (и, при необходимости, перетащить на сцене в нужную позицию).
Заметим дополнительно, что щелчок на этих индикаторах в СКИ (вне зависимости от того, отмечены они флажками или нет) покажет разработчику текущие направление и координаты спрайта.
3. Команда 1504 (Кутарева Анастасия Евгеньевна) сделала плавным не только движение исполнителя, но и его повороты (выполняя поворот маленькими порциями в цикле).
4. Команда 1521 (Шелегова Ирина Анатольевна) в скриптах Мурлыки не использовала шапочки "Нажата клавиша ..." и "Нажат зелёный флажок", а вместо этого использовала шапочки с событиями: "Когда фон меняется на ...". Нормально, почему бы и нет!
Организационное замечание
Просьба ко всем руководителям команд: во время конкурсов внимательно следить за почтой и возможными уточнениями условий. Например, в Белом кролике был добавлен шаблон для алгоритмов, была сделана правка условия (размер треугольника).
Алгоритмическое замечание
Откликов на предложение обсудить способы составления алгоритмов до написания кода пока не поступило.
А ведь предложенный шаблон для алгоритмов Белого кролика -- один из таких приёмов. Будем считать, что кураторы ответили на свой же вопрос :) И продолжают ждать отклики участников по этой важной теме.
Последнее замечание
Большая просьба настроить свои почтовые среды (офлайн-программы или онлайн-почты) на МОНОШИРИННЫЙ ШРИФТ.
Так как в почтовых сообщения часто будут присутствовать фрагменты алгоритмов и псевдокода (как и в этом письме), то очень важно видеть правильное выравнивание и правильные отступы на такого рода фрагментах.
Вот как это делается в двух популярных онлайн-почтах:
Gmail/Настройки/Стиль текста по умолчанию/МоноширинныйЯндексПочта/Настройки/Прочие параметры/Моноширинный шрифтРаботаем дальше! Удачи!