Scratch для «продвинутых»

Scratch — это визуально-ориентированный язык программирования для детей. Существует мнение, что это детский язык для того, чтобы просто поиграть «в программирование» и ничего путного (серьезного) из него сделать не получится. Когда я только начал вести занятия для детей на Scratch, мне как человеку с двумя высшими техническими образованиями, казалось также. Однако спустя время мне пришлось поменять свое мнение. Оказалось, что даже в этом детском языке программирования скрыты фишки, которые могут быть серьезно использованы даже при обучении профессиональному программированию. Хочу поделиться с вами моими открытиями.

Клонирование и переменные в Scratch


Моему ученику нравилась игра — «Зомби против растений». И ему было интересно самому запрограммировать её. Давайте вспомним как данная игра работает? С правой стороны у нас есть шеренга растений, которая расстреливает приближающихся зомби.

Есть множество решений данной задачи, но на мой взгляд более элегантное решение — задействовать минимально возможное количество спрайтов, т.е. использовать клонирование.

Как сделать так, чтобы у каждого отдельного клона был собственный уровень жизни? Что выбрать переменные или списки? Сделали попытку использовать списки, но после более детальной проработки поняли, что данная структура данных не помогает решить проблему. У переменных и списков, в Scratch есть 2 типа видимости для каждого типа данных — это «для всех спрайтов» или «только для этого спрайта». Пришлось проверять область видимости. Начали мы с переменных.

Дойдя до рабочего варианта переменной с областью видимостью «только для этого спрайта». В классических языках программирования такой тип видимости называют — локальным или приватным в зависимости от контекста.

Созадние переменной Жизнь в Scratch


Оказывается, что если эта переменная с данной областью видимости используется в клоне, то в клоне создается экземпляр переменной, принадлежащий конкретному клону и который используется для внутренних вычислений/работы клона. В нашем случае, у каждого клона есть своя «жизнь». Если стало интересно, то советую обратиться к справочнику. А вот картинка, которая показывает, как спрайты или клоны работают с переменными разных типов видимости.

Области видимости переменных и списков в Scratch. И их границы
Переменная с областью видимости «для всех спрайтов» (рисунок слева) — одна на всех. Кстати, здесь вы можете с детьми посмотреть работу с критическими секциями и что такое гонка за ресурс. А если область видимости переменной — «только для этого спрайта», то у спрайта и у его клонов появляется собственная переменная с тем же именем, с которой они работают (рисунок с права). И клоны не имеют доступа к переменной оригинала и переменной другого клона.
Это стало неожиданным и приятным открытием свойств Scratch для создания подобных алгоритмов.

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

Имена объектов как их идентификаторы


ВАЖНО: все переменные с зоной видимостью «только для этого спрайта».

Данный инструмент для меня стал совсем неожиданным. Давайте начнем с истории о том, как мы с учеником наткнулись на данную особенность языка. Мой ученик решил, создать игру с «искусственным интеллектом». Игра представляет звездные войны на космических кораблях и у игрока есть возможность управлять одним кораблем, в то время как противники гоняются за вами и за друг другом. Чтобы они могли преследовать вас или друг друга, им нужно как-то принимать решение о том, кого преследовать. Данную задачу можно решить в лоб и задать очередность преследования кораблей, но игра потеряет свою интеллектуальность и быстро наскучит. Поэтому ученик решил настроить интеллект таким образом, чтобы корабли с интеллектом преследовали ближайшего противника. Давайте посмотрим, как он начал решать данную задачу.

Решение влоб для переключения между спрайтами по минимальному расстоянию

На мой взгляд хорошее решение для создания быстрого прототипа. Но какие ограничения здесь есть? Первое, усложнение кода по мере добавления новых кораблей. Следовательно, сложность кода повышается и не исключены мутации кода из-за усложнения. Время поиска ошибки и отладки алгоритма будет расти. И конечно, никто не отменял такую прикольную метрику, как старение кода (advance level SW Development). Что же делать? А делать необходимо следующее, нужно сделать обобщеный алгоритм, который будет динамично приспосабливаться к увеличению или уменьшению количества кораблей.

Для данного алгоритма нам и понадобиться свойство языка — имя как идентификатор объекта. Пришло время больших изменений и здесь вы, как учитель, можете рассказать про такое явление как рефакторинг. Это последовательное изменение кода, улучшение его структуры и его оптимизация. А главное, чтобы каждое изменение не ломало работу программы, и объем изменений тоже должен очень аккуратно подобран. Слишком много изменений — плохо, слишком мало — долго. Сформированный навык рефакторинга даст преимущество и эффективность работы программиста. Но для формирования навыка нужно работать головой, а не просто тыкаться. У меня получилось сделать 4 изменения в первоначальной программе и результат не изменился.

Пробуем решение изменить и использовать поворот в направлении к объекту по имени

Заметьте, что я еще не удалил блоки, а оставил их. Зачем? Потому, что если что-то пойдет не так, мы можем вернуть предыдущий вариант, начав все заново. Но как только я проверю правильность выполнения обновленного скрипта, я сразу же их удалю, чтобы не отвлекаться на них в последующем.

Заметили? Сейчас в блоке «повернуться к …» стоит переменная и эта штука работает. Т.е. мы минимальными усилиями проверили, что данный подход работает. Это просто круто. Теперь мы можем начать писать алгоритмы, которые позволят определять объект преследования ближайшего корабля.

Что нам пригодится? Это из структур данных — это переменные и списки. Из алгоритмов — это нахождение минимального числа (расстояния) в списке. Еще нам необходим алгоритм, который определит имя объекта для преследования по минимальному расстоянию.

Сейчас будет написано много кода. Но для того, чтобы потом не захлебнуться и не запутаться в куче скриптов, нам необходимо использовать еще одну классную функцию, а именно создание собственных блоков. Эта функция очень мощная, но ее редко используют школьники, да и некоторые программисты, а ведь она позволяет создать понятный с первого прочтения алгоритм программы. Кстати, можете почитать про приемы создания понятного кода в книге Мартина Фаулера «Рефакторинг. Улучшение существующего кода»

Как и перед любым масштабным строительством нам необходимо все спланировать. Давайте спланируем в каком порядке будем разрабатывать блоки:

  1. Список имен всех кораблей,
  2. Расчет расстояние до всех кораблей,
  3. Поиск минимального расстояния,
  4. Поиск имени корабля для преследования по найденному минимальному расстоянию.

Главное правило — каждый созданный «кусок» и изменение должны быть проверены.

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

Измененные названия спрайтов

И теперь мы готовы описать 1 часть программы. Все пишем для 1-ого корабля. Запускаем отдельно данный скрипт и смотрим результат. Поехали!

Новый блок: заполнить список имен кораблей

Если мы добавим новый корабль, нам нужно изменить в данном алгоритме лишь одну циферку. Клево? Клево!

Погнали дальше. А давайте научим его 2 алгоритму. Смотрим, что получилось. Это сразу конечный результат со вспомогательными функциями.

Новый блок: Заполняем список расстояний

Ура! Работает. Проверить это можно следующим образом, должен быть обязательно 0 одним из значений в списке расстояний. Если у вас это не так, ищите ошибку.

Едем дальше! Поиск минимального расстояния. Заметили, что расстояние всегда положительно. И всегда будет минимальное число — 0. Ай-я-яй! Вывод — искать минимум, но не ноль. Можете попробовать свои силы и оптимизировать код самостоятельно, чтобы не делать расчет расстояния от корабля 1 до корабля 1 (это не опечатка).

Найти минимальное значение, но не ноль

Обучаем спрайт новой функции и получаем.

Новый блок: Найти имя корабля по расстоянию

Не забываем проверять! Для этого можно даже остановить игру и запустить отдельный скрипт.

Мы написали все, что необходимо, теперь главное правильно использовать данные функции.

Собранный алгоритм для определения ближайшего корабля

Если у вас все работает правильно, то вы должны увидеть следующее:



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

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

Подводим итоги



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

Это лишь малая часть инструментария программиста, но она являет очень важной. А в Scratch это объяснить становится чуточку легче.
Поделиться публикацией
Комментарии 19
    0
    Автору спасибо от меня и от ребенка. Пишите, пожалуйста, еще.
      0
      Если можно, то было бы здорово картинки перезалить, чтобы удобнее было в динамике процесс разработки увидеть.
        0
        Добрый день gotch. Могу спросить, какие сложности вы увидели в картинках и в каком виде было бы для вас удобно их просматривать?
          0
          На общих скринах со Scratch не разобрать текст.

          По статье — автору спасибо. Сам пользуюсь Scratch для обучения племянника. Лучшего инструмента для обучения детей до 14 лет нет. ИМХО
            +2
            Light Bot — https://lightbot.com/
              0
              За LightBot голосую всеми конечностями!
              По теме статьи — при чуть боле сложном алгоритме мозг взрывается — необходимо думать об алгоритме и этих графических блоках.
              Ребенок может от такого и потерять интерес к программированию вообще.

              Быть может сразу приучать к тексту?
                0
                Алгоритмы сложные и в названии показано, что это не для начинающих в Scratch.

                Кстати, по поводу думания о графических блоках — дело привычки. У нас в обычных текстовых средах также много символов, на которые мы можем отвлекать, но мы можем же это убрать подальше ;)

                Вы знаете, что большинство людей «визуалы» и нам интересно видеть, как алгоритм работает, двигает картинки, делает красивые штуки. А самое важное, что это быстро получается и видно результат каждого добавления блоков/команд. В то время для текстовых языков необходимо сначала освоить клавиатуру.

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

                Как я писал в другом комментарии, вы можете комбинировать языки программирования для того, чтобы быстрее достичь ваших целей обучения.
                0
                А проект живой? ссылка на windows версию выдает 'The product you're looking for isn't here anymore'
                  0
                  Печально.
                  На вебе есть флэшь версия (урезанная?) https://lightbot.com/hocflash.html
                    0
                    флэш немного не то… мне нужен как минимум standalone/portable. Попробую сграбить lightbot-hoc2015.swf — я так понял там не урезанная версия
        0
        По-моему, гораздо хуже и менее понятно для ребёнка, чем просто дать ему C++.
          0
          Вы про Scratch или LightBot?
          А опишите свой опыт обучения детей С языку.
            0
            Опыта обучения своих детей у меня ещё нет, но у меня есть опыт обучения меня в детстве и если бы я начинал не с классического C/C++, а с этой наркомании, то вряд ли я когда-либо стал бы программистом. Секрета, в принципе, никакого нет, просто начинайте от простого и идите к более сложному.
              +1
              А со скольки лет начали заниматься программированием?

              Давайте отталкиваться от того, что сейчас другие реалии и современные дети видят мир совершенно по другому. А также в развитии ребенка нужно исходить из его возраста и предпочтений. Плюс необходимо абстрагироваться от собственного мнения и давать ребенку, что ему интересно, а не зомбировать технологией. Вы можете комбинировать инструменты для достижения целей обучения. Например, С/С++ хорош для определенного круга задач, мы же не будем использовать молоток, чтобы вкрутить шуруп.

              Да, кстати, сейчас есть блочные языки программирования для разработки ПО сложного профессионального оборудования.
                0
                В 9 классе, то есть с 15 лет. Меня никто не зомбировал, наоборот, мои родители было даже чересчур пассивны в этом плане. Захотелось заняться программированием, потому хотелось быть более, чем просто продвинутым пользователем Windows. Изначально я даже не представлял, что это когда-либо станет моей работой. Тогда же знакомый из локальной городской сети подкинул мне скачанный из на тот момент ещё дорогого интернета линукс, в который я навсегда влюбился. Опять же, чел просто создал тему на локальном форуме, мол, если кому надо, подходите с болванкой, запишу. Меня никто не заставлял.

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

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

                Я смотрю на этот Scratch и у меня он вызывает неприязнь. Мне было бы неприятно и скучно им заниматься, как ребёнку. А, перефразировав классика, для детей нужно делать как взрослых, только лучше. В 16 лет C/C++ меня поразил и запал в душу. Scratch на это не способен. Он не только не вдохновляет, но даже не развлекает. Похоже скорее на скучную игру.

                Чтобы из ребёнка вырос программист, купите ему сборник книг Булычева, Азимова, Лема, Брэдбери. Железные конструкторы, шкаф шурупов, дощечек, проводов, батареек, моторчиков и переключателей. Квесты и различные познавательные игры на английском. Скачивайте или покупайте ему хорошие, фильмы, которые заставляют задумываться. Запишите его в шахматный клуб, если они до сих пор существуют. Ну или на карате. Тяжёлые, долгие многочасовые тренировки на выносливость, концентрацию и результат очень пригодятся потом в длительных и утомительных часах отладки.

                Вот тогда очень вероятно, что ваш ребёнок в подростковом возрасте действительно станет интересоваться программированием и преуспеет в нём. Если до этого мурыжить ребёнка вот этим Scratch'ем, то у него может появится неприязнь к программированию на уровне подсознания. Может быть как раз сейчас вы готовите будущего талантливого художника, дизайнера или режиссёра, что тоже неплохо.
            0
            А по-моему небо красное.
            0

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


            Надо исходить из целей, которые ставит преподаватель:
            Если заинтересовать — то Scratch, LightBot или что-то такое визуальное. Ибо графические образы более запоминающиеся. На больших и сложных задачах исходный код таких примеров становится очень громоздким.


            Если интерес есть и надо изучить вопрос более серьезно, то надо переходить к текстовому представлению. На практике почти весь код написан в виде текста, в графическом виде типа FBD на порядки меньше.


            Может быть переходный вариант, исходный код в виде текста, но управляется графическими объектами (как в Лого в свое время было).


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

              +1

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


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


              Я бы предпочел LOGO.

                0

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое