От авторов
Благодарности
Введение
Загрузка и установка Scratch 2.0 Offline Editor
РАЗДЕЛ 1. Программирование
Обзор интерфейса
Первая программа
Циклы
Декартова система координат
Рисование по координатам
Псевдослучайные числа, интерактивность, управление программами
Переменные
Ввод данных
Математический тренажер
РАЗДЕЛ 2. Создание игр
ROBBO Lab
Arkanoid
«Змейка»
Pong
Сообщество Scratch
Заключение
Словарь программиста
Приложение. Математический тренажер
Оглавление
Текст
                    ◀ Ш КО Л А

Ю Н О ГО П Р О Г РА М М И С ТА ▶

В. В. Тарапата, Б. В. Прокофьев

Программирование,
игры, робототехника


◀ Ш КО Л А Ю Н О ГО П Р О Г РА М М И С ТА В. В. Тарапата, Б. В. Прокофьев Учимся вместе со SCRATCH Программирование, игры, робототехника Электронное издание Москва Лаборатория знаний 2019 ▶
УДК 087.5:004.9 ББК 32.67 Т19 С е р и я о с н о в а н а в 2018 г. Тарапата В. В. Т19 Учимся вместе со Scratch. Программирование, игң ры, робототехника [Электронный ресурс] / В. В. Тараң пата, Б. В. Прокофьев. Ҹ Эл. изд. Ҹ Электрон. текстовые дан. (1 файл pdf : 231 с.). Ҹ М. : Лаборатория знаний, 2019. Ҹ (Школа юного программиста). Ҹ Систем. требоваң ния: Adobe Reader XI ; экран 10". ISBN 978ң5ң00101ң629ң8 До настоящего программиста нужно дорасти, а в школе серьезң ному программированию начинают учить только в 8Џ9 классах Ҹ теперь это в прошлом! «Учимся вместе со Scratch» Ҹ новый трамплин в мир программирования для всех ребят в возрасте 9Џ12 лет. Визуальная среда Scratch позволяет изучать основы программирования в увлекательной и интуитивно понятной форме, а благодаря тщательно продуманной методике она становится мощным инструментом, который позволит подготоң виться к изучению профессиональных языков программирования и достижению самых высоких результатов! Обучение разделено на два этапа: в первом мы изучим классическое программирование в той же последовательности изложения, в какой изучают любой другой серьезный язык программирования. На втором этапе мы займемся разработкой трех видеоигр и даже подключим геймпад и запрограммируем управление от него (требуется ScratchDuino.Лаборатория или ROBBO LAB). Каждая глава пособия Ҹ уровень, достигая каждый из которых мы движемся к званию настоящего программиста. УДК 087.5:004.9 ББК 32.67 Деривативное электронное издание на основе печатного аналога: Учимся вместе со Scratch. Программирование, игры, робототехника / В. В. Тарапата, Б. В. Прокофьев. Ҹ М. : Лаборатория знаний, 2019. Ҹ 228 с. : ил. Ҹ (Школа юного программиста). Ҹ ISBN 978ң5ң00101ң177ң4. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации ISBN 978ң5ң00101ң629ң8 c Лаборатория знаний, 2019 ○
От авторов Дорогие друзья! У вас в руках книга, которая откроет перед вами совершенно новые горизонты. Вас ждет волшебный мир программирования и разработки увлекательных компьютерных игр! Главный ваш спутник в этом путешествии — среда программирования Scratch. В ней можно создавать самые разные интерактивные программы с анимацией, а также мультфильмы и игры. Книга состоит из двух разделов: «Программирование» и «Создание игр». В первом разделе мы с вами освоим основы программирования, пройдя уровни от начинающего до настоящего программиста. Одновременно будем создавать несложные анимации и мини-игры. Во втором разделе мы применим полученные знания для создания трех действительно серьезных игр. Чтобы почувствовать себя настоящими разработчиками, для каждой из них вам предстоит: создать первоначальную версию игры 1.0; 9 произвести апгрейд игры до версии 2.0; 9 подключить геймпад и запрограммировать его для 9 управления игрой1; попробовать расширить функционал игры для оче9 редного апгрейда до версии 3.0. Надеемся, что наша книга станет для вас путеводной звездой в мире программирования и разработки игр, позволит реализовать ваши самые смелые творческие идеи и добиться успехов в учебной и будущей профессиональной жизни! Удачи вам, друзья! Дерзайте! 1 Данный пункт не является обязательным, если вы не располагаете ROBBO Lab или ScratchDuino.Лаборатория. Все игры создаются изначально для управления с помощью клавиатуры и мыши.
Благодарности Авторы выражают безграничную благодарность всем людям, принявшим участие в создании, редактировании и совершенствовании этой книги, а также тем, кто, так или иначе, повлиял на ее выход в свет. Отдельно авторы благодарят: y своего бессменного научного руководителя, кандидата педагогических наук, профессора МПГУ Надежду Николаевну Самылкину за неоценимый вклад в образование и помощь при написании книги; y учащихся школы № 283 города Москвы за вдохновение, огромный интерес, помощь в бета-тестировании и написании книги, а именно всех учащихся 6 «Д» и 6 «Е» классов, в частности Александра Сенина, Никиту Шмурова, Василису Шумилину, Нику Шумилину, Рано Шарипову, Тамару Меджидову, Анну Чебутаеву, Дмитрия Семенякина, Ярослава Шикова, а также Дмитрия Шикова — ученика 7 «Е» класса, Снежану Дудкину, Елизавету Ляднову — учениц 9 «Д» класса, Софию Салову, Глеба Кордабовского, Андрея Тарасенко — учеников 10 «А» класса; y Михаила Николаевича Бородина, Ольгу Васильевну Карцеву, Сергея Вячеславовича Гончаренко, Александра Александровича Елизарова, Андрея Красных, Алену Салахову — наших наставников и уважаемых коллег — за конструктивную критику и ценные советы; y Павла Фролова, продюсера проекта ROBBO, за профессиональное содействие и помощь; y Веру Андреевну Словиковскую, учителя информатики Лицея № 1568 города Москвы, за созданный интерес к информатике и программированию в школьные годы; y Лилию Анатольевну Тарапата, Нину Алексеевну Прокофьеву — наших дорогих и любимых мам, которые всегда были рядом и верили в нас.
Введение Алгоритмизация и программирование Персональный компьютер, ноутбук, планшет, смартфон и прочие гаджеты на самом деле не больше, чем набор деталей, «упакованных» в корпус. Этот набор еще принято называть hardware1. Программисты вдохнули жизнь в груду пластика и металла, создав для их «тяжелого»2 содержимого программное обеспечение, называемое software3. Дело в том, что все перечисленные выше устройства, которыми мы пользуемся ежедневно, содержат процессор — электронный «мозг», который обрабатывает информацию и, по сути, позволяет компьютеру быть «умным» устройством. Процессор понимает двоичный код (0 — электричества нет, 1 — электричество есть), в который превращаются все команды алгоритма, написанные на любом языке программирования. Чтобы компьютер мог выполнять сложные задания, для процессора нужно составить алгоритм — строгую и предельно логичную последовательность действий для решения конкретной задачи. Процесс создания алгоритма и называется алгоритмизацией. И вот какие требования традиционно предъявляются к любому алгоритму: 1) однозначность — все шаги алгоритма должны строго следовать друг за другом, иметь однозначную трактовку и не допускать никаких двусмысленностей; 2) конечность — алгоритм не может исполняться бесконечно; после того как задача решена или стало понятно, что она не может быть завершена, алгоритм обязан прерваться; 1 В переводе с английского — аппаратное обеспечение, компьютерные комплектующие, «железо». 2 Hard (часть слова hardware) переводится с английского как «тяжелый». 3 В переводе с английского — программное обеспечение, комплекс программных средств.
6 Введение 3) детерминированность — алгоритм должен работать одинаково при одинаковых начальных условиях и выдавать каждый раз один и тот же результат; 4) корректность — результат работы алгоритма должен соответствовать начальным условиям; 5) массовость — один и тот же алгоритм должен подходить для решения класса однотипных задач; 6) эффективность — ресурсы, затрачиваемые на исполнение алгоритма, должны быть оптимально распределены (для компьютера такими ресурсами являются память и время); 7) понятность — алгоритм должен быть понятен тому, кто его исполняет. В этом списке седьмой пункт и порождает понятие программы — алгоритма, переведенного на язык, понятный компьютеру. Именно тот алгоритм, который мы составляем для решения конкретной задачи, создается на том естественном языке, который мы знаем (русский, английский и др.). Компьютер, в свою очередь, понимает всего лишь два цифровых сигнала: 0 и 1. Вопрос: как заставить процессор компьютера выполнять нужные команды? Ответ: нужно обратиться к человеку, который способен перевести алгоритм на язык, понятный компьютеру. Такого человека называют программистом, а процесс перевода алгоритма на понятную процессору последовательность действий — программированием. Заметим, что мы представили программиста как переводчика, способного создать прямой диалог между человеком и компьютером. И это вовсе не зря, ведь для «общения» с компьютером программист использует язык программирования. Одним из таких языков и является Scratch. Что такое Scratch? Scratch — это визуальная среда разработки программ, созданная специально для обучения основам програм-
Введение мирования. Она сочетает самые лучшие решения для начинающих: y все основные алгоритмические структуры и конструкции, используемые в программировании; y визуальные блоки, заменяющие текстовые команды; y анимационное поле, объекты на котором подчиняются создаваемой из блоков программе; y встроенные инструменты для создания и редактирования творческих решений; y свободное (бесплатное) распространение. Создавая анимацию, игры и интерактивные модели в Scratch, на самом деле мы учимся именно программировать и готовимся к покорению новых вершин. Среда Scratch создана группой ученых и разработчиков Массачусетского технологического университета1, США. На сегодняшний момент используются две версии Scratch: 1.4 и 2.0. Scratch 1.4 — первая рабочая версия, разработанная на основе языка Squeak. Scratch 1.4 1 MIT — Massachusetts Institute of Technology, USA. 7
8 Введение Scratch 2.0 — вторая версия, адаптированная для работы онлайн и переписанная на языке Flash, использующем широко распространенную технологию работы приложений в сети Интернет. Scratch 2.0 Мы будем работать с версией Scratch 2.0, так как именно она является самой новой. Scratch доступна на официальном сайте разработчика для работы в онлайн-режиме: https://scratch.mit.edu/. Для начала работы с ней в верхнем меню нужно нажать кнопку Создавай.
Загрузка и установка Scratch 2.0 Offline Editor Помимо работы онлайн Scratch можно скачать для работы без подключения к сети Интернет. Так работать намного надежнее, потому что мы не будем зависеть от стабильности работы Интернета. Такая версия среды Scratch называется офлайн-редактор Scratch 2.0 и доступна для свободного скачивания с официального сайта разработчика по ссылке: https://scratch.mit.edu/scratch2download/. Также этот раздел можно найти в нижней части главной страницы сайта Scratch под названием «Несетевой редактор». При переходе по ссылке мы попадаем на страничку загрузки Scratch 2.0 Offline Editor. Обратим внимание только на второй шаг: Здесь необходимо выбрать операционную систему, установленную на компьютере или ноутбуке, и соответственно кликнуть по нужной надписи Скачать. Начнется скачивание установочного файла, после чего его нужно запустить и следовать инструкциям по установке. Внимание! Во время установки может понадобиться режим Администратора компьютера (или пароль для него).
10 Внимание! Во время установки может возникнуть ошибка из-за отсутствия надстройки Adobe AIR, необходимой для работы Scratch. Мастер установки предложит загрузить ее автоматически — нужно ответить согласием. Если этого не произошло, но ошибка сохраняется, следует снова перейти на страничку загрузки Scratch 2.0 Offline Editor и скачать эту надстройку на шаге 1.
РАЗДЕЛ 1. Программирование Первый раздел книги посвящен непосредственно программированию. В нем мы вместе пройдем девять уровней — от нулевого до восьмого — на пути к званию «программист». Структура каждого уровня, кроме нулевого, довольно проста: сначала мы вместе пошагово изучаем те или иные приемы программирования, создавая несложные анимации и мини-игры, а затем, для прохождения уровня и получения нового звания, вы самостоятельно выполняете предложенные задания. При первом запуске Scratch по умолчанию установлен английский язык. Сменить его на русский (или любой другой из доступных) можно, кликнув на значок глобуса в верхней панели меню и инструментов. Рекомендуем для каждого нового уровня создавать отдельный проект (программу) в среде Scratch и сохранять свои наработки. Для создания нового проекта нужно воспользоваться пунктом меню Файл o Новый (или просто запустить Scratch заново).
РАЗДЕЛ 1. Программирование 12 Для сохранения своего проекта во избежание его внезапной потери (например, из-за перепада электроэнергии) и его дальнейшей демонстрации друзьям или в сети Интернет нужно воспользоваться пунктом меню Файл o Сохранить как, затем выбрать папку для его хранения и задать имя. Также рекомендуем почаще пользоваться пунктом меню Файл o Сохранить для сохранения изменений в уже созданном проекте. Вперед, на аллею славы великих программистов! Обзор интерфейса УРОВЕНЬ 0: «Джуниор»1 Разберемся, из каких областей состоит рабочее пространство Scratch 2.0, и договоримся о том, как будем называть те или иные элементы. 1 Джуниор (от англ. Junior — младший) — так называют молодых программистов с небольшим опытом или вовсе без него.
Обзор интерфейса Область анимации В левой верхней части расположена область анимации, на которой мы видим главного героя кота Царапку (Scratch в переводе с английского означает «царапать», поэтому логично предположить, что кота зовут именно так). В области анимации мы будем видеть результат работы создаваемых нами программ. Синий значок в левом верхнем углу позволяет раскрывать область анимации во весь экран. Зеленый флажок и красный восьмиугольник в правом верхнем углу — это кнопки запуска и остановки исполнения программ соответственно. Также на верхней панели отображается имя текущего проекта (по умолчанию Untitled), а на нижней панели — положение указателя мыши относительно активного объекта в координатах x и y. 13
14 РАЗДЕЛ 1. Программирование Область управления объектами В этой области мы можем выбирать (активировать) объекты для работы с ними и создания программ для них. В новом (пустом) проекте изначально мы можем управлять Царапкой и Сценой. Все объекты, с которыми мы работаем в Scratch, еще называются спрайтами. В правом верхнем углу (слева направо) находятся инструменты для: 1) добавления нового спрайта из стандартной библиотеки; 2) создания собственного спрайта с нуля с помощью встроенного графического редактора; 3) загрузки спрайта из файла; 4) создания нового спрайта с помощью камеры. Слева — инструменты для работы со сценой и ее фонами. Следующие три области, которые мы рассмотрим, открываются по вкладкам. Область скриптов Это самая главная область. Здесь происходит написание программ. В Scratch они также называются скриптами.
Обзор интерфейса В левой верхней части мы видим группы команд: Группа Описание Движение Управление положением и спрайта по области анимации перемещением Внешность Изменение внешности спрайта (костюмы, размеры, эффекты) и вывод на экран текстовых фраз Звук Работа со звуками, издаваемыми спрайтами Перо Рисование различных объектов в области анимации с помощью находящегося там спрайта Данные Создание и управление переменными и массивами данных (списками) События Команды управления событиями, происходящими со спрайтами Управление Алгоритмические конструкции проверки условий, циклов, задержки и работа с клонами спрайтов Сенсоры Стандартные команды проверки и обработки событий и входных данных Операторы Арифметические и логические операции, работа с псевдослучайными числами, обработка строк Другие блоки Резервная группа для создания собственных команд и подпрограмм 15
16 РАЗДЕЛ 1. Программирование Скрипты составляются из различных команд. В Scratch команды еще называются блоками и помещаются программистом в правой части данной области, цепляясь друг за друга, как пазлы. Также в правой части можно видеть положение спрайта относительно центра сцены в координатах x, y. Область костюмов В этой области находятся все доступные костюмы (виды) активного спрайта. Здесь их можно редактировать как в векторном режиме (работа с графическими примитивами, высокое качество), так и в растровом (точечном) с помощью вполне стандартных инструментов, которые можно встретить в любом графическом редакторе. Также для костюмов доступно редактирование их имен.
Первая программа Область звуков В этой области для активного спрайта можно добавлять звуки, которые он воспроизводит, и редактировать их. Область меню и инструментов В верхней части окна находится панель меню и инструментов для работы со всем проектом. Первая программа УРОВЕНЬ 1: «Начинающий программист» Создадим нашу первую программу, чтобы ближе познакомиться со средой Scratch. Перед тем как приступить к написанию скрипта, определимся с теми действиями, которые должен будет выполнить Царапка, то есть опишем логику программы. Логика программы Царапка будет идти вправо несколько шагов, затем влево, после чего скажет: «Привет, Мир!». 17
18 РАЗДЕЛ 1. Программирование Первый шаг Для начала попробуем сделать так, чтобы Царапка шел вправо. Перетащим блок Идти … шагов из группы Движение в рабочую область скриптов. Пока ничего не происходит, потому что команда не приведена в исполнение. Сейчас мы можем проверить, работает ли она. Для этого кликнем по ней один раз. Мы можем заметить, что Царапка передвинулся немного вправо в области анимации, а его положение относительно центра сцены изменилось на 10 по оси x. Отсюда мы делаем вывод, что шаги в этом блоке — на самом деле количество единиц (пикселей на экране), на которые смещается спрайт. Давайте добавим еще четыре такие команды, чтобы Царапка смог прошагать дальше. Для выполнения этого скрипта, состоящего уже из пяти блоков, кликнем по верхнему из них один раз. Мы можем заметить, что Царапка сместился намного дальше вправо, чем в предыдущий раз, а его положение изменилось на 50 по оси x.
Первая программа Но мы ведь хотим, чтобы Царапка шел, а не «дергался» вправо. Для этого мы должны добавить несложную анимацию. Сначала сделаем так, чтобы в начале программы кот возвращался в середину сцены, то есть в точку с координатами x: 0, y: 0. Для этого в начало скрипта добавим команду Перейти в x: … y: … . Значения в окошках оставим по умолчанию — именно они нам и нужны. Теперь перейдем к анимации. Что такое анимация по своей сути? Это смена различных кадров с определенной скоростью. Для анимации шагов Царапки будем менять два его стандартных костюма, которые можно увидеть на вкладке Костюмы. 19
20 РАЗДЕЛ 1. Программирование Добавим в наш скрипт блок Следующий костюм из группы Внешность после каждой команды Идти … шагов. Теперь попробуем запустить этот скрипт, кликнув по самой первой команде. Пронаблюдав за котом, мы видим, что ничего не изменилось и он по-прежнему не шагает, а дергается. Дело в том, что мы задали различные кадры, но не отрегулировали скорость их смены — сейчас они выполняются почти мгновенно, так как процессор компьютера работает очень быстро. Отрегулировать скорость можно, создав искусственную задержку после каждого шага. Для этого добавим команду Ждать … секунд из группы Управление после каждого шага. Запустим обновленный скрипт. Теперь мы наконец видим, как Царапка шагает по области анимации!
Первая программа Идем обратно Далее, по логике нашей программы, Царапка должен пойти влево. Логично, что скрипт получится таким же, но с одним лишь различием: параметр команды Идти … шагов будет равен не 10, а –10, то есть кот пойдет в обратную сторону. Чтобы заново не добавлять все эти команды, воспользуемся инструментом Дублировать на верхней панели. Кликнем этим инструментом по нашему скрипту (по самой верхней команде), и он продублируется. Расположим копию слева. 21
22 РАЗДЕЛ 1. Программирование В копии нашего скрипта нам нужно убрать первый блок возврата к центру сцены (для этого нужно перетащить остальную часть скрипта ниже) и изменить параметры команды Идти … шагов на –10. Присоединим получившийся скрипт снизу к уже имеющемуся и запустим. Мы увидим, что Царапка действительно идет влево, но делает это в стиле «лунной походки», то есть задом наперед. Так дело не пойдет. Повернем кота в другую сторону. Добавим блок Повернуть в направлении … из группы Движение в то место, где Царапка начинает идти в обратную сторону. Осталось выбрать само направление. Для этого кликнем по выпадающему списку этого блока и выберем значение –90 (влево).
Первая программа Запустим обновленный скрипт. Когда он отработает, мы можем прийти в недоумение, потому что Царапка вдруг стал ходить вверх ногами! Чтобы этого не происходило, нам нужно задать стиль вращения данного спрайта в его свойствах. Для этого в области управления объектами кликнем по нашему коту правой кнопкой мыши и выберем первый пункт info. Войти в свойства спрайта можно также, нажав значок i в левом верхнем углу. В открывшемся окне выберем стиль вращения Влево-вправо. 23
24 РАЗДЕЛ 1. Программирование Теперь можно запустить скрипт еще раз. И мы увидим еще одну ошибку — кот не поворачивает направо. Значит, нам нужно добавить еще один блок Повернуть в направлении … . Добавим его в самое начало сразу после первой команды, значение 90 (вправо) оставим без изменений. Может быть, на этот раз все сработает как надо? Попробуем запустить скрипт на исполнение. И снова что-то не так! Кот снова ходит «лунной походкой»! Дело в том, что, когда Царапка развернулся, для него поменялось и положительное направление оси x. Иными словами, положительное направление для него то, куда он «смотрит». Важно! Отсюда можно сделать вывод, что команда Идти … шагов перемещает спрайт на заданное количество пикселей в том направлении, куда направлен его «взгляд». Поэтому в нашем скрипте изменим все параметры в блоках Идти … шагов с –10 обратно на 10. Вот такой скрипт должен получиться в итоге. Запустим его и убедимся, что теперь все работает как надо!
Первая программа Привет, Мир! Последнее, что должен сделать Царапка в нашей программе, — сказать: «Привет, Мир!». Добавим в конце скрипта команду Говорить … в течение … секунд из группы Внешность. В первое поле текста запишем нашу фразу: «Привет, Мир!», и пусть она продержится на экране две секунды, поэтому второй параметр менять не будем. Последним штрихом перед финальным запуском программы будет, собственно, обеспечение ее корректного запуска. Рассматривая интерфейс среды Scratch 2.0, мы видели, что в области анимации есть зеленый флажок, запускающий скрипты на исполнение. Однако пока он не работает. Это связано с тем, что скрипты могут запускаться не только вместе со всей программой, но и согласно другим различным событиям. Пока что мы сделаем так, чтобы наш скрипт запускался по нажатию на зеленый флажок. Для этого добавим команду Когда щелкнут по зеленому флажку из группы События в самое начало скрипта. Теперь мы можем запустить нашу программу, нажав на зеленый флажок в области анимации. 25
26 РАЗДЕЛ 1. Программирование Кстати! Среди программистов существует особый негласный ритуал, согласно которому изучение любого нового языка программирования нужно обязательно начинать с программы «Hello, World!». Она не только выводит на экран эту фразу, но и раскрывает структуру простейшей программы на изучаемом языке. Поэтому теперь мы можем считать себя посвященными в программисты! Что мы теперь знаем и умеем Мы познакомились с самыми простыми способами написания скриптов и научились работать с методами создания простой анимации, направлениями движения и организовывать корректное исполнение алгоритма. О чем мы должны подумать К какому виду алгоритмов принадлежит составленный нами скрипт? Задания для прохождения первого уровня и получения звания «Начинающий программист» 1. Сделайте так, чтобы Царапка двигался быстрее. 2. Царапка любит считалочки — помогите Царапке в каждый свой шаг произносить считалочку: «Раздва-три-четыре-пять, Царапке нравится шагать!». 3. Попробуйте изменить движение кота — пусть он поднимается по воображаемой лестнице (подсказка: для этого нужно будет работать с координатой y).
Циклы Циклы УРОВЕНЬ 2: «Посвященный» В нашей первой программе мы научили Царапку ходить. Но надо признать, что программа получилась громоздкой, а действий Царапка выполнил не так уж много. Вспомните, что для каждого шага Царапки у нас использовались одни и те же команды. Значит, если их несколько раз повторить, то и программа будет меньше и Царапка сможет прошагать дальше. Для повтора различных действий программисты пользуются циклами. С ними мы и разберемся на этом уровне. Логика программы Царапка будет идти вправо до тех пор, пока не дойдет до края области анимации, после чего развернется и пойдет обратно. Первый шаг Чтобы создать циклическую программу, нужно сначала понять, какие действия должны повторяться, чтобы все работало корректно. Рассмотрим один из фрагментов нашей первой программы. 27
28 РАЗДЕЛ 1. Программирование Нетрудно заметить, что здесь повторяется один и тот же набор из трех блоков: Идти 10 шагов, Следующий костюм, Ждать 1 секунд. Тогда в нашей новой программе для начала воссоздадим именно этот фрагмент. Теперь мы поместим его в цикл. Циклы бывают разные: с заданным числом повторений; 9 с предусловием; 9 с постусловием; 9 бесконечные. 9 В Scratch для некоторых циклов существуют готовые блоки, а для некоторых придется «собирать циклические конструкции». Но мы пойдем от простого к сложному и рассмотрим те виды циклов, для которых есть готовые блоки. Цикл с заданным числом повторений Зайдем в группу Управление и найдем в ней блок Повторить … . Этот цикл повторяет все команды, которые содержатся внутри него и именно в той последовательности, в которой они идут друг за другом. Другими словами, мы зацикливаем очередь выполнения этих команд — когда они все будут выполнены, процесс начнется заново и будет повторен то количество раз, которое записано в параметр самого цикла. Теперь возьмем этот блок и «навесим» его на наши три команды.
Циклы Для корректного запуска скрипта осталось добавить блок Когда щелкнут по зеленому флажку из группы События. Теперь запустим программу и понаблюдаем за Царапкой. Мы увидим, что Царапка благополучно сделал 10 шагов — именно столько, сколько указано в параметре повторов цикла. Можно заметить, что Царапка перемещается достаточно медленно. В прошлом уроке у нас уже было задание, в котором мы должны были ускорить движение кота. Оказывается, для этого нужно всего лишь уменьшить время задержки в блоке Ждать … секунд. Сделаем это здесь, выставив время задержки 0.3 секунды, и снова запустим скрипт. Важно! Scratch является американским продуктом, поэтому во всех десятичных дробях (нецелые числа) для отделения целой части от дробной используется точка, а не запятая — такое обозначение принято в США. Царапка уже практически дошел до края области анимации. 29
30 РАЗДЕЛ 1. Программирование Запустим скрипт еще раз, но предварительно увеличим число повторов цикла до 50. Мы увидим, что Царапка вышел за край экрана и попал, скажем так, в «тупик» — теперь нам виден только его хвост. В логике нашей программы мы договорились, что Царапка должен дойти до края, развернуться и пойти дальше. Для этого внутрь цикла нужно добавить команду Если на краю, оттолкнуться из группы Движение. Перед запуском обновленного скрипта мы должны вспомнить, что кот при развороте переворачивается вверх ногами, поэтому нужно не забыть зайти в свойства спрайта и выставить Стиль вращения только влево и вправо.
Циклы Теперь запустим наш скрипт. Понаблюдаем: Царапка касается края области анимации, разворачивается и идет влево до тех пор, пока не коснется края, разворачивается и делает несколько шагов вправо, после чего скрипт завершается. Очевидно, что для нашей программы цикл с заданным числом повторений не самое удачное решение. Если мы хотим, чтобы кот ходил туда и обратно без остановки, нам понадобится бесконечный цикл. Бесконечный цикл За организацию бесконечного цикла в Scratch отвечает блок Всегда из группы Управление. Поменяем цикл Повторить … на цикл Всегда. И запустим скрипт на исполнение. 31
32 РАЗДЕЛ 1. Программирование Теперь мы видим, что кот ходит из стороны в сторону без остановки. Однако завершить бесконечный цикл все-таки можно. Для этого есть два способа: 1) вручную нажать на кнопку остановка ; 2) задать параметры и условия, при которых цикл завершится, то есть организовать его прерывание. Пока что будем останавливать бесконечные циклы с помощью кнопки остановка, так как с проверкой условий мы познакомимся позже. Мы видим, что бесконечный цикл хоть и решает нашу задачу, но не совсем правильно, так как нам не нужно, чтобы программа работала вечно. Цикл с предусловием Последний тип цикла, который существует в Scratch, — это цикл с предусловием. Каждый раз, перед тем как выполнить повтор команд, этот цикл проверяет некоторое условие. Если оно оказывается выполненным, то цикл завершается. За этот цикл в Scratch отвечает блок Повторять, пока не … из группы Управление. Для начала заменим цикл Всегда на этот цикл. И останется только добавить условие остановки этого цикла.
Циклы Пусть Царапка останавливается в тот момент, когда касается указателя мыши. Зайдем в группу Сенсоры и перетащим блок Касается … в окно условия цикла (пустой шестигранник). В выпадающем списке этого сенсора выберем Указатель мышки. Теперь мы можем запустить скрипт. Царапка по-прежнему бегает из стороны в сторону. Но если мы попробуем навести на него указатель мыши, то он тут же остановится. Это происходит потому, что цикл, из которого состоит скрипт, завершается, а после него никаких команд для исполнения нет. «Кошки-мышки» Усовершенствуем нашу программу — сделаем так, чтобы кот гонялся за мышкой, а догнав ее, останавливался и кричал: «Я тебя поймал!». Для этого добавим внутрь нашего цикла блок Повернуться к … из группы Движение. 33
34 РАЗДЕЛ 1. Программирование По умолчанию в выпадающем списке выбран Указатель мышки, так его и оставим. Осталось сделать так, чтобы Царапка кричал: «Я тебя поймал!», как только «догонит» курсор мыши. Мы уже знаем, что цикл завершается тогда, когда кот касается указателя мыши. Значит, и кричать он должен сразу после того, как цикл завершится. Добавим блок Говорить … в течение … секунд из группы Внешность сразу после цикла. Занесем в первое окошко нашу фразу: «Я тебя поймал!», во втором параметр 2 секунды менять не станем — этого вполне достаточно. Теперь можно запустить скрипт и поиграть с Царапкой в «Кошки-мышки». Раз уж мы написали первую небольшую игру, надо ее и оформить соответствующе. Добавим красочный фон. Для этого выберем слева в области управления объектами команду Новый фон: Выбрать фон из библиотеки.
Циклы В открывшемся окне мы увидим множество различных фонов. Добавим какой-нибудь из них. Например, слева кликнем по категории Природа, выберем в качестве фона desert (пустыня) и далее нажмем ОК в правом нижнем углу окна. Теперь можно запустить нашу игру и воображать, что Царапка гоняется за маленькими песчанками в пустыне! 35
36 РАЗДЕЛ 1. Программирование Что мы теперь знаем и умеем Мы познакомились с новой алгоритмической конструкцией — циклом и разобрали три их вида: с заданным числом повторений, бесконечный и с предусловием, а также мы сделали самую настоящую мини-игру! О чем мы должны подумать К какому виду алгоритмов принадлежит составленный нами скрипт? Задания для прохождения второго уровня и получения звания «Посвященный» 1. Сделайте так, чтобы Царапка двигался быстрее. 2. Сделайте так, чтобы Царапка периодически выкрикивал: «Поймаю!» и «Догоню!». 3. Попробуйте немного изменить игру — пусть Царапка отпускает мышку первые два раза и продолжает гоняться за ней, пока не поймает в третий раз. Декартова система координат УРОВЕНЬ 3: «Мастер позиционирования» Мы уже научились перемещать объекты по экрану и немного управлять их поведением. Самое время углубиться в вопрос технологии их перемещения и наконец узнать, что же за мифические координаты x и y затрагивались в самой первой программе. Вспомним, что команда Идти 10 шагов перемещала нашего кота по экрану и в то же время изменялась координата x. Перед тем как перейти к написанию программы, мы разберемся с самими координатами. Люди на протяжении многих веков развивали науку, и одной из задач было изобретение способа, позволяющего однозначно определить местонахождение того или иного объекта. Например, мы знаем, что пираты
Декартова система координат прятали свои сокровища на островах и рисовали карты, на которых отмечали ориентиры — высокие пальмы, камни необычной формы и так далее, — чтобы можно было определиться, куда идти. Однако составлены такие карты были далеко не точно. Особенно поиск затрудняли такие пояснения, как: «Пройти пятьдесят шагов вперед, затем трижды прыгнуть вправо…», потому что не было ясно, какие и чьи шаги (может, речь идет о длине шага попугая) и какова длина прыжка. До сих пор существуют карты, по которым спрятанные сокровища все еще не найдены. В 1637 году французский ученый-математик Рене Декарт, работая над своей книгой «Рассуждение о методе», столкнулся с той же проблемой — он хотел определить местонахождение точки на плоскости. После долгих размышлений он нашел ответ и предложил для этого свою систему координат. 37
38 РАЗДЕЛ 1. Программирование Данная система состоит из двух перпендикулярно направленных отрезков, называемых осями. Горизонтальная ось — ось абсцисс (в переводе с латинского «отрезок»), или ось x («икс»). Вертикальная ось — ось ординат (в переводе с латинского «расположенный по порядку»), или ось y («игрек»). Место их пересечения обозначается буквой О и называется началом отсчета. Чтобы исключить погрешность в измерениях, вместо «шагов» и «прыжков» он ввел понятие единичного отрезка — равнозначной величины для всей системы. Например, на рисунке единичный отрезок равен двум тетрадным клеточкам. Таким образом, для любой точки на плоскости стало возможным задать ее однозначное положение, записав, на сколько единичных отрезков нужно продвинуться по обеим осям. Эта пара чисел и называется координатами точки. Например, для точки А на рисунке такими числами являются по оси х: 2, по оси y: 3. Для корректной записи координат точки принята следующая форма: А (2; 3). Теперь приступим к применению этих знаний в программировании. Логика программы Царапка будет играть в футбол на Луне! Он разбежится, ударит по мячику, и тот начнет летать — ведь на Луне вес всех объектов гораздо меньше, чем на Земле!
Декартова система координат Отправляемся на Луну Для начала создадим атмосферу — изменим фон, как в предыдущем уровне, но на этот раз откроем категорию Космос, выберем изображение moon и нажмем ОК. Ура! Царапка оказался на Луне! Игра начинается! Теперь добавим новый спрайт. Для этого в области управления объектами выберем команду Выбрать спрайт из библиотеки. 39
40 РАЗДЕЛ 1. Программирование Выберем в открывшемся окне слева категорию Предметы и в ней спрайт с именем Ball. Затем нажмем ОК. Мячик сразу появится на рабочем поле. Можно заметить, что у мячика есть несколько костюмов, значит, и работать с ним будет интереснее. Еще у мяча более понятное имя Ball. Для удобства сменим имя и у Царапки. Для этого в области управления объектами зайдем в свойства кота info. Сменим его имя со Спрайт1 на Царапка.
Декартова система координат Теперь подготовим Царапку к удару по мячу. По области анимации объекты можно свободно перемещать с помощью мыши. Расположим Царапку и мячик примерно так: Царапка бьет по мячу! Сначала мы запрограммируем поведение Царапки. Пусть Царапка повернется к мячику и «побежит» к нему. Мы уже знаем, что программа должна иметь начало, поэтому добавим команду Когда щелкнут по зеленому флажку из группы События. Первой командой мы повернем Царапку к мячику. Добавим блок Повернуться к … из группы Движение и выберем из выпадающего списка спрайт с именем Ball. 41
42 РАЗДЕЛ 1. Программирование Можно запустить скрипт и увидеть, что Царапка теперь «смотрит» на мяч. Теперь сделаем так, чтобы кот побежал к мячу, но надо вспомнить, что сила притяжения на Луне не такая, как на Земле! Сделаем так, чтобы Царапка оттолкнулся от поверхности Луны и как бы «долетел» до мяча. Первый шаг будет состоять из уже знакомых команд Идти 10 шагов из группы Движение и Следующий костюм из группы Внешность. Теперь добавим новую команду Плыть … секунд в точку x: … y: … Эта команда задает время, за которое объект должен «доплыть» до конкретной точки на экране, обозначенной координатами x и y.
Декартова система координат Нам нужно, чтобы кот «доплыл» до той точки, где стоит мячик. Его местоположение можно узнать, если кликнуть по нему в области управления объектами и посмотреть координаты в правом верхнем углу области скриптов. Итак, у нас координаты мячика по оси x: 82, по оси y: –32 (могут быть и другими). Впишем эти параметры в команду Плыть … у Царапки. Можно запустить этот скрипт и понаблюдать, как кот отталкивается от поверхности Луны, «плывет»… и останавливается прямо за мячом. Почему это произошло? Дело в том, что те координаты, которые мы увидели у мяча, — координаты его центра. Именно поэтому Царапка «приплыл» прямо в центр мяча. Надо бы это исправить. Сделаем так, чтобы Царапка остановился прямо возле мяча. Для начала вернем 43
44 РАЗДЕЛ 1. Программирование кота в исходное положение, просто перетащив его с помощью мыши в области анимации. А теперь уберем команду Плыть … и заменим ее циклом с предусловием, который мы рассматривали на предыдущем уровне. Это блок Повторять пока не из группы Управление. Далее зададим условие остановки этого цикла. Для этого поместим в ячейку условия команду Касается … из группы Сенсоры. Выберем из выпадающего списка спрайт с именем Ball.
Декартова система координат Добавим внутрь цикла одну-единственную команду Идти … шагов из группы Движение. В качестве параметра зададим 3 шага, чтобы создать иллюзию того, что Царапка неспешно летит к мячику. Осталось создать анимацию второго «шага» Царапки. Добавим после цикла блок Следующий костюм из группы Внешность. Теперь можно запустить программу и убедиться, что Царапка прыгает к мячу и пинает его. Теперь дело за поведением мячика. Штанга! В области управления объектами выберем спрайт с именем Ball. Первым делом добавим команду Когда щелкнут по зеленому флажку из группы События, а затем добавим блок Ждать до … из группы Управление. 45
46 РАЗДЕЛ 1. Программирование Мячик должен «дождаться», пока Царапка коснется его. Поэтому добавим в условие окончания ожидания уже знакомый блок Касается … из группы Сенсоры и выберем в выпадающем списке Царапку. Таким образом, наш скрипт продолжит выполнять последующие команды только после того, как Царапка коснется мяча. После этого мяч должен начать летать по экрану. Но мы же не можем сделать это движение хаотичным. Пусть он будет «ударяться» о края: правый, верхний, левый, нижний — и летать так, словно он на Луне. В этом нам помогут четыре команды Плыть … . Но сначала выясним координаты тех позиций для мяча,
Декартова система координат которые нам понадобятся. Для этого будем перемещать его по области анимации и выписывать координаты. Итак, у нас получится следующий скрипт: Ура! Царапка играет в футбол на Луне! Что мы теперь знаем и умеем 1. Мы наглядно изучили декартову систему координат и применили ее в реальном программировании поведения объектов. 2. Мы познакомились с новым приемом — для двух объектов написали два скрипта, которые выполнялись параллельно. В программировании это называется параллельным исполнением. С его помощью можно решать сложные задачи, ставящиеся перед программистом. О чем мы должны подумать 1. К какому виду алгоритмов принадлежат составленные нами скрипты? 2. Могли бы мы обойтись в данной программе без циклов? 3. Какими значениями по координатам x и y ограничен экран в Scratch? Задания для прохождения третьего уровня и получения звания «Мастер позиционирования» 1. Запрограммируйте полет мяча иначе: измените скорость и траекторию полета, меняя параметры команды Плыть … . 47
48 РАЗДЕЛ 1. Программирование 2. Сделайте так, чтобы после остановки мяча в какой-либо точке Царапка продолжал пинать его еще три раза. 3. Попробуйте применить другие типы циклов. Возможно, вам удастся найти другие способы реализации программы. Рисование по координатам УРОВЕНЬ 4: «Дизайнер» Теперь, когда мы научились позиционировать объект на экране, пользуясь координатами, самое время научиться рисовать! В Scratch любой спрайт может оставлять за собой след в виде линии. Но это смотрится еще лучше, когда этим спрайтом является, например, карандаш! Так мы сможем почувствовать себя настоящими мастерами искусства и одновременно повелителями программистского пера! Инструмент для рисования Для начала нам придется попрощаться с Царапкой. Кликнем по нему в области управления объектами правой кнопкой мыши и выберем пункт Удалить.
Рисование по координатам Далее добавим новый объект. Для этого воспользуемся Библиотекой спрайтов. В той же области надо нажать кнопку с изображением гномика. Выберем в открывшемся окне слева категорию Предметы. Промотаем вниз справа в окне список доступных объектов и найдем Pencil (в переводе с английского — карандаш). Выберем его и нажмем ОК. 49
50 РАЗДЕЛ 1. Программирование Первые штрихи За рисование в Scratch отвечает группа команд Перо. Для того чтобы карандаш начал рисовать, нужно выполнить команду Опустить перо. Именно после этого любой объект начинает оставлять за собой след. Перетащим эту команду в область скриптов. Далее нужно лишь двигать карандаш и наблюдать за тем, что получается.
Рисование по координатам Поэтому добавим команду Идти 50 шагов. Остается добавить уже знакомую нам команду Когда щелкнут по зеленому флажку и запустить программу. И вот что мы увидим. Линия появилась от середины карандаша. В реальности она, конечно же, появилась бы у острия грифеля. Что же не так? Дело в том, что изначально тот самый инструмент Перо, который есть у каждого объекта, находится в середине его костюма. Чтобы изменить эту ситуацию, необходимо переместить центр костюма к острию. Для этого откроем вкладку Костюмы. Кстати! У карандаша есть еще и второй, более реалистичный костюм. При желании можно использовать и его. 51
52 РАЗДЕЛ 1. Программирование Выберем в правом верхнем углу панели инструментов рисования команду Установить центр. В области редактирования костюма появится крест, указывающий на положение центра. Перетащим его с помощью мыши к острию карандаша. Сразу же в области анимации мы можем увидеть, что теперь линия рисуется правильно. Для полноценного рисования выполним еще несколько действий. Сначала уменьшим размеры карандаша, так как сейчас он крупноват для экрана. Воспользуемся инструментом Уменьшить (панель инструментов сверху).
Рисование по координатам С его помощью нужно кликнуть по карандашу в области анимации несколько раз, пока он не примет оптимальный размер. Теперь обратим внимание на следующее: 1) во избежание появления лишних штрихов первым делом при запуске программы перо должно быть поднято; 2) при каждом запуске программы то, что было нарисовано ранее, должно удаляться; 3) полезно возвращать каждый раз карандаш в исходную позицию, например в точку (0; 0). Реализуем все по порядку. Добавим команду Поднять перо сразу после начала программы. Далее добавим команду Очистить — она удаляет с экрана все, что было нарисовано любыми объектами. 53
РАЗДЕЛ 1. Программирование 54 Остается добавить команду Перейти в x: 0 y: 0. Начинаем рисовать Надо признать, что намного приятнее наблюдать за тем, как создается картина, чем сразу увидеть готовый результат. Поэтому для рисования мы будем использовать команду Плыть в x: … y: …, вместо Идти … шагов. Постановка задачи: нарисовать домик с треугольной крышей, дверью, окнами и печной трубой. Начинаем с фасада: в плоском изображении он Кстати! представляет собой проВспомогательный фон с систой прямоугольник. Для стемой координат доступен того чтобы нарисовать его в Библиотеке фонов в капо координатам, нужно тегории Прочее под именем понять, какие конкретно xy-grid. нужны точки и их координаты. Рисование в Scratch происходит, по сути, прямыми отрезками. Прямоугольник же состоит из четырех таких отрезков. А значит, нам понадобятся координаты начала и конца каждого отрезка, то есть точек перегиба прямоугольника. Для начала определим границы основного экрана. В соответствии с границами создадим заготовку рисунка. Сделать это можно на клетчатой бумаге или с помощью любого графического редактора1. 1 Мы, например, пользовались векторным графическим редактором Inkscape.
Рисование по координатам Для начала изобразим координатную плоскость. В качестве единичного отрезка зададим: 1 клетка  10 пикселей. 55
56 РАЗДЕЛ 1. Программирование Расставим точки, обозначающие углы будущего прямоугольника.
Рисование по координатам Назовем эти точки латинскими буквами и определим координаты для каждой. Соединим эти точки. Соединять их нужно так, как будет рисовать карандаш в Scratch. Самый лучший способ — не поднимая пера. Значит, соединим их по алфавиту: AoBoCoDoA. 57
58 РАЗДЕЛ 1. Программирование Заметим, что карандаш должен возвращаться в ту же точку, из которой начал рисовать. Логика программы В начале нужно поднять перо, затем очистить экран и переместить карандаш в центр. Далее каждый элемент дома (фасад, крыша, окно, дверь, труба) будем рисовать по следующим этапам: y перемещаем карандаш в начальную точку фигуры; y опускаем перо; y «плаваем» от точки к точке; y по завершении поднимаем перо. Приступим к изображению фасада. Перемещаем карандаш к точке A с координатами (50; 60).
Рисование по координатам Затем опускаем перо. Далее «проплывем» к точкам B, C, D и вернемся в A. В этом нам помогут четыре команды. В конце остается поднять перо. Можно протестировать данный скрипт, нажав на верхнюю команду. Если что-то пошло не так, следует еще раз проверить каждую из команд: возможно, гдето допущена ошибка. Если все хорошо, добавляем этот скрипт к основной программе. 59
60 РАЗДЕЛ 1. Программирование Запустим программу и понаблюдаем, как карандаш рисует фасад. Отлично! Теперь, пользуясь освоенной логикой, дорисуйте домик. На бумаге заготовка может выглядеть так:
Рисование по координатам В итоге получится вот такой уютный домик. 61
62 РАЗДЕЛ 1. Программирование Что мы теперь знаем и умеем 1. Мы научились работать с группой команд Перо и управлять программируемым рисованием. 2. Применили метод координат в художественном изображении. 3. Также мы познакомились с понятием центра объекта и научились самостоятельно его определять для конкретного костюма. О чем мы должны подумать 1. К какому виду алгоритмов принадлежат составленные нами скрипты? 2. Могли бы мы составить такую структуру, которая позволила бы сократить количество команд? 3. Могут ли в данной программе пригодиться циклы? Задания для прохождения четвертого уровня и получения звания «Дизайнер» 1. Допишите программу так, чтобы домик был изображен полностью. 2. Попробуйте применить и другие команды из группы Перо. Так, стены дома могут стать толще (а значит, теплее и надежнее), а линии заиграть всеми цветами радуги. 3. Подумайте, как можно дорисовать спираль, выходящую из печной трубы и изображающую дым, если рисование в Scratch происходит только прямыми отрезками. Реализуйте такой скрипт.
Псевдослучайные числа, интерактивность, управление программами Псевдослучайные числа, интерактивность, управление программами УРОВЕНЬ 5: «Кодер»1 Псевдослучайные числа «Случайности не случайны» — так говорит мастер Угвэй в известном мультфильме «Кунг-фу панда». Этот мудрейший из галапагосских черепах несомненно прав, и вот почему. Давайте попробуем загадать какое-нибудь случайное число. Получилось? Конечно! Но так ли оно случайно, каким кажется? Если подумать, то знания любого человека о числах ограниченны. И если он знает какое-то очень большое число, то оно в первую очередь и будет являться границей его знаний. Значит, то число, которое мы загадали, на самом деле оказывается выбранным из какого-то диапазона. Это говорит о том, что возможность появления любого такого числа можно с определенной долей вероятности предсказать. Разобраться в этом сразу может быть сложно, но рассмотрим еще один пример. 1 Кодером называют человека, который способен создавать программы по данному техническому заданию. 63
64 РАЗДЕЛ 1. Программирование Шестигранный кубик используется в большинстве настольных игр. Результат его броска считается случайным. Но если подумать, то бросок кубика приводит к одному из шести возможных вариантов (не считая падения ребром), а значит, можно посчитать вероятность выпадения любого из чисел в процентах: 1 ˜ 100% | 16,67%. 6 Другими словами, примерно в 17 случаях из 100 на кубике будет выпадать одно и то же число. Вообще встретить чисто случайное число крайне непросто. Ими могут являться, например, колебания голоса диктора радио во время помех — в этом случае изменение тональности голоса или его громкости заранее предсказать невозможно. Обратимся к компьютеру. Его память, как известно, ограниченна и может быть вполне выражена конкретной величиной (например, 16 гигабайт, 1 терабайт и так далее), а значит, и он не может «знать» бесконечно много чисел. Получается, что его диапазон «знаний» о числах тоже ограничен. Отсюда и возникает понятие ПСЕВДОслучайных чисел. Дело в том, что компьютер генерирует такое число путем выбора одного из некоего заданного диапазона. Такие числа «как бы случайны». С этим мы и познакомимся в первую очередь. Логика программы Создадим небольшую анимацию «Аквариум». Здесь главным действующим спрайтом будет рыбка. Мы сделаем так, чтобы она перемещалась по области анима-
Псевдослучайные числа, интерактивность, управление программами ции случайным образом, будто она плавает в воде. Нам уже знаком метод позиционирования объектов на экране с помощью координат — им мы и воспользуемся. Для начала удалим из области управления объекта Царапку и добавим новый объект из Библиотеки спрайтов. Нам понадобятся водные обитатели. Для этого выберем в открывшемся окне слева тему Подводный мир. В принципе, нам подойдет любая рыбка. Мы выберем Fish1 и нажмем ОК. Оформлением фона займемся чуть позже. Сейчас главное — заставить рыбку плавать. В Scratch программирование происходит интуитивно, поэтому нетрудно догадаться, что для этого понадобится команда Плыть … секунд в x:… y:… . 65
66 РАЗДЕЛ 1. Программирование Добавим ее из группы Движение в область скриптов. Мы помним, что первый параметр отвечает только за то, насколько быстро объект «приплывает» в заданную точку, поэтому его можно оставить равным единице. А вот параметры координат указывают, куда «поплывет» объект на экране. Из логики программы следует, что эта точка должна быть выбрана случайным образом. Для этого в группе Операторы существует команда Выдать случайное от … до … . Этот оператор нужно поместить в качестве параметра для координат x и y (для каждого поля свой оператор). Теперь нужно задать диапазон, из которого будет выбираться случайное число (но мы не забываем, что оно псевдослучайное). Как мы помним, экран в Scratch ограничен по оси x: от –240 до 240, а по оси y: от –180 до 180. Именно такие диапазоны и нужно задать в операторах. Отлично, рыбка будет плыть в случайно выбранную точку на экране. Теперь нужно подумать, а сколько раз она должна это делать. Настоящие живые рыбы плавают по аквариуму почти всегда. Пусть и наша рыбка будет плавать так же. Для этого поместим собранную команду в бесконечный цикл: добавим в область скриптов ко-
Псевдослучайные числа, интерактивность, управление программами манду Всегда из группы Управление, навесив ее на созданный скрипт. Остается добавить начало по нажатию зеленого флажка из группы События. Отлично! Программа готова! Для завершения композиции заменим белый фон на морской пейзаж. Для этого выберем в области управления объектами объект Сцена. Под этим объектом находятся команды добавления нового фона. Мы выберем фон из Библиотеки фонов. Для этого нужно кликнуть по прямоугольнику с холмами. 67
68 РАЗДЕЛ 1. Программирование Выберем в открывшемся окне тему Подводный мир. Из доступных фонов довольно симпатично выглядит underwater2. Выберем его и нажмем ОК. Замечательно! Теперь все готово к запуску. Нажмем на зеленый флажок и будем наблюдать, как плавает наша рыбка.
Псевдослучайные числа, интерактивность, управление программами Интерактивность Созерцание плавающих рыбок, конечно, успокаивает, но за этим лучше наблюдать в реальности. Гораздо интереснее было бы поуправлять каким-нибудь объектом на экране. Если программа (или объекты в ней) реагируют на действия пользователя, то говорят, что в ней реализована интерактивность (от англ. interaction — взаимодействие). В океане, помимо миролюбивых рыбок, обитает большое количество хищников. Одного из таких мы и возьмем под свое управление, а именно опасную зубастую акулу! Добавим ее из Библиотеки спрайтов, она также находится в теме Подводный мир под именем Shark. Создавая программу для другого объекта, мы должны следить за тем, чтобы именно он был активирован в области управления объектами. 69
70 РАЗДЕЛ 1. Программирование Логика программы Мы будем управлять движением акулы с помощью клавиш-стрелок на клавиатуре. Соответственно для каждой из четырех стрелок нужно задать свое поведение акулы. При нажатии стрелки вправо она должна поворачиваться вправо и плыть туда, при нажатии стрелки влево — влево. Это можно реализовать с помощью команды Идти … шагов. При нажатии стрелок вверх и вниз акула должна перемещаться выше и ниже — это мы сделаем с помощью изменения ее положения по оси y. Прежде всего нам нужно понять, каким образом можно обработать нажатие клавиши на клавиатуре. В группе События есть и другие команды для начала исполнения скрипта, одна из которых Когда клавиша … нажата. Попробуем реализовать интерактивность с ее помощью. Начнем с программирования поведения акулы при нажатии на клавишу Стрелка направо. Для этого выберем в выпадающем списке Стрелка направо. Сначала акула должна повернуться вправо. Для этого добавим команду Повернуть в направлении … из группы Движение.
Псевдослучайные числа, интерактивность, управление программами Значение 90 (направо) оставим по умолчанию. Теперь, когда акула «смотрит» в нужную сторону, она может начинать плыть. Для этого добавим команду Идти 10 шагов из группы Движение. Уже можно протестировать работу данного скрипта. При нажатии на клавиатуре клавиши Стрелка направо акула будет двигаться по экрану направо, причем для этого совсем не обязательно нажимать зеленый флажок — этот скрипт исполняется непосредственно при нажатии клавиши. Аналогичным образом запрограммируем нажатие стрелки влево, разница будет лишь в направлении: –90 (влево). Кстати! Для этого можно воспользоваться уже знакомым инструментом Дублировать. Вот так должен выглядеть следующий скрипт. Внимание! При тесте можно заметить, что акула переворачивается вверх брюхом, — это неверно. Мы помним, что во избежание этой ситуации в свойствах спрайта info нужно запретить поворот вокруг своей оси. 71
72 РАЗДЕЛ 1. Программирование Теперь зададим движение акулы по вертикали. В этом скрипте уже не будет использоваться команда Повернуть в направлении …, нам достаточно только изменить положение акулы по координате y. В этом нам поможет команда Изменить y на … из группы Движение. Вспомним, что изменение этой координаты на положительную величину приводит к перемещению объекта вверх. Значит, составим скрипт для обработки нажатия клавиши Стрелка вверх. Аналогично запрограммируем движение вниз. В этом случае координату y нужно изменить в отрицательную сторону. Теперь можно полноценно протестировать весь функционал нашего интерактива. Но вот какая незадача: если нажать одновременно две клавиши, например стрелку вправо и стрелку вниз, акула не поплывет к правому нижнему углу, как ожидалось бы. На деле происходит следующее:
Псевдослучайные числа, интерактивность, управление программами Акула плывет просто вправо (или вниз). Это происходит потому, что при нажатии каждой клавиши выполняется свой, отдельный скрипт. При нажатии же двух клавиш одновременно выполняется тот скрипт, который «отреагировал» раньше. Таким образом, хоть и кажется, что эти скрипты должны выполняться параллельно, на деле компьютер не обрабатывает одновременное нажатие двух клавиш. К тому же акула двигается не сразу, и ее движение нельзя назвать плавным. Опять же потому, что при удержании клавиши один и тот же скрипт запускается и завершается много раз подряд. Исправить ситуацию нам помогут бесконечный цикл и сведение всех четырех скриптов к одному, который будет запускаться по нажатии зеленого флажка. Сделаем заготовку из команды запуска и цикла Всегда. Чтобы компьютер мог «понимать» одновременное нажатие двух клавиш, ему необходимо постоянно проверять, нажата ли каждая из них. Именно поэтому мы и используем бесконечный цикл. Вся остальная часть скрипта должна находиться внутри этого цикла. Но теперь нужно будет заменить команду, проверяющую нажатие клавиши. Для этого используется блок Если из группы Управление (в программировании он называется оператором условия). В Scratch существует два вида условий. Первое: Если …, то … . 73
74 РАЗДЕЛ 1. Программирование Данная команда проверяет условие и, в случае его истинности, выполняет записанные внутри команды. В программировании ее называют неполной формой условия. И второе условие: Если …, то … иначе … . Эта команда проверяет условие, в случае его истинности выполняет заданные команды, а в случае его ложности выполняет альтернативные команды, записанные внутри блока Иначе. В программировании ее называют полной формой условия. Теперь соотнесем это с нажатием кнопки на клавиатуре. Для конкретики рассмотрим клавишу Стрелка направо. Если она нажата, то акула должна повернуться направо и начать движение в этом направлении. Если же не нажата, то никаких других действий она предпринимать не должна. Значит, нам будет достаточно неполной формы оператора условия. Приступим. Для начала нам нужно оставить уже заданные команды при нажатии клавиш со стрелками. Сейчас это четыре скрипта:
Псевдослучайные числа, интерактивность, управление программами Отсоединим команды движения от начала и удалим последние — для этого их достаточно перетащить влево ко всем командам. Вернемся к нашей заготовке с бесконечным циклом и добавим в него команду Если …, то … . 75
76 РАЗДЕЛ 1. Программирование Теперь мы должны проверить следующее условие: Если клавиша стрелка направо нажата, то … Мы видим, что форма поля для условия представляет собой шестиугольник. Команды, которые подойдут для него и будут что-то проверять, находятся в группе Сенсоры. Нам понадобится команда Клавиша … нажата? Поместим ее внутрь оператора условия. Выберем в качестве проверяемой клавиши из выпадающего списка Стрелка направо. Поместим внутрь условия команды, которые соответствуют нажатию этой клавиши. Их мы оставили выше.
Псевдослучайные числа, интерактивность, управление программами Добавим еще три команды Если …, то … из группы Управление. Важно! Одно условие не должно находиться внутри другого! И по аналогии с уже имеющейся запрограммируем остальные клавиши. В итоге получим следующий скрипт: 77
78 РАЗДЕЛ 1. Программирование Теперь можно запустить всю программу нажатием зеленого флажка. Здорово! Рыбка плавает по экрану, а акула управляется с помощью клавишей-стрелок и, главное, ее движения свободные и плавные! Управление программами В заключение рассмотрим метод взаимодействия скриптов друг с другом. Это позволит нам создать уже вторую мини-игру! Логика программы Доработаем наши программы так, чтобы создать мини-игру «Охота хищника». Задачей игрока будет съесть рыбку, управляя акулой. Для этого реализуем управление атакой — акула будет смыкать челюсти при нажатии клавиши Пробел. Если при этом рыбка окажется в пасти, то она будет съедена, и игра закончится. Начнем с простого — запрограммируем атаку для акулы. Так как смыкание челюстей — это одноразовое действие, нам вполне подойдет команда Когда клавиша … нажата из группы События. В качестве проверяемой клавиши по умолчанию оставляем Пробел.
Псевдослучайные числа, интерактивность, управление программами Теперь перейдем на вкладку Костюмы у акулы. Мы видим, что у этого спрайта три костюма: 1) shark-a — сомкнутые челюсти; 2) shark-b — открытая пасть; 3) shark-c — акула плохо себя чувствует. Для наших целей понадобятся только первые два. При нажатии на клавишу Пробел акула должна сомкнуть челюсти, то есть перейти к костюму shark-a. Перетащим команду Сменить костюм на … из группы Внешность и выберем в выпадающем списке нужный нам костюм. После того как акула сомкнула челюсти, она должна их немного подержать закрытыми, а затем снова раскрыть пасть. Значит, понадобится сделать задержку и потом вернуться к костюму shark-b. 79
80 РАЗДЕЛ 1. Программирование Добавим команду Ждать … секунд из группы Управление. Пускай акула держит пасть закрытой в течение трех секунд — в качестве параметра зададим число 3. Далее сменим костюм на shark-b. Давайте протестируем наш скрипт, нажимая клавишу Пробел. Все получилось! Остается только при запуске мини-игры сделать так, чтобы пасть у акулы была открыта. Для этого добавим в скрипте управления с клавиатуры в самом начале до цикла команду Сменить костюм на shark-b.
Псевдослучайные числа, интерактивность, управление программами Теперь реализуем то, о чем говорилось выше, а именно один скрипт будет управлять другим. Это нужно для того, чтобы рыбка «понимала», что ее съели. В Scratch для этого используется метод отправки специальных системных сообщений, которые не видны пользователю, но на которые реагируют скрипты. Такое сообщение акула будет отправлять каждый раз, когда она атакует. Для этого воспользуемся командой Передать … из группы Управление. Добавим ее в начало скрипта атаки. По умолчанию сообщение называется «сообщение1», но сделаем его более понятным. Выберем из выпадающего списка Новое сообщение. 81
82 РАЗДЕЛ 1. Программирование Введем в открывшемся окне текст сообщения, например Съел!, и нажмем ОК. Теперь нам нужно создать скрипт, который будет реагировать на это сообщение. Съеденной должна оказаться рыбка, поэтому активируем ее в области управления объектов, добавляем команду Когда я получу … из группы События и выбираем сообщение Съел! из выпадающего списка. Как мы описывали в логике программы, рыбка считается съеденной, если в момент атаки она оказалась в пасти акулы. Как же это проверить? Можно придумать много разных способов. Мы реализуем один из них. Заметим, что зубы у акулы белого цвета, весь остальной антураж чисто белого цвета не содержит, а значит, можно создать условие, в котором проверяется касание рыбкой белого цвета. Добавим команду Если …, то … из группы Управление. Всевозможные проверки состояния объектов содержатся в группе Сенсоры, оттуда мы перетащим команду Касается цвета … ? Нам нужно задать белый цвет зубов. Для этого кликнем в квадратик с цветом. При этом курсор мыши
Псевдослучайные числа, интерактивность, управление программами изменится на руку, с помощью которой мы должны указать нужный цвет, то есть кликнуть по белой области зуба акулы (если не получается попасть, то можно взять тот же белый цвет из ее глаз). Теперь, когда рыбка получила сообщение и проверила, что она в этот момент была в пасти (касалась белых зубов) и, увы, ее игра окончена, она должна пропасть с экрана, а все ее скрипты должны остановиться. Сначала уберем ее с экрана. Для этого добавим команду Спрятаться из группы Внешность. После того как рыбка пропала с экрана, нужно остановить все остальные ее скрипты. Для этого служит команда Стоп … из группы Управление. 83
84 РАЗДЕЛ 1. Программирование Выберем из выпадающего списка пункт Другие скрипты спрайта. Соответственно теперь при запуске программы рыбка должна появиться. Для этого добавим команду Показаться из группы Внешность в начало скрипта, управляющего ее движением по экрану. Наша игра почти готова! Остается только немного изменить размеры рыбки и акулы. Для этого воспользуемся уже знакомым инструментом Уменьшить. Чудесно! Нажимаем на зеленый флажок и объявляем охоту открытой! Что мы теперь знаем и умеем 1. Мы научились работать с новой группой команд Операторы и генерировать псевдослучайные числа.
Переменные 2. Поняли, как создавать интерактивные программы на примере управления объектами с клавиатуры, а также изучили два способа обработки нажатия клавиши: одноразовый и постоянный. 3. Также мы научились отправлять системные сообщения, с помощью которых один скрипт управляет любыми другими. 4. В итоге создали вторую мини-игру «Охота хищника». О чем мы должны подумать 1. К какому виду алгоритмов принадлежат составленные нами скрипты? 2. Где в реальности мы можем встретить псевдослучайные числа? 3. Какие еще существуют явления, которые могут быть выражены чисто случайными числами? 4. Каким образом может быть организована интерактивность и где мы ее встречаем? Задания для прохождения пятого уровня и получения звания «Кодер» 1. Усовершенствуйте игру — добавьте больше рыбок для охоты. 2. Сделайте так, чтобы при съедании каждой рыбки акула говорила «ням-ням». 3. Добавьте противника акулы, например морского ежа или краба, при съедании которого акула чувствует себя плохо, и игра заканчивается. Переменные УРОВЕНЬ 6: «Властелин значений» На шестом уровне мы познакомимся с понятием переменной и узнаем, что она из себя представляет в компьютере. Также мы узнаем, как организована память 85
86 РАЗДЕЛ 1. Программирование компьютера. Далее мы освоим применение переменных в Scratch и создадим третью мини-игру «Летающий бегемотик», в которой увидим, какие возможности открывают перед нами переменные. Переменные Всем нам этот термин знаком из курса математики. Но что такое переменная по своей сути? На этот вопрос не каждый может сразу дать ответ. Например, с точки зрения той же математики, это символ (буква), обозначающий какую-то неизвестную величину. Вспомним уравнения: x  12 15. В этом несложном примере символом x обозначено неизвестное число, которое нужно найти, чтобы решить уравнение. Очевидно, что в данном случае x 3, так как при подстановке мы получим верное равенство: 3  12 15. Рассмотрим еще одно уравнение: x2 9. Здесь для x подойдут уже два значения: x x –3. Действительно: 32 9 и (–3)2 3 и 9. Таким образом, можно сделать вывод, что переменная характеризуется некоторым набором значений. Даже само ее название происходит от глагола «менять». Ведь так и есть, вместо x в уравнение могут быть подставлены самые разные значения, и они будут меняться в зависимости от самого уравнения и его составляющих. Однако не все так просто и очевидно, когда речь заходит о переменных в компьютере и, в частности, в программировании. Дело в том, что для математики, как это ни странно, переменная носит абстрактный характер. Другими словами, то число, которое мы ста-
Переменные вим вместо переменной, может обозначать что угодно: расстояние в километрах, число людей в комнате, температуру воздуха на улице и так далее. В компьютере же ничего абстрактного нет. Любое число — это некоторый набор электрических сигналов, которые так или иначе хранятся в его памяти. Чтобы понять это, рассмотрим пример. Пусть у нас есть три одинаковые коробки. Чтобы в них не запутаться, подпишем их: одна из них будет предназначена для игрушек, другая — для конфет и третья — для учебников. В каждую из них мы будем класть соответствующие ей предметы. Если мы попытаемся положить в коробку с надписью «Игрушки» несколько конфет, то это приведет к путанице, а значит, так делать нельзя. 87
88 РАЗДЕЛ 1. Программирование И вот какие выводы мы теперь готовы сделать. 1. Коробка — это своеобразная переменная, то есть место для хранения различных объектов. 2. Надпись на коробке — это имя переменной, так как нам нужно знать, к какому конкретно месту хранения мы хотим обратиться сейчас. 3. Объекты, помещаемые в коробку, — это значения переменной, то есть то, что в ней непосредственно хранится, причем эти значения должны соответствовать назначению самой переменной. Теперь мы знаем, что переменная в общем случае — это место для хранения значений, которое имеет определенное имя и назначение. В компьютере любые данные хранятся в памяти, а значит, мы можем наконец дать полноценное определение. Переменная (в компьютере и программировании) — это именованная область памяти, предназначенная для хранения определенного значения. Память компьютера Мы существенно продвинулись в понимании понятия «переменная». Осталось лишь разобраться с тем, какое значение может храниться в ней. Так как переменная напрямую связана с памятью компьютера, рассмотрим, как она организована. Все данные в компьютере представляются и хранятся в виде чисел, которые составляются только из нулей и единиц.
Переменные Как уже упоминалось, компьютер — электронное устройство, а значит, он способен «понимать» только два значения (состояния): 0 — нет электрического тока; 1 — электрический ток есть. В связи с этим, как бы удивительно это ни выглядело, вся информация — картинки, фотографии, фильмы, музыка, песни, текст, числа — хранится в компьютере в виде последовательности нулей и единиц. Такую информацию еще называют цифровой. Память компьютера, в свою очередь, разбита на отдельные участки — ячейки памяти, которые обрабатывает в основном процессор. Если попробовать изобразить эту ячейку, то вот что мы увидим: 1 0 0 1 1 1 0 1 Такая ячейка называется байтом, и ее длина составляет восемь цифр, причем каждое «место» в ней называется битом. Ячейка памяти — это один байт данных, состоящий из восьми бит. Итак, какие же значения могут храниться в переменной, если она является одной или несколькими ячейками памяти? 89
90 РАЗДЕЛ 1. Программирование Переменная — не слишком сложная структура, так что она позволяет записывать в себя и хранить: число; 9 результат арифметического выражения; 9 символ; 9 строку (последовательность символов); 9 значение другой переменной. 9 Важно! В одной переменной (области памяти) может храниться только одно конкретное значение. При попытке записать в нее новое значение, старое будет удалено. Переменные в Scratch В Scratch все переменные создаются и содержатся в группе команд Данные. Здесь можно создать как одну переменную, так и целый их набор, называемый списком. Однако список — довольно сложная структура, имеющая свои приемы обработки и хранения данных, поэтому мы ее рассматривать не будем. С ней можно будет познакомиться самостоятельно, основываясь на знаниях о переменных. Создадим тестовую переменную и рассмотрим, какие команды нам станут доступны. Для этого кликнем по кнопке Создать переменную.
Переменные Впишем в открывшееся окно имя переменной TEST. Также здесь можно выбрать, будет ли переменная доступна всем спрайтам (глобальная) или же работать с ней будет позволено только данному конкретному спрайту (локальная). Оставим по умолчанию Для всех спрайтов и нажмем ОК. Теперь мы видим, что для работы с этой переменной появились новые команды, а сама переменная и записанное в нее значение отобразились в области анимации. Разберемся по порядку. 1. Овальный объект с именем TEST — это собственно сама переменная, ее мы можем использовать для того, чтобы обращаться к той области памя- 91
92 РАЗДЕЛ 1. Программирование ти, где хранится конкретное значение. Галочка слева отвечает за отображение имени переменной и ее значения в области анимации. 2. Задать … значение … — записывает в выбранную переменную конкретное значение, программисты называют этот процесс присваиванием. 3. Изменить … на … — изменяет значение выбранной переменной на заданную величину (прибавляет или вычитает конкретное значение). 4. Показать переменную … — отображает имя и значение выбранной переменной в области анимации. 5. Скрыть переменную … — скрывает имя и значение выбранной переменной в области анимации. К тому же, как мы видим в области анимации, изначально значением переменной TEST является ноль. Кстати! Если в переменную изначально записано какое-то значение, то говорят, что она инициализирована — это хороший тон в программировании, к тому же он позволяет избегать множества ошибок при работе с переменными. Летающий бегемотик Проиллюстрируем способы работы с переменными и их значениями на примере создания мини-игры, целью которой будет не дать упасть спрайту на экране вниз. Для этого у нас есть симпатичный бегемотик с крылышками в Библиотеке спрайтов, категории Животные под именем Hippo1. Добавим его в область управления объектами, предварительно удалив Царапку.
Переменные Логика программы Мы будем управлять полетом бегемотика с помощью клавиши Пробел — при каждом нажатии этой клавиши бегемот будет взмахивать крылышками и подниматься вверх. Когда мы не предпринимаем никаких действий, бегемот медленно падает вниз. Если он упадет, то мы проиграем. За положение бегемотика по высоте будет отвечать переменная Height (в переводе с английского — высота). Именно ее мы и будем изменять. Создадим саму переменную Height в группе Данные. 93
94 РАЗДЕЛ 1. Программирование Так как эта переменная отвечает за положение бегемотика по высоте (то есть по координате y), в начале программы мы должны задать исходное значение для нее и сделать так, чтобы бегемот «считывал» высоту своего полета из нее. Добавим команду Когда щелкнут по зеленому флажку из группы События. Далее обнулим переменную Height, для этого добавим команду Задать … значение … из группы Данные. Все параметры оставим по умолчанию — это именно то, что нам нужно. Важно! Обнуление нужно для того, чтобы очистить переменную от других значений, которые могли остаться в ней после предыдущего запуска программы. Теперь сделаем так, чтобы бегемот постоянно устанавливал свое положение по высоте в соответствии с переменной. Добавим цикл Всегда из группы Управление. Добавим внутрь команду Установить y в … из группы Движение.
Переменные В качестве устанавливаемого значения нам нужна величина, записанная в переменную Height. Для этого из группы Данные перетащим саму переменную в поле этой команды. Теперь сделаем так, чтобы бегемотик постепенно падал. Для этого нужно постоянно уменьшать значение переменной Height с помощью отдельного скрипта, стартующего по нажатию зеленого флажка, и бесконечного цикла Всегда. Внутри нам нужно изменять значение переменной Height в отрицательную сторону. Для этого поместим в цикл команду Изменить Height на … из группы Данные и в качестве параметра зададим –2. Можно запустить и протестировать работу программы — бегемотик должен постепенно падать вниз. Далее добавим элемент интерактивности. При нажатии на клавишу Пробел бегемотик будет взмахивать крыльями (менять костюм) и подниматься выше, то есть координата y будет изменяться в положительную сторону. Для этого нам понадобится третий скрипт. Его начинаем с команды Когда клавиша пробел нажата из группы События. 95
96 РАЗДЕЛ 1. Программирование Далее добавляем команду Следующий костюм из группы Внешность. Затем введем команду Изменить Height на … из группы Данные. Запишем в качестве параметра 10. Теперь программу можно запустить и протестировать. Бегемотик будет медленно падать, а при многократном нажатии клавиши Пробел взлетать вверх. Однако вот какую ошибку мы можем заметить: если достаточно много раз нажать на эту клавишу, то значение переменной Height превзойдет размеры экрана (напомним, по оси y он ограничен 180), и бегемотик зависнет сверху. Ликвидировать эту ошибку можно с помощью условия. Каждый раз будем проверять, не превысило ли значение этой переменной 171 (так как мы прибавляем по 10, а значит, 181 получить не должны). Если превысило, то нужно просто ничего не делать. Добавим к нашему скрипту условие Если …, то … из группы Управление, причем все команды должны попасть внутрь.
Переменные Далее проверим в качестве условия: Если Height < 171. Добавим в ячейку условия сравнение из группы Операторы. В качестве первого параметра выступает переменная Height из группы Данные, а в качестве второго вводим с клавиатуры число 171. Теперь добавим фон, чтобы понимать, какое положение бегемотика будет завершать игру. В Библиотеке фонов в категории На открытом воздухе есть, например, фон с именем boardwalk. Расположим бегемотика в том положении, которое, как мы считаем, завершит игру. В области скриптов в правом верхнем углу есть координаты текущего положения бегемотика. Тогда будем считать, что если бегемот опустится ниже –80 по координате y, то это проигрыш. Значит, 97
98 РАЗДЕЛ 1. Программирование в скрипте, отвечающем за «падение», нужно добавить условие Если …, то … . Здесь нам нужно будет проверить следующее: Если Height < – 80, и если это действительно так, то бегемот закричит, что он упал, а все скрипты остановятся. Сформируем уже знакомыми способами такое условие и поместим его в ячейку проверки. Добавим внутрь команду Говорить … в течение 2 секунд из группы Внешность, а в качестве «крика» напишем: «Ой, я упал!». После этого нужно остановить все скрипты. Для этого добавим команду Стоп все из группы Управление.
Переменные Наша новая мини-игра готова! Не дадим бегемотику упасть! Что мы теперь знаем и умеем 1. Мы изучили понятие переменной и поняли, чем отличается переменная в математике от переменной в компьютере и программировании. 2. Мы научились работать с новой группой команд Данные, а также создавать переменные и использовать их при управлении объектами. 3. В итоге создали мини-игру «Летающий бегемотик». О чем мы должны подумать 1. Что такое переменная относительно компьютера? 2. В каком виде представляется информация в памяти компьютера? 3. Что такое ячейка памяти и из чего она состоит? 4. Какие значения может хранить переменная? Задания для прохождения шестого уровня и получения звания «Властелин значений» 1. Усовершенствуйте игру «Охота хищника» из предыдущего уровня — добавьте счетчик съеденных рыбок. 99
100 РАЗДЕЛ 1. Программирование 2. Создайте таймер обратного отсчета, по истечении которого игра будет завершаться, если не все рыбки съедены. 3. Создайте таблицу рекордов из трех позиций, куда будет записываться наилучшее время прохождения игры (для этого понадобятся три переменные). Ввод данных УРОВЕНЬ 7: «Эксперт компьютерного диалога» На этом уровне мы научимся вводить данные (например, собственное имя) с клавиатуры, а программа будет их обрабатывать. Разберемся, каким образом организуется запрос ввода с клавиатуры и куда попадают все введенные с клавиатуры значения. Для иллюстрации этого процесса мы напишем программу «Кот ученый», в которой мы сможем наконец поговорить с нашим главным героем — Царапкой. Ввод данных Это новый для нас механизм, который позволит не просто расширить принцип интерактивности, но и еще сильнее «сблизить» нас с программой. По сути, мы сможем общаться со спрайтами и, в зависимости от наших ответов, будут происходить те или иные события. В Scratch за этот функционал отвечает команда Спросить … и ждать из группы Сенсоры. Попробуем сделать так, чтобы Царапка нас приветствовал, а затем спрашивал наше имя, которое мы введем с клавиатуры. Для этого перетащим команду
Ввод данных Когда щелкнут по зеленому флажку, затем Говорить … в течение … секунд из группы Внешность. В качестве произносимой фразы запишем: «Привет!». Далее добавим нашу новую команду Спросить … и ждать из группы Сенсоры и в качестве вопроса запишем: «Как тебя зовут?». Запустим нашу программу и посмотрим, что будет происходить. 101
102 РАЗДЕЛ 1. Программирование После приветствия Царапка спрашивает наше имя, а внизу появляется специальное поле для ввода ответа. Запишем туда имя и нажмем кнопку с галочкой (либо клавишу Enter на клавиатуре). И что в итоге? Пока мы не видим никаких изменений: Царапка никак не реагирует на то, что мы ввели. А главное: куда делось то, что мы ввели с клавиатуры? Все предельно просто! Мы уже знаем, что для хранения любых данных используются переменные, и этот случай не будет исключением! Откроем группу команд Сенсоры. Под командой запроса ввода есть специальная переменная с именем ответ. Именно в нее попадает все, что мы вводим с клавиатуры при запросе от спрайта. Поставим рядом с этой переменной галочку для отображения ее содержимого в области анимации. Теперь мы видим, что сейчас в ней действительно хранится введенное нами имя «Борис». Обработаем содержимое этой переменной. Пусть Царапка ответит нам: «Приятно познакомиться, Борис!». Понятно, что нам понадобится очередная команда Говорить … в течение … секунд из группы Внешность.
Ввод данных Но теперь разберемся с той фразой, которую мы хотим вывести на экран. Она состоит из строки «Приятно познакомиться, », значения переменной Ответ и символа «!». Другими словами, мы хотим вывести одновременно три совершенно разных по своему типу значения, а окошко для вывода всего одно. Что же делать? Создать больше окошек! В этом нам поможет команда Слить … и … из группы Операторы. Эта команда, по сути, из одного окошка делает два. Нам же понадобятся три: Приятно познакомиться, Борис ! Добавим эту команду внутрь окошка вывода. Добавим в одно из окошек точно такую же команду. Теперь нам этого вполне хватает. 1. Вписываем в первое окошко с клавиатуры фразу «Приятно познакомиться, » (обязательно с пробелом в конце, чтобы отделить имя). 2. Помещаем во второе переменную Ответ. 3. Вводим в третье с клавиатуры символ «!». 103
104 РАЗДЕЛ 1. Программирование Теперь запустим нашу программу, введем имя и действительно увидим реакцию Царапки! Этот удивительный мир чисел Теперь мы продолжим пользоваться нашим новым инструментом и организуем небольшой игровой момент. Логика программы После приветствия и запроса имени Царапка предложит нам ответить на вечный математический вопрос: «Сколько будет 2*2?». В зависимости от нашего ответа он скажет: «Правильно!» или «Неправильно!», а затем предложит посмотреть на его математические способности и запросит поочередно два числа, которые перемножит «в уме». Для последнего нам понадобятся сторонние переменные, так как одновременно два различных значения в переменной Ответ храниться не могут. Добавим еще одну команду Спросить … и ждать из группы Сенсоры. В качестве вопроса введем: «Сколько будет 2*2?».
Ввод данных Далее нужно проверить правильность введенного ответа, то есть применить условный оператор, причем его полную форму, так как нам понадобится обрабатывать и правильный, и неправильный ответы. Добавим команду Если …, то …, иначе … из группы Управление. В качестве условия нужно проверить следующее: Если ответ = 4. Соберем это выражение из оператора … …, переменной Ответ и числа 4. В случае истинности условия мы выведем сообщение «Правильно!». Для этого добавим после «то…» команду Говорить … в течение 2 секунд, а в качестве сообщения запишем: «Правильно!». В случае неправильного ответа (то есть ложности проверенного условия) мы выведем сообщение «Непра- 105
106 РАЗДЕЛ 1. Программирование вильно!». Добавим аналогичную команду после «Иначе …» и запишем в качестве сообщения: «Неправильно!». Можно запустить и протестировать нашу программу. Мы увидим, что все работает корректно и так, как мы задумали. Далее Царапка предложит оценить его способности. Кстати! Можно заметить, что на протяжении всего нашего обучения мы периодически запускаем фрагменты скриптов, чтобы увидеть, на правильном ли мы пути. Программисты называют это промежуточным тестированием. Добавим после условия очередную команду Говорить … в течение 2 секунд и запишем для вывода сообщение: «Посмотри, как я умею считать!». Далее он запросит одно число. Добавим команду Спросить … и ждать из группы Сенсоры. В качестве сообщения выведем: «Введи любое число!». После ввода с клавиатуры такое число попадет в переменную Ответ. Так как мы будем запрашивать еще
Ввод данных и второе число, нам понадобится отдельная переменная для хранения первого ответа. Зайдем в группу Данные и нажмем кнопку Создать переменную. Дадим название этой переменной в открывшемся окне, например a (но обязательно в английской раскладке) и нажмем ОК. В эту переменную мы должны записать значение переменной Ответ. Для этого добавим команду Задать a значение … из группы Данные. Поместим в качестве задаваемого значения переменную Ответ из группы Сенсоры. Отлично! Теперь мы готовы запросить второе число. Добавим еще одну команду Спросить … и ждать из группы Сенсоры. Сообщение будет следующим: «Введи еще одно число!». 107
108 РАЗДЕЛ 1. Программирование Введенное число снова попадет в переменную Ответ, и, в принципе, мы уже можем начать обработку. Но для порядка создадим еще одну переменную с именем b и присвоим ей значение Ответ. В итоге получится следующий фрагмент скрипта: Остается вывести их на экран, а затем перемножить и показать результат. Первая фраза будет построена из следующих фрагментов: «Перемножаю», a, «и», b, «!», то есть из пяти различных по своему типу значений. Вторая: «Их произведение равно:», a*b — из двух, причем второе значение является арифметическим выражением, для которого мы должны сразу вывести результат. Начнем по порядку. Добавим команду Говорить … в течение … секунд. Для первой фразы нам понадобится пять окошек. Создадим их с помощью команд Слить … … из группы Операторы, добавляя одну в другую. Теперь начинаем последовательно добавлять все компоненты фразы. Вводим в первое окно с клавиатуры фразу: «Перемножаю: ».
Ввод данных Помещаем в следующее переменную a из группы Данные. Далее снова вводим с клавиатуры строку: « и » (с пробелами). Затем помещаем вторую переменную b из группы Данные. И вводим в последнее окошко с клавиатуры знак «!». Остается вывести результат, то есть само произведение. Для этого создаем аналогичную конструкцию, но всего с двумя окошками (одна команда Слить … …). Записываем в первое окошко с клавиатуры строку: «Их произведение равно: ». Во втором окошке нам нужно создать арифметическое выражение, которое будет посчитано, и на экране выведется уже готовый результат. Для этого воспользуемся оператором умножения … * … из группы Операторы — поместим его во второе окно вывода. В качестве перемножаемых значений выступят переменные a и b из группы Данные. 109
110 РАЗДЕЛ 1. Программирование Готово! Теперь можно запустить программу и пообщаться с Царапкой на математическом уровне! Царапка подает голос В завершение добавим в наш скрипт возможность услышать, как Царапка мяукает. Логика программы Царапка запросит ответ на вопрос: «Хочешь услышать, как я умею мяукать?». Если пользователь введет «Да», то Царапка издаст звук, а если «Нет», то просто попрощается.
Ввод данных Добавим к нашему скрипту еще одну команду Спросить … и ждать из группы Сенсоры. В сообщении укажем: «Хочешь услышать, как я умею мяукать?». Далее, после ввода мы должны проверить условие: Если ответ = Да. В случае истинности Царапка издаст звук «мяу», в случае ложности попрощается. Добавим полное условие из группы Управление. Создаем проверку из команды … = … группы Операторы, переменной Ответ и строки «Да». В случае истинности воспроизводим звук. Для этого добавим команду Играть звук … из еще не изученной нами группы Звук. 111
112 РАЗДЕЛ 1. Программирование По умолчанию здесь указан звук meow, именно он нам и нужен. Что это за звук, можно всегда узнать на вкладке Звуки, расположенной рядом с Костюмами. В случае ложности мы выводим на экран фразу: «Ну ладно! Еще увидимся! Пока!». Теперь Царапка общается с нами с помощью не только текста, но и звука! Что мы теперь знаем и умеем 1. Мы изучили, каким образом осуществляется ввод данных. 2. Узнали, где сохраняется все, что мы вводим с клавиатуры в ответ на запрос. 3. Познакомились со способом сохранения нескольких значений, вводимых с клавиатуры. 4. Поняли, что для вывода информации на экран не всегда хватает одного окошка команды Слить ... ... . 5. Наконец мы немного затронули группу команд Звук.
Математический тренажер 6. В итоге создали интеллектуальную программу, где мы смогли пообщаться с Царапкой. О чем мы должны подумать 1. В какую переменную попадают данные, введенные с клавиатуры? 2. Что происходит с содержимым этой переменной, когда туда попадает новое значение, введенное с клавиатуры? 3. Как сохранить несколько значений, которые последовательно вводятся с клавиатуры? 4. В каких случаях требуется увеличивать количество окошек для вывода информации на экран? 5. С помощью какой команды можно это сделать? Задания для прохождения седьмого уровня и получения звания «Эксперт компьютерного диалога» 1. Расширьте функционал созданной программы, добавив новые вопросы и элементы общения, влияющие на поведение Царапки. 2. Создайте программу «Угадай-ка!», в которой Царапка будет загадывать случайное число, а вы будете пытаться его отгадать. При неправильном ответе Царапка должен подсказывать, каково его число — больше или меньше вашего ответа. 3. Усовершенствуйте программу «Угадай-ка!» — добавьте ограничение по количеству попыток для отгадки. Математический тренажер УРОВЕНЬ 8: «Программист» На финальном уровне в качестве итоговой работы мы создадим самый настоящий математический тренажер, призванный улучшить навыки устного счета, и 113
114 РАЗДЕЛ 1. Программирование тем самым систематизируем все знания, полученные в данном разделе. Мы не будем пошагово рассказывать, как создать такую программу, а лишь разберемся в логике построения такой программы и составим план нашей программы (программисты называют его псевдокодом). Сам тренажер нужно будет написать самостоятельно. Для проверки в конце данной книги приведен готовый скрипт для этой программы. Однако настоятельно рекомендуем попробовать все сделать самим, ведь вы уже столько всего узнали! Свериться с ответом можно или когда все получится, или в самом крайнем «тупиковом» случае. Давайте почувствуем себя настоящими программистами, для которых заказчик формирует так называемое техническое задание. Оно будет состоять из следующих пунктов. 1. Постановка задачи — какую программу мы хотим получить и каков ее функционал. 2. Исходные данные — какие переменные и для чего нам понадобятся. 3. Псевдокод — описание логики действий на естественном языке, выполняемых в программе. Постановка задачи Необходимо написать математический тренажер, в котором будут генерироваться 10 случайных примеров на сложение двух чисел. Пользователь дает ответ на каждый новый пример, считая сумму. После чего его личный результат будет выводиться в игровой форме, то есть согласно следующей шкале: 1) от 0 до 2 правильных ответов — «Плоховато, попробуй еще раз!»; 2) от 3 до 5 — «Нормально, но ты можешь и лучше!»; 3) от 6 до 8 — «Хорошо! Ты молодец!»; 4) от 9 до 10 — «Отлично! Ты великий математик!».
Математический тренажер Исходные данные Нам понадобятся следующие переменные: A — в ней будет генерироваться первое слагаемое случайным образом; B — в ней будет генерироваться второе слагаемое случайным образом; SUM (в переводе с английского — сумма) — здесь будет подсчитываться правильная сумма A  B, служащая для проверки ответа пользователя; Ответ — стандартная переменная, в которой будет храниться ответ пользователя на каждый предлагаемый пример; COUNT (в переводе с английского — счет) — эта переменная будет считать количество правильных ответов, которые дал пользователь. Псевдокод Теперь напишем на естественном языке псевдокод для нашей программы и снабдим каждую строку дополнительными комментариями. Псевдокод Комментарии Начало Любой скрипт должен начинаться по какому-то событию, например при нажатии зеленого флажка COUNT := 0 Обнуление количества правильных ответов (инициализируем переменную COUNT) Повторить 10 раз: Цикл, повторяющийся 10 раз, так как нужно сгенерировать 10 различных примеров, 10 раз запросить ответ и проверить его правильность A := Случайное от 1 до 10 Генерация случайного числа от 1 до 10 и запись в переменную A B := Случайное от 1 до 10 Генерация случайного числа от 1 до 10 и запись в переменную B 115
116 РАЗДЕЛ 1. Программирование Окончание табл. Псевдокод Комментарии Спросить «A, ‘+’, B,‘=?’» Вывод на экран примера, состоящего и ждать из четырех различных по своему типу значений и ожидание ввода ответа SUM := A+B Счет суммы A + B и присваивание результата переменной SUM Если SUM = ответ, то: Проверка совпадения правильной суммы и ответа пользователя COUNT + 1 При истинности условия увеличение COUNT на единицу Если COUNT < 3, то: «Плоховато, попробуй еще раз!» Иначе: После завершения цикла проверка количества правильных ответов. Здесь проверка попадания в диапазон от 0 до 2 При истинности условия вывод на экран соответствующей строки При ложности условия… Если COUNT < 6, то: …проверка попадания в диапазон от 3 до 5 «Нормально, но ты можешь и лучше!» При истинности условия вывод на экран соответствующей строки Иначе: При ложности условия… Если COUNT < 9, то: …проверка попадания в диапазон от 6 до 8 «Хорошо! Ты молодец!» При истинности условия вывод на экран соответствующей строки Иначе: «Отлично! Ты великий математик!» Конец При ложности условия… …вывод на экран соответствующей строки, так как последняя проверка не требуется — остался единственный вариант Конец скрипта
Математический тренажер Что мы теперь знаем и умеем 1. Мы познакомились с первой структурой технического задания и почувствовали себя настоящими программистами. 2. Узнали, что такое псевдокод и научились создавать программу, ориентируясь на него. 3. Обобщили и систематизировали все знания, полученные нами в этом разделе. 4. Осталось выполнить задания, и мы сможем смело именовать себя гордым словом «программист». О чем мы должны подумать 1. Какие составляющие должны быть в техническом задании для программиста? 2. Какие разделы можно еще добавить в техническое задание? 3. Что должен содержать раздел «Постановка задачи»? 4. Что должен содержать раздел «Исходные данные»? 5. Для чего нужен псевдокод? 6. Какие переменные нужно спрятать, а какие можно оставить для отображения на экране? Задания для прохождения восьмого уровня и получения звания «программист» 1. Усложните программу, увеличив диапазон случайных чисел для генерации слагаемых. Оцените, как изменится скорость счета пользователя и время его работы с тренажером (можно также воспользоваться командами Таймер и Перезапустить таймер из группы Сенсоры для точности). 2. Доработайте программу — сделайте так, чтобы Царапка спрашивал, хочет ли пользователь попробовать заново в тех случаях, когда он не набрал максимальное количество очков, и запускал тренажер заново в случае положительного ответа. 117
118 РАЗДЕЛ 1. Программирование 3. Расширьте функционал программы — пусть она станет более приветливой, спрашивает имя и предлагает выбрать, какой навык мы будем тренировать: сложение чисел или умножение и, в зависимости от выбора пользователя, начнет генерировать соответствующие примеры.
РАЗДЕЛ 2. Создание игр Во втором разделе нашего увлекательного путешествия мы закрепим все приобретенные знания и навыки настоящего программиста. Мы создадим три действительно серьезные игры, которые имели бешеную популярность в свое время и остаются интересны по сей день, вдохновляя все больше и больше людей вступать на тропу разработки игровых решений. Вот какие игры нам предстоит реализовать. ™ Arkanoid — легендарная игра, давшая название целому жанру игр-арканоидов. Сегодня ее реализация на первый взгляд довольно проста, но она и является первым шагом в мир разработки! ™ «Змейка» — игра, которая была популярна у ваших родителей и в которую продолжают активно играть новые поколения, устанавливая все новые и новые рекорды по длине главного игрового персонажа — змеи! ™ Pong — самая первая массовая игра, предназначенная как для игры вдвоем, так и против компьютера. Создавая ее, мы узнаем, как научить компьютер «видеть» и анализировать увиденное, подобно человеку! Для каждой из игр мы: ™ создадим первоначальную версию 1.0; ™ произведем апгрейд до версии 2.0; ™ подключим геймпад и запрограммируем его для управления игрой;1 ™ попробуем реализовать идеи расширения функционала игры для очередного апгрейда до версии 3.0. Вперед, навстречу мечте о создании собственных по-настоящему классных игр! 1 Данный пункт не является обязательным, если вы не располагаете ROBBO Lab или ScratchDuino.Лаборатория. Все игры создаются изначально для управления с помощью клавиатуры и мыши.
РАЗДЕЛ 2. Создание игр 120 ROBBO Lab Что это такое? ROBBO Lab — это электронная плата с имеющимися на ней дополнительными элементами, которые могут служить для управления объектами в Scratch и проведения исследований по физике, информатике, программированию, робототехнике. Как мы будем ее использовать? ROBBO Lab очень похожа на «умный» пульт управления, который можно интересным образом использовать в качестве игрового манипулятора в создаваемых нами играх, и с этого момента будем называть ее геймпадом1. 1 Геймпад (от англ. gamepad) — один из самых популярных типов игровых манипуляторов, представляющий собой пульт, который удерживается двумя руками.
ROBBO Lab Из чего состоит ROBBO Lab? 1. Рычажок (слайдер), положение которого может считывать программа (0 — левое положение, 100 — правое положение). 2. Три цветных светодиода (красный, желтый, зеленый). 3. Лента из восьми светодиодов. 4. Пьезодинамик, способный воспроизводить ноты (тоны). 5. Пять кнопок с двумя состояниями: ложь — не нажата, истина — нажата. 6. Кнопка перезагрузки платы — заново запускает программу, загруженную в память платы. 7. Вход для внешнего цифрового датчика (со значениями 0 и 1). 8. Вход А1 для внешнего аналогового датчика (со значениями от 0 до 100). 9. Вход А0 для внешнего аналогового датчика (со значениями от 0 до 100). 10. Пины (коннекторы) встроенной платы Arduino Uno. 11. Микропереключатели: y 1-ON: частичное отключение компонентов Лаборатории (#1, #3, #4, #12, #13) для использования вместо них соответствующих пинов встроенной платы Arduino Uno; y 1-OFF: включены все компоненты Лаборатории, пины внутренней платы перенаправлены на Лабораторию (недоступны для прямой работы с Arduino Uno); y 2-ON: последовательный порт переключен на взаимодействие по пинам встроенной платы Arduino Uno (D0/RX, D1/TX) (например, для последовательного соединения нескольких плат Arduino Uno); USB-контроллер (цепь FTDI) выключен; y 2-OFF: функция последовательного порта переключена на USB-контроллер (цепь FTDI). 121
РАЗДЕЛ 2. Создание игр 122 Внимание! Во время программирования микропереключатель должен быть в позиции 2-OFF! 12. Датчик освещенности (фоторезистор), измеряющий степень освещенности от 0 до 100. 13. Датчик звука (микрофон), измеряющий степень громкости звука от 0 до 100. До выхода ROBBO Lab существовала и более ранняя ее версия ScratchDuino.Лаборатория, имеющая поддержку на русском языке. Как программировать ROBBO Lab? Электронная плата ROBBO Lab программируется с помощью среды разработки ROBBO Scratch — модифицированной версии Scratch, в которую добавлены команды управления внешними устройствами, производимыми компанией ROBBO, а именно сама ROBBO Lab и ROBBO Robot kit1. Скачать актуальную версию ROBBO Scratch можно свободно на сайте разработчика по ссылке: https:// www.robbo.world/apps/. После выбора нужной операционной системы, скачивания и запуска установочного файла необходимо следовать инструкциям мастера установки. 1 Подробнее с продуктами компании ROBBO можно ознакомиться на официальном сайте разработчика: https://www.robbo.world.
Arkanoid Несмотря на то что сайт доступен на английском языке, программное обеспечение поддерживает также русский. ScratchDuino.Лаборатория программируется с помощью другой версии программного обеспечения под названием ScratchDuino, доступной по ссылке: http:// files.scratchduino.ru/. ROBBO Scratch также в скором времени будет поддерживать программирование этой платформы. Внимание! Все игры в данном разделе создаются в программной среде ROBBO Scratch. Arkanoid История игры Arkanoid Эта знаменитая видеоигра была создана в 1986 году японской компанией Taito. В ней игроку предлагалось взять управление платформой-ракеткой, расположенной в нижней части экрана. Также на игровом поле присутствовали разноцветные блоки и летающий шарик. 123
124 РАЗДЕЛ 2. Создание игр Цель игры: разбить все блоки, не дав шарику упасть. У ракетки есть несколько «жизней», определяющих количество возможных падений мячика до окончательного проигрыша. Также в игре присутствуют различные бонусы (положительные и отрицательные), которые выпадают из блоков. Они могут увеличивать или уменьшать размер ракетки, размножать мячик, добавлять к ракетке лазер для стрельбы по блокам, добавлять и отнимать запасные «жизни» и многое другое. Сами блоки тоже бывают разными — самые простые разрушаются после первого попадания в них мячика, а те, что посложнее, требуют нескольких попаданий. Это интересно! Игру Arkanoid создали на основе уже существующей игры Breakout (1976) японской компании Atari, причем изначально и Breakout, и Arkanoid были игровыми автоматами. Однако именно название «Arkanoid» закрепилось в качестве нарицательного для целого семейства подобных игр. Можно заметить, что такие игры выделяют в отдельный жанр «арканоиды». Структура программы В игре присутствуют три главных взаимодействующих объекта: 1) платформа-ракетка; 2) шарик; 3) блок (и его копии). Объект: платформа-ракетка Подвижный объект, в общем случае представляющий собой прямоугольник, расположенный в нижней части экрана горизонтально. Управляется пользователем, осуществляя движение влево и вправо в пределах границ экрана.
Arkanoid Спрайт: Библиотека спрайтов o категория Предметы o Paddle. Функции y В начале игры располагается посередине экрана в нижней части. y После начала игры управление передается игроку. y Движение платформы влево и вправо обеспечивается нажатием клавиш-стрелок на клавиатуре и происходит в его пределах от –200 до 200 по координате x. y При попадании шарика в платформу он отскакивает от нее под физически правильным углом. y Отскок обеспечивается путем отправки сообщения «bounce», которое принимает специальный скрипт шарика. Объект: шарик Подвижный объект, представляющий собой круг. Управляется программой, летая по игровой области и взаимодействуя с блоками и платформой-ракеткой. Спрайт: Библиотека спрайтов o тема Спорт o Ball. Функции y В начале игры располагается над платформой. y Затем начинает движение в направлении 45, вверх. y При соприкосновении с краем экрана отталкивается под физически правильным углом. y При попадании в платформу или блок получает сообщение «bounce» и отскакивает от них в правильном направлении, пользуясь формулой: 180 – Текущее направление. y При попадании в область ниже платформы-ракетки засчитывается проигрыш. 125
126 РАЗДЕЛ 2. Создание игр Объект: блок Неподвижный объект прямоугольной формы. Управляется программой. Реагирует на соприкосновение с шариком. Спрайт: Библиотека спрайтов o категория Предметы o Button3. Button3 Функции y В начале игры появляется на экране на своем месте, определяемом координатами (x, y). y Создает собственные копии, формируя «стену» из блоков (это нужно для того, чтобы вручную не создавать много объектов и не расставлять их). y При соприкосновении с шариком посылает сообщение «bounce» и исчезает. Arkanoid v1.0 Реализация: платформа-ракетка Расположим ракетку в нижней части области анимации посередине и выявим наилучшее ее расположение, глядя на текущие координаты в правом верхнем углу области скриптов.
Arkanoid Оптимальное начальное положение для этого спрайта: (0; –150). Начнем программу именно с этого. Добавим команду Когда щелкнут по зеленому флажку из группы События. К ней добавим команду Перейти в x:… y:… из группы Движение и пропишем в ней нужные значения. Запуск всей программы будет осуществляться по нажатию зеленого флажка, но старт игре будет давать сам игрок, нажимая клавишу Пробел. Для этого добавим команду Ждать до … из группы Управление. Расположим в ее условном блоке команду Клавиша пробел нажата из группы Сенсоры. Таким образом, скрипт не продолжится, пока игрок не даст старт нажатием клавиши Пробел. Такую команду мы будем добавлять во многих скриптах игры. Далее нужно организовать управление с помощью клавишей-стрелок. Похожий функционал мы организовывали в мини-игре «Охота хищника». Прежде всего нам понадобится бесконечный цикл Всегда. В нем организуем два условия проверки нажатия клавишей Стрелка направо и Стрелка влево. 127
128 РАЗДЕЛ 2. Создание игр При нажатии клавиши Стрелка направо нужно изменить положение по координате x в положительную сторону, например на 10. Для этого добавим внутрь первого условия команду Изменить x на 10 из группы Движение. Аналогичную команду реализуем во втором условии, только x будет меняться в отрицательную сторону на –10. Однако так ракетка будет выходить за пределы экрана. Чтобы этого не происходило, воспользуемся командой Если на краю, оттолкнуться из группы Движение. Добавим ее в каждое из условий.  Время провести промежуточное тестирование!
Arkanoid Остается обеспечить отправку сообщения «bounce» (в переводе с английского — отскок) при соприкосновении с шариком (Ball). Добавим внутри цикла еще одно условие: Если касается Ball, то … . При истинности этого условия ракетка отправляет сообщение. Для этого добавим команду Передать … из группы События и выберем в раскрывающемся списке Новое сообщение. 129
130 РАЗДЕЛ 2. Создание игр Введем в открывшемся окне текст сообщения: bounce и нажмем ОК. Готово! Ракетка работает как надо! Реализация: шарик Так как шарик должен выполнять несколько различных действий одновременно, для него мы напишем три различных скрипта: 1) управление поведением шарика на игровом поле; 2) прием сообщения «bounce» и действия при этом; 3) проверка падения шарика ниже ракетки (проигрыш). Поведение шарика на игровом поле Первый скрипт будет запускаться вместе с остальными, поэтому его начинаем с команды Когда щелкнут по зеленому флажку. Так как шарик в своем первоначальном виде слишком большой, его размеры нужно уменьшить в два раза — для этого воспользуемся командой Установить размер 50% из группы Внешность. Далее нужно поместить шарик над платформой-ракеткой. Она находится в точке с координатами (0, –150), а шарик должен быть чуть выше, поэтому для него подойдут следующие координаты: (0, –130).
Arkanoid Добавим для этого команду Перейти в x: 0 y: –130 из группы Движение. Перед стартом остается задать направление, в котором шарик начнет свое движение. Мы договорились, что изначально он будет двигаться в направлении 45 (вправо вверх). Добавим команду Повернуть в направлении … из группы Движение и зададим с помощью клавиатуры значение 45. Далее нужно дождаться нажатия игроком клавиши Пробел. Об этой команде мы уже говорили ранее. После старта шарик должен начать непрерывно двигаться в выбранном направлении, а также отскакивать от краев экрана. Обработку столкновения с остальными объектами будет осуществлять отдельный скрипт. Так как шарик не останавливается в своем движении, нам понадобится бесконечный цикл Всегда из группы Управление. За движение в выбранном направлении отвечает команда Идти 10 шагов. 131
132 РАЗДЕЛ 2. Создание игр Отскок от «стенок» обеспечит команда Если на краю, оттолкнуться. Время провести промежуточное тестирование! Сообщение «bounce» Теперь реализуем действия при приеме сообщения «bounce». В данном случае нам нужно лишь менять направление движения шарика. Однако задача немного осложняется тем, что шарик может падать на платформу-ракетку с разных сторон. Поэтому сначала разберемся подробнее со значениями направлений в Scratch. Рассмотрим следующий рисунок: Обозначения сторон света используются по первым буквам их английских названий: N (North — север), E (East — восток), S (South — юг), W (West — запад). В общем случае поворот происходит по окружности, в которой точкой отсчета является направление N, равное нулю. Поворот по часовой стрелке соответствует положительному направлению, против часовой — отрицательному.
Arkanoid В связи с этим правая половина окружности задается положительными значениями угла поворота (в градусах), а левая — отрицательными. Теперь рассмотрим варианты «падения» шарика на ракетку. Выведем формулу, согласно которой мы сможем получить физически верный отскок шарика. В первом случае: 180 – 135 = 45. Во втором: 180 – (–135) = 180 + 135 = 315, но такого значения не существует, поэтому необходимо понять, куда все-таки направится шарик. Так как мы добавляем положительное число, это поворот по часовой стрелке. Значит, мы попадаем в левую (отрицательную) половину окружности. Тогда: 180 + 135 = 180 + (90 + 45), то есть мы поворачиваемся на прямой угол по часовой стрелке от положения 180 и затем еще наполовину и попадаем сначала в –90, а затем в –45. Это то, что нам и нужно. В общем случае для того, чтобы шарик отскакивал в правильном направлении, мы должны от 180 отнять значение текущего направления. Таким образом получаем формулу: Направление отскока = 180 – Направление шарика. Реализуем нашу задумку. Шарик должен так себя вести при получении сообщения «bounce», поэтому добавим команду Когда я получу bounce из группы События. Все, что нужно сделать шарику, — это изменить направление движения согласно формуле. Поэтому добавляем команду Повернуть в направлении … из группы Движение. 133
134 РАЗДЕЛ 2. Создание игр Реализуем в параметре команды выведенную формулу. Для этого добавим в качестве него Вычитание из группы Операторы. Запишем в левом окошке с клавиатуры число 180, а в правое поместим специальную переменную Направление из группы Движение (в ней содержится значение текущего направления спрайта). Время провести промежуточное тестирование! Проигрыш Если шарик пролетит мимо ракетки (то есть окажется ниже нее), то это будет ситуация проигрыша. Проверить можно с помощью координаты y — именно она отвечает за положение шарика по высоте. Ракетка расположена по y: –150. Значит, если шарик принимает по y значение, меньшее –150, то мы признаем поражение. Однако при таких проверках допустимы незначительные погрешности. Отсюда условие проигрыша будет выглядеть так: Если положение y < –155. Новый скрипт мы начинаем с команды Когда щелкнут по зеленому флажку и ожидания нажатия клавиши Пробел.
Arkanoid После того как дан старт, мы должны начать постоянную проверку обозначенного условия, а значит, поместим в цикл Всегда условный оператор Если …, то … из группы Управление. Формируем условие: сравнение Меньше из группы Операторы и в его левое окошко Положение y из группы Движение, в правое: –155 с клавиатуры. В случае истинности этого условия мы просто остановим игру. Для этого помещаем внутрь команду Стоп все из группы Управление. Время провести промежуточное тестирование! Реализация: блок Для блока мы тоже напишем три скрипта: 1) управление исходным блоком; 2) создание начального количества клонов и постройка «стены»; 3) управление клонами. 135
136 РАЗДЕЛ 2. Создание игр Первый блок-родитель Так как все блоки — исчезающие с экрана, до старта игры первый должен появиться на нем. Для этого воспользуемся командой Показаться из группы Внешность. Изначально блок, как и шарик, слишком велик по размеру. Уменьшим его вдвое командой Установить размер 50% из группы Внешность, а также определим для него место в левой верхней части экрана, его координаты получатся: (–190; 130). Далее нам необходимо задать количество нужных нам клонов. Каждый клон будет клонировать сам себя и сам же находить свое место. Поэтому нам понадобится переменная, которая остановит этот фактически бесконечный процесс. Это интересно! Если объекты создают сами себя или обращаются сами к себе, то программисты называют это рекурсией. В группе Данные создаем переменную с именем amount (в переводе с английского — количество). Ее отображение на экране нам не нужно, поэтому галочку рядом с ней убираем.
Arkanoid При нынешнем размере и положении нашего блока в ряд их сможет поместиться девять штук. Пусть таких рядов будет четыре. Итого: 36 блоков. Значит, первоначальное значение для amount зададим равным 35, так как один блок-родитель из 36 уже есть. Добавим команду Задать amount значение 35 из группы Данные. После этого блок должен создать своего клона, поведение которого мы запрограммируем чуть позже. Перетаскиваем команду Создать клон себя самого из группы Управление. 137
138 РАЗДЕЛ 2. Создание игр Далее остается запрограммировать поведение блока-родителя в игре. Здесь все просто: при соприкосновении с шариком он должен послать сообщение «bounce» и исчезнуть с экрана. Добавляем бесконечную проверку касания с шариком, она состоит из цикла Всегда, условия Если…, то… и сенсора Касается Ball. При истинности условия блок выполняет команды: Передать bounce и Спрятаться. Время провести промежуточное тестирование! Клонирование Поведение клона заключено в двух этапах — это создание еще нескольких клонов, пока не обнулится переменная amount. При этом каждый клон должен появляться на своем месте — это мы обеспечим проверками положения по координатам: будем сдвигать каждый новый клон по оси x вправо, а когда место закончится, обнулим x и сдвинем клон вниз по оси y и продолжим. Второй этап состоит в основном поведении — при соприкосновении с шариком отсылать сообщение «bounce» и исчезать с экрана.
Arkanoid Для программирования клонов нам понадобится новая команда (и новый скрипт) Когда я начинаю как клон из группы Управление. Прежде всего, клон будет выполнять действия только в том случае, если еще не все клоны созданы, то есть переменная amount не достигла нуля. Для этого создаем проверку: Если amount > 0, то … . Далее нам нужно проверить, достигли ли мы конца строки (предельное положение по оси x). Если да, то будем создавать очередного клона, предварительно сбросив x и сместившись ниже по оси y. Иначе будем просто создавать нового клона со сдвигом по оси x. Для этого добавляем внутрь условия еще одно, но полной формы. Если переместить блок вправо до границы экрана, то можно увидеть, что их после значения x: 160 вставить не удастся и придется переходить на строку ниже, в ее начало. Тогда в условии проверим, достигнут ли конец строки: Если положение x > 160. 139
140 РАЗДЕЛ 2. Создание игр Если это условие оказалось истинно, значит, достигнут конец строки. Тогда мы устанавливаем положение по x: –190, а y изменяем на –30. Так как в данный момент действует вновь созданный клон, мы должны вычесть из переменной amount единицу. Для этого добавляем команду Изменить amount на –1 из группы Данные. После чего создаем очередного клона.
Arkanoid Теперь рассмотрим случай, когда конец строки еще не достигнут. Действия с переменной amount и созданием клона будут теми же, а вот смещаться придется только по оси x на 45. Реализуем внутри Иначе эти три команды. Время провести промежуточное тестирование! Игровые блоки Осталось задать для созданных клонов блоков поведение в игре. Ну а им, собственно, нужно только находиться на своем месте и при соприкосновении с шариком посылать сообщение «bounce» и исчезать. Так что третий скрипт будет таким: Можно заметить, что вместо команды Спрятаться мы использовали Удалить клон из группы Управление. Клонов лучше не просто прятать, а удалять, чтобы они не нагружали программу. Поздравляем! Первая настоящая игра Arkanoid v1.0 готова! Можно смело начинать играть! 141
142 РАЗДЕЛ 2. Создание игр Апгрейд Улучшения, которые мы сделаем с нашей игрой: 1) добавим подсчет набранных очков «Score»; 2) реализуем ситуацию выигрыша при всех сбитых блоках; 3) добавим основной фон, а также фоны для выигрыша «You win!» и проигрыша «Game Over». Подсчет набранных очков Мы должны будем создать специальную переменную Score (в переводе с английского — очки), которую будем увеличивать на единицу каждый раз, когда шарик сбивает блок. Создаем переменную Score в группе Данные. По умолчанию она отображается на экране — так можно и оставить, разве что сдвинуть ее с помощью мыши в верхний левый угол области анимации.
Arkanoid В начале игры счет должен быть обнулен. Сделать это можно в программе для платформы-ракетки. Добавим в начало ее скрипта команду Задать Score значение 0 из группы Данные. Мы должны увеличивать эту переменную на единицу каждый раз, когда исчезает один блок. Поэтому переходим в программу для него. Здесь есть два скрипта, в которых он исчезает: для блока-родителя и для его клонов. Добавляем в каждый из них команду Изменить Score на 1 из группы Данные. Выигрыш Так как в нашей игре создается 36 блоков, выигрыш должен наступать при достижении переменной Score значения 36. 143
144 РАЗДЕЛ 2. Создание игр Такая проверка должна происходить постоянно, поэтому ее будет удобно добавить в программу для платформы-ракетки. Помещаем внутрь бесконечного цикла третье условие Если …, то … из группы Управление. Проверяемое условие: Если Score = 36, то … .
Arkanoid При истинности условия мы пока что просто остановим игру командой Стоп все из группы Управление. Фоны Теперь добавим три различных фона для основного режима игры, выигрыша и проигрыша. Для этого воспользуемся Библиотекой фонов: 1) основной фон: castle3; 2) выигрыш: castle1; 3) проигрыш: castle2. На второй фон можно добавить надпись «YOU WIN!», а на третий — «GAME OVER» с помощью средств рисования на вкладке Фоны объекта Сцена. В начале игры должен отображаться основной фон. Переход между ними осуществляется с помощью команды Сменить фон на … из группы Внешность. Добавим переход к фону castle3 в самом начале скрипта для платформы-ракетки. В конце этого же скрипта есть проверка на выигрыш. Перед командой Стоп все добавляем переход к фону castle1. 145
146 РАЗДЕЛ 2. Создание игр Проверка проигрыша осуществляется в программе для шарика в отдельном скрипте, который мы писали последним. Перед командой Стоп все добавляем переход к фону castle2. Чудесно! Игра Arkanoid v2.0 готова! Теперь можно звать друзей и играть вместе! Геймпад Arkanoid станет более интерактивной игрой, если управление платформой-ракеткой будет осуществляться с помощью рычажка на геймпаде. Запускать игру будем с помощью белой кнопки, расположенной справа. Все команды управления ROBBO Lab содержатся в специальной группе Лаборатория. Изменим программу для платформы-ракетки, а именно те части, которые выделены на рисунке:
Arkanoid Первым делом в команде Ждать до … мы заменим нажатие клавиши Пробел на нажатие кнопки № 5 на геймпаде. 147
148 РАЗДЕЛ 2. Создание игр Внимание! Это нужно сделать во всех скриптах всех спрайтов, где содержится ожидание нажатия клавиши Пробел. Управление теперь будет осуществляться не с помощью клавиш-стрелок, поэтому оба условия с их наполнением нам больше не понадобятся. Чтобы их удалить, нужно перетащить с помощью мыши верхний из них в сторону. При этом он «потянет» за собой все остальное. Далее таким же способом отделяем нужную нам часть, а оба условия-проверки нажатия клавиш-стрелок удаляем — для этого их можно просто перенести в область команд слева. Теперь на месте этих двух блоков нужно создать управление с помощью рычажка. В случае с ним мы не должны ожидать его нажатия. Достаточно лишь установить координату x платформы-ракетки в положение, соответствующее рычажку. Вспомним, что ракетка изменяет свое положение по горизонтали от –200 до 200, в то время как показания рычажка находятся в пределах от 0 до 100 соответственно.
Arkanoid Значит, нам нужно уравнять их значения. Рассмотрим следующий рисунок и экспериментально выведем нужную формулу для преобразования: Нетрудно заметить, что эти положения находятся в зависимости с числом 50. Попробуем проанализировать каждое из них. Рычажок Платформаракетка Преобразование 0 –200 (0 – 50) ˜ 4 –200 25 –100 (25 – 50) ˜ 4 –100 50 0 75 100 (75 – 50) ˜ 4 100 100 200 (100 – 50) ˜ 4 200 (50 – 50) ˜ 4 0 Значит, из значения положения рычажка нужно вычесть 50 и полученную разность умножить на 4, чтобы получить соответствующее значение положения платформы-ракетки. Тогда общая формула получится такой: Положение ракетки по x = (Рычажок – 50) ˜ 4. Воспользуемся командой Установить x в … из группы Движение. В качестве значения реализуем выведенную формулу: 149
150 РАЗДЕЛ 2. Создание игр Созданную команду прикрепляем сверху к оставшимся командам и помещаем обновленный фрагмент скрипта на свое место в бесконечном цикле. Самое время подключить геймпад и начать играть по-новому! Идеи для обновления до Arkanoid v3.0 Идея 1. Добавьте элемент случайности в Arkanoid — сейчас шарик постоянно отскакивает от всех объектов под углом 45 градусов. Сделайте так, чтобы этот угол был случайным. Для сохранения физики полета нужно генерировать случайные величины из небольшого диапазона, близкого к 45. Идея 2. Можно заметить, что при попадании шарика в блок слева или справа он отскакивает неверно.
Arkanoid Рассмотрим одну из таких ситуаций: Отсюда видим, что если применить нашу формулу, то шарик полетит в направлении 45: А должен изменить направление на –135: Решить эту проблему можно, например, создав собственный спрайт для блока с боковыми гранями другого цвета. Тогда при соприкосновении с ними шарик будет по цвету определять направление отскока. Выведите формулу расчета направления при попадании шарика в боковую грань блока и обновите физику полета шарика. Идея 3. Добавьте в игру бонусы, которые периодически выпадают из блоков случайным образом и меняют игровую ситуацию (подробнее о бонусах см. в истории игры), а также разные виды блоков, которые «разбиваются» не сразу. Идея 4. Добавьте возможность продолжения игры в случае проигрыша, то есть реализуйте некоторое количество «жизней» для игрока. 151
152 РАЗДЕЛ 2. Создание игр Идея 5. Добавьте в игру новые уровни, анимацию исчезания блоков, их интересные начальные расположения, а также звуковое сопровождение. «Змейка» Первая игра уже создана, но не будем останавливаться на достигнутом! Пришло время для второй игры, и здесь мы реализуем знаменитую «Змейку»! История игры «Змейка» Всемирно известная игра «Змейка» тоже была изначально выпущена в виде игрового автомата американской компанией Gremlin Industries и называлась Hustle (в переводе с английского — толкотня, суета). Игрок брал под свое управление существо, впоследствии названное змейкой, которое перемещалось по ограниченному стенками экрану и собирало «еду» в виде квадратиков. С каждым съеденным квадратиком змейка увеличивалась в своей длине. На таком игровом автомате можно было играть вдвоем, стараясь набрать как можно больше очков, чем соперник. Цель игры: собирать «еду» (позднее также появились различные бонусы) и стараться не удариться о стенку или собственный хвост. Игрок управляет лишь направлением движения «головы» змейки. Скорость ее передвижения остается постоянной. При съедании очередного квадратика «еды» помимо увеличения длины змейки добавляются очки (в версии игрового автомата Hustle каждый такой квадратик давал разное количество очков).
«Змейка» Игра ограничена только временем, по истечении которого она заканчивается и производятся итоговый подсчет очков и запись в таблицу рекордов. «Жизней» у змейки не предусмотрено, поэтому при столкновении со стенкой или собственным хвостом засчитывается проигрыш. Впоследствии вышло очень много разных версий этой игры: изменялись внешний вид самой змейки, размеры игрового поля, добавлялись нестандартные бонусы, например увеличивающие или уменьшающие скорость движения змейки, менялись платформы — змейка была реализована на множестве различных компьютеров, а в 2005 году финская компания — производитель мобильных телефонов выпустила «Змейку 3D» для модели Nokia N70. 153
РАЗДЕЛ 2. Создание игр 154 1 Это интересно! «Змейка» и по сей день остается популярной! В 2016 году американский разработчик Стив Хаус (Steve Hawse) выпустил игру Slither.io1, которая набрала огромную популярность благодаря «вирусному» распространению. На момент выхода игры у Стива не осталось денег на маркетинг, поэтому он решил поступить иначе: новые костюмы для змейки можно было получить, поделившись постом об этой игре в социальной сети. Просмотр одной такой рекламки приносил всего один цент, но быстро набирающаяся популярность (460 миллионов просмотров в день) так же быстро принесла результат. Меньше чем через полгода, по разным оценкам, Стив стал зарабатывать на ней порядка 100 тысяч долларов в день! Структура программы В игре три главных взаимодействующих объекта: 1) хвост змейки (один элемент); 2) голова змейки; 3) еда. Объект: хвост змейки Подвижный объект, представляющий собой прямоугольник. Управляется программой, перемещаясь за головой змейки и увеличивая количество собственных копий при каждом поедании «еды». Спрайт: изображается вручную с помощью редактора костюмов (подробнее см.: «Реализация: хвост змейки»). 1 http://slither.io — официальный сайт игры, на котором можно в режиме онлайн поиграть в эту игру с другими пользователями прямо из интернет-браузера.
«Змейка» Функции y В начале игры не отображается на экране. y После начала создает собственные копии, которые задерживаются на экране на определенное количество секунд (чем больше змейка съест «еды», тем дольше клон хвоста будет оставаться на экране, создавая иллюзию растущей змейки). Это время определяет переменная tail_clone. y Удаляет свой клон по истечении времени его нахождения на экране. Объект: голова змейки Подвижный объект, представляющий собой квадрат с «глазами» для понимания его направления. Управляется пользователем, осуществляя движение по экрану вправо, вверх, влево и вниз в пределах его границ. Спрайт: копия хвоста с дорисованными «глазками». Функции y В начале игры располагается в центре экрана (x: 0, y: 0). y После начала управление передается игроку. y Перемещение головы задается программно. y Направление движения головы задается пользователем с помощью нажатия клавиш-стрелок на клавиатуре. y При касании ею края экрана или хвоста засчитывается проигрыш, и игра заканчивается. Объект: еда Подвижный объект прямоугольной формы. Управляется программой. При соприкосновении с головой змей- 155
156 РАЗДЕЛ 2. Создание игр ки увеличивает ее размеры и случайным образом меняет свое положение. Спрайт: копия хвоста с измененным цветом. Функции y В начале игры появляется на экране в случайном месте, определяемом координатами (x, y). y При соприкосновении с головой змейки увеличивает время отображения клонов хвоста на экране, а затем случайным образом меняет свое положение на экране. Змейка v1.0 Реализация: хвост змейки Прежде всего мы должны нарисовать спрайт для хвоста. Сделать это довольно просто, но есть и некоторые нюансы, которые мы рассмотрим. Для начала рисования нового спрайта в области управления объектами выбираем команду Нарисовать новый спрайт (значок кисти). Откроется вкладка Костюмы, в которой нам доступен графический редактор со вполне стандартными инструментами: кисть, линия, прямоугольник и другие. Заметим, что изначально редактор открывается в растровом режиме, то есть рисование в нем доступно с помощью изменения цвета пикселей на экране. Для наших целей лучше использовать векторный режим — здесь любое изображение является набором не просто пикселей на экране, а некоторых точек с заданными
«Змейка» координатами, соединенных линиями. Это значит, что если мы будем масштабировать изображение (растягивать или уменьшать), то оно не будет терять свое качество, так как мы всего лишь меняем положение опорных точек, а компьютер перерисовывает линии заново. В правом нижнем углу переключимся в Векторный режим (кнопка Конвертировать в векторную графику). На панели инструментов (справа) выберем Прямоугольник. 157
158 РАЗДЕЛ 2. Создание игр Так как нам нужен закрашенный прямоугольник, выберем внизу слева режим Закрашенный. Мы будем стараться приближаться к оригинальной игре, поэтому цвет нашей змейки выберем зеленым в палитре снизу по центру. Все элементы нашей змейки — квадраты (правильные прямоугольники). Для изображения ровного квадрата мы должны зажать клавишу Shift и растягивать его на холсте, удерживая левую кнопку мыши. Квадрат не должен получиться слишком большим. Для удобства можно воспользоваться средствами масштабирования холста в правом нижнем углу. Обратим внимание на подпись к созданному костюму.
«Змейка» Она указывает на его размер в пикселях. Пока что 31 u 31 то, что нам нужно. Если не получилось сразу, то размеры квадрата можно изменить, потянув за круглые точки вокруг него или воспользовавшись инструментом Уменьшить. Также центр костюма должен находиться в центре квадрата, если это не так, нужно изменить положение центра (мы это делали с карандашом при рисовании по координатам). Теперь в области управления объектами дадим новое имя спрайту, назовем его Tail (в переводе с английского — хвост). Теперь мы готовы написать программу! Для хвоста мы напишем два скрипта: 1) инициализация при запуске игры и создание собственных клонов; 2) управление поведением клонов с помощью переменной tail_clone. Основное поведение Первый скрипт будет запускаться по щелчку на зеленый флажок. Поэтому для начала добавляем соответствующую команду: Изначально пользователь видит только голову змейки без хвоста (он еще не вырос), поэтому следующим шагом после запуска программы мы должны удалить 159
160 РАЗДЕЛ 2. Создание игр его с экрана с помощью команды Спрятаться из группы Внешность. Все остальные действия должны начать выполняться только после того, как пользователь даст старт игре. Подобную структуру мы уже реализовывали (и будем использовать еще не раз). После старта хвост начинает создавать собственные клоны один раз в полсекунды (и именно такой будет скорость движения змейки по экрану — один «шаг» за полсекунды). Этот процесс происходит постоянно на протяжении всей игры, так что добавляем бесконечный цикл Всегда. В нем мы будем создавать клон с задержкой в 0.5 секунды. Добавим в него команду Создать клон себя самого из группы Контроль.
«Змейка» Второй командой внутри цикла будет Ждать 0.5 секунд из группы Контроль. Клоны наступают на… пятки? Теперь мы запрограммируем поведение клонов: они должны появляться в том же месте, где и голова змейки, и задерживаться там на определенное время, после чего удаляться. Время задержки определяет длину змейки — чем она длиннее, тем дольше задержка. Значит, оно будет изменяться, и нам понадобится хранить его в переменной. С ее создания в группе Данные и начнем. Ее имя будет отражать ее суть: tail_clone (в переводе с английского — клон хвоста). Она будет глобальной, так как ее значение будет изменяться из спрайта еды. Эту переменную отображать на экране не нужно, поэтому галочку рядом с ней снимаем. Начнем создавать второй скрипт, который будет управлять поведением клона. Соответственно первой командой станет Когда я начинаю как клон из группы Управление. 161
162 РАЗДЕЛ 2. Создание игр Данный скрипт будет пошагово выполняться для каждого созданного клона. В самом начале мы должны определить место его появления — оно соответствует положению головы змеи. Но такой спрайт еще не создан, поэтому сделаем под него заготовку, которую доработаем позднее. В области управления объектами кликнем правой кнопкой мыши по спрайту Tail и в контекстном меню выберем пункт Дублировать. Зайдем в свойства info нового спрайта и дадим ему имя SnakeHead (в переводе с английского — голова змеи). С этим спрайтом мы продолжим работать чуть позже, а пока возвращаемся к Tail. Добавляем команду Перейти в SnakeHead из группы Движение.
«Змейка» Как минимум, клон должен существовать столько же секунд, сколько и голова змейки. Значит, добавляем команду Ждать 0.5 секунд из группы Управление. После этого клон должен появиться на экране. Добавляем команду Показаться из группы Внешность. Когда клон появился на экране, он должен задержаться на нем на определенное количество секунд. Изначально это количество равно нулю, но с поеданием каждого нового квадратика еды клон должен все дольше и дольше находиться на экране. Как мы уже сказали, это время определяет значение переменной tail_clone, поэтому добавляем еще одну команду Ждать … секунд. В качестве параметра помещаем переменную tail_ clone. После того как клон «отжил» свое время на экране, его нужно удалить. Завершающей командой в этом скрипте станет Удалить клон из группы Управление. 163
164 РАЗДЕЛ 2. Создание игр Осталась одна маленькая недоработка — при перезапуске игры значение переменной tail_clone не обнуляется. Исправим это, добавив в начало первого скрипта для Tail команду Задать tail_clone значение 0 из группы Данные. На этом мы закончили создание хвоста и, кстати говоря, фактически основного «скрытого» функционала игры. Реализация: голова змейки Для головы змейки мы тоже напишем два скрипта: 1) обеспечение возможности интерактивного управления с помощью клавиатуры; 2) движение по экрану и проигрыш при столкновении с его краем или собственным хвостом. Доработаем спрайт SnakeHead Сейчас голова змейки — это абсолютная копия хвоста, включая скрипты. Сначала удалим их все. Затем перейдем на вкладку Костюмы и дорисуем змейке глаза, чтобы понимать, в какую сторону она сейчас «ползет». В этом нам поможет инструмент Эллипс (справа). Глаза должны получиться идеально круглыми, поэтому при рисовании зажимаем клавишу
«Змейка» Shift. Так как по умолчанию все костюмы направлены вправо, глаза изображаем с правой стороны. Чтобы не угадывать с размерами, мы можем просто сделать копию этой окружности, воспользовавшись инструментом Дублировать. Управление змейкой Управление с помощью клавиш-стрелок мы уже реализовывали, поэтому такой скрипт мы составим без труда. Различие лишь в том, что двигаться змейка будет сама — клавишами-стрелками, мы только меняем направление ее «взгляда». 165
166 РАЗДЕЛ 2. Создание игр Не хватает лишь команды Показаться из группы Внешность и ожидания старта по нажатию клавиши Пробел. Добавим их в начало до цикла. Время провести промежуточное тестирование! Запрограммированный ползать летать не сможет Второй скрипт гораздо интереснее. Первым делом мы зададим начальное положение и автоматическое перемещение головы змейки по игровому полю. После нажатия зеленого флажка нужно определить стартовое положение змейки. Пусть это будет центр экрана — за это отвечает команда Перейти в x: 0, y: 0 из группы Движение. Затем ожидаем нажатие клавиши Пробел.
«Змейка» Теперь змейка должна начать постоянно двигаться в направлении своего «взгляда» и остановиться при касании края экрана или своего хвоста. А раз так, добавляем бесконечный цикл Всегда. Остальная часть скрипта будет находиться внутри него. Добавляем команду Идти … шагов из группы Движение. В качестве параметра укажем значение 30 пикселей — это оптимально для размеров нашего игрового поля. Теперь реализуем проверку игровой ситуации на проигрыш — он наступает при касании головой края экрана или хвоста. Такие условия мы проверяем с помощью команды Если …, то … из группы Управление. Для проверки выполнения хотя бы одного из двух условий мы применяем логическую операцию ИЛИ — она дает истину в случае истинности хотя бы одного 167
168 РАЗДЕЛ 2. Создание игр проверяемого условия. Добавляем ее из группы Операторы. Проверки касания края экрана и хвоста Tail добавляем из группы Сенсоры. В случае истинности такого условия мы должны оповестить игрока о проигрыше и остановить игру. Для этого внутрь условия добавляем команду Говорить GAME OVER в течение 2 секунд из группы Внешность. После вывода надписи на экран командой Стоп все из группы Управление мы останавливаем всю игру. Остается задать скорость движения змейки по экрану. А ее скорость напрямую зависит от того, на сколько мы выставим задержку исполнения этого скрипта. Ранее для хвоста мы выставляли задержку, равную 0.5 секунд. Здесь будет то же самое. Добавляем команду Ждать 0.5 секунд из группы Управление сразу после условия — она станет последней в цикле.
«Змейка» Время провести промежуточное тестирование! Реализация: еда Для еды будет всего лишь один скрипт: появление в случайном месте, ожидание касания головы змейки, увеличение длины хвоста змейки. Добавляем спрайт Food Этот спрайт мы создадим также на основе Tail. Поэтому снова дублируем его, удаляем все скрипты и в свойствах info меняем имя на Food (в переводе с английского — еда). Чтобы еда отличалась от остальных спрайтов, мы ее перекрасим, например, в красный цвет. Для этого зай- 169
170 РАЗДЕЛ 2. Создание игр дем на вкладку Костюмы и воспользуемся инструментом Окрасить форму (справа). В палитре (внизу в центре) выберем красный цвет. Кликнем по квадрату на холсте. Готово! Доползем — поедим Скрипт мы начинаем уже знакомым образом. После старта квадратик-еда должен появиться на экране. Добавляем команду Показаться из группы Внешность.
«Змейка» Затем основное поведение спрайта Food будет происходить в бесконечном цикле Всегда. И теперь самое интересное. Вспомним, что голова змейки перемещается с каждым своим «шагом» на 30 пикселей. В то же время экран ограничен по оси x от –240 до 240, а по оси y от –180 до 180. Новое положение для квадратика-еды должно задаваться случайно. Но мы сделаем эту случайность управляемой. Дело в том, что игра будет совсем некрасиво выглядеть, если голова змейки не будет совпадать с едой при ее поедании. Они должны выстраиваться на одной линии. Тогда по обеим осям x и y еда должна занимать положения, кратные 30 (так она сама будет занимать только те положения, которые способна занимать змейка). Задать такие положения можно следующими формулами: x = (случайное от –7 до 7) * 30, что соответствует положениям: –210, –180, –150, ..., 180, 210; y = (случайное от –5 до 5) * 30, что соответствует положениям: –150, –120, –90, ..., 120, 150. 171
172 РАЗДЕЛ 2. Создание игр Мы специально не берем крайние положения по x (–240, 240) и y (–180, 180), чтобы не создавать безвыходной ситуации для проигрыша. Приступим. Добавляем внутрь цикла команду Перейти в x: …, y: … из группы Движение. Для реализации формул нам сразу понадобятся команды умножения …*… из группы Операторы. В качестве параметров слева добавляем команды генерации случайных чисел из группы Операторы и вписываем нужные значения, а параметры справа — это число 30. После того как еда появилась на экране, все, чем она должна заниматься, — это терпеливо ждать, пока голова змейки ее коснется и тем самым съест. Поэтому далее добавляем конструкцию команд Ждать до касается SnakeHead из групп Управление и Сенсоры. Как только квадратик Food будет съеден, мы должны удлинить змейку. Как уже не раз было сказано,
«Змейка» это удлинение достигается за счет увеличения времени нахождения клонов хвоста на экране. За это отвечает переменная tail_clone. Значит, нам достаточно лишь увеличить ее на 0.5 секунд (таков и «шаг» змейки). Добавим команду Изменить tail_clone на 0.5 из группы Данные. Ура! Змейка v1.0 готова! Теперь можно соревноваться с друзьями: чья змейка окажется длиннее? Апгрейд Улучшения, которые мы сделаем с нашей игрой: 1) добавим подсчет набранных очков Score; 2) исправим ошибку возникновения квадратика-еды внутри хвоста змейки; 3) добавим бонус: с вероятностью в 10% вместо еды будет появляться квадратик, который не только ускорит змейку на некоторое время, но и удлинит ее хвост. Подсчет набранных очков Мы должны создать специальную переменную Score, которую будем увеличивать на единицу каждый раз, когда змейка съедает квадратик Food. Создаем переменную Score в группе Данные. По умолчанию она отображается на экране — ее можно сдвинуть в любое удобное место области анимации. 173
174 РАЗДЕЛ 2. Создание игр В начале игры счет должен быть обнулен. Сделать это можно в программе для головы змейки SnakeHead. Добавим в начало любого ее скрипта команду Задать Score значение 0 из группы Данные. Увеличивать эту переменную на единицу мы должны каждый раз, когда съедается квадратик-еда. Поэтому переходим в программу для Food.
«Змейка» Квадратик считается съеденным, если коснулся головы змейки. Значит, в тот же момент мы и будем увеличивать Score на единицу. Добавим команду Изменить Score на 1 из группы Данные сразу после команды ожидания. Время провести промежуточное тестирование! Debugging1 Можно заметить, что периодически в игре возникает ситуация появления еды внутри хвоста змейки. Решить эту проблему довольно просто: достаточно сделать проверку соприкосновения еды Food с хвостом Tail перед тем, как еда начнет ожидать, когда змейка ее съест. Буквально нужно проверить следующее условие: Если не касается Tail, то … 1 Debugging — процесс исправления ошибок. Программисты называют их «багами» (от англ. bug — жук), отсюда и название «debugging». 175
176 РАЗДЕЛ 2. Создание игр В спрайте Food организуем такую проверку из команд Если …, то … группы Управление; Не … группы Операторы; Касается Tail группы Сенсоры и навесим на часть скрипта. Если это условие не будет истинным, то все команды внутри него не будут выполнены, а значит, цикл пойдет на новый круг и квадратик-еда просто изменит свое положение — мы этого даже не заметим. Время провести промежуточное тестирование! Бонус Теперь добавим новый функционал для спрайта Food. Периодически (в десяти случаях из ста) он будет менять свой цвет и при его съедании давать временный бонус скорости, но усложнять игру увеличением длины хвоста. Для этого нам нужно существенно переработать скрипт для Food и немного изменить скрипты у SnakeHead. Изменять скрипт у Food начнем с того, что реализуем его переход в еду-бонус случайным образом в 10% случаев. Сделать это можно с помощью случайных чисел. Если сгенерировать число в отрезке от 1 до 100 и проверить, является ли оно меньшим 11 (то есть попадает ли оно в диапазон от 1 до 10), то создать на экране бонус; если нет, то работать в обычном режиме.
«Змейка» Отложим в сторону все наполнение бесконечного цикла в скрипте для Food и поместим туда условный оператор полной формы Если …, то …, иначе … из группы Управление. Условие для проверки будет следующим: Если случайное число от 1 до 100 < 11, то … . В случае истинности условия мы должны «превратить» еду в бонус. Обозначим это с помощью цвета. Для этого добавим команду Установить эффект цвет в значение 100 из группы Внешность (в нашем случае красный квадратик перекрасится в лазурно-голубой). 177
178 РАЗДЕЛ 2. Создание игр Далее вернем отложенный в сторону фрагмент скрипта, отвечающий за ожидание «съедания». Чтобы бонус сработал, мы должны сообщить змейке, что она должна увеличить скорость. Добавим последнюю в этой части команду Передать BonusSpeed (это сообщение нужно создать) из группы События.
«Змейка» Как мы помним, скорость ее перемещения — это задержка на 0.5 секунд. Для того чтобы изменить на время это значение, мы должны создать переменную Speed. Сделаем это в группе Данные. Теперь перейдем к спрайту SnakeHead. Для начала в скрипте, отвечающем за автоматическое движение змейки, мы должны задать начальное значение переменной Speed, равное 0.5, а вместо введенного с клавиатуры параметра в команде Ждать 0.5 секунд поместить эту переменную. 179
180 РАЗДЕЛ 2. Создание игр Теперь нужно создать новый скрипт, обрабатывающий сообщение BonusSpeed. Добавим команду Когда я получу BonusSpeed из группы События. Все, что нужно сделать, — это уменьшить значение переменной Speed на некоторое время (например, на 7 секунд), после чего вернуть его обратно. Таким образом, мы получим следующий скрипт, который увеличивает скорость движения змейки в 2 раза на 7 секунд. Но это еще не все. С задержкой движения головы змейки также связан и ее хвост Tail. В обоих его скриптах в командах Ждать 0.5 секунд мы должны на место параметра поместить переменную Speed. Готово! Теперь бонус будет работать корректно. Остался последний шаг! Вернемся к спрайту Food. Мы не обработали стандартный случай — когда ква-
«Змейка» дратик-еда не является бонусом. Для этого в ветке Иначе … мы должны прописать точно такой же фрагмент скрипта, как и до него, но только вернуть начальное значение эффекта Цвет (нулевое) и не посылать сообщение о бонусе. Время провести промежуточное тестирование! Восхитительно! Мы обновили игру до «Змейка v2.0»! Теперь можно начинать бить рекорды по длине змейки! Геймпад «Змейка» станет еще интереснее, если управлять ею можно будет с помощью кнопок на геймпаде. Запускать игру будем с помощью белой кнопки, расположенной справа. Изменим программу для головы змейки SnakeHead, а именно те части управляющего скрипта, которые выделены на рисунке: 181
182 РАЗДЕЛ 2. Создание игр Первым делом в команде Ждать до … мы заменим нажатие клавиши Пробел на нажатие кнопки № 5 на геймпаде. Внимание! Это нужно сделать во всех скриптах всех спрайтов, где содержится ожидание нажатия клавиши Пробел.
«Змейка» Управление теперь будет осуществляться не с помощью клавиш-стрелок, поэтому оба условия с их наполнением нам больше не понадобятся. На месте этих четырех блоков нужно создать управление с помощью кнопок № 1–4 на геймпаде. Теперь пора подключить геймпад и ощутить себя настоящим ретроигроком в «Змейку»! Идеи для обновления до «Змейка v3.0» Идея 1. Измените игровой фон, например его можно сделать черным, чтобы игра была похожа на оригинальную Hustle. Идея 2. Добавьте ситуацию выигрыша, чтобы игра не длилась бесконечно. Можно сделать несколько уровней. Например, если змейка достигла длины в 10 квадратиков, то она переходит на второй уровень, где все начи- 183
184 РАЗДЕЛ 2. Создание игр нается заново, но змейка движется быстрее. От уровня к уровню становится все сложнее уследить за ней. Идея 3. Добавьте в игровой процесс новые интересные бонусы, например SuperFood, который прибавляет змейке сразу три новых квадратика. Идея 4. Добавьте звуковое сопровождение — так игра станет намного интереснее. Идея 5. Реализуйте «бесконечное» игровое поле, чтобы игра не заканчивалась при столкновении змейки со стеной, а наоборот, змейка будет просто появляться с противоположной стороны. Для этого нужно будет поработать с координатами и местоположением головы змейки в определенные моменты. Pong Мы уже создали целых две игры! Так недалеко и до звания настоящего разработчика! Но настоящие программисты «кодят» непрерывно, поэтому мы продолжаем! Знакомьтесь, Pong! Ping Pong! История игры Pong Этой игре было суждено стать первой в мире коммерчески успешной. Вряд ли программист Аллан Алкорн наперед предугадывал такую бешеную популярность своему детищу, ведь создавал он эту игру исключительно для тренировки своих программистских навыков. Молодому 24-летнему программисту было дано задание от основателя известной игровой корпорации Atari Нолана Бушнелла, который был вдохновлен приставкой Magnavox Odyssey, сделать похожую игру, но только разнообразить
Pong ее геймплей и добавить звуковые эффекты (а тогда это было очень трудно), так как от графики новых откровений ожидать еще не приходилось. В 1972 году вышел игровой автомат Pong, названный так из-за звука, который имитировал удар мячика о ракетку. Цель игры: «Чтобы набрать очки, старайтесь не упускать мячик» — вот главное и единственное правило этой игры, сформулированное самими создателями. Игрок управляет прямоугольной «ракеткой» (совсем как в Arkanoid), которая передвигается по вертикали в одной из сторон экрана. По черному полю из стороны в сторону летает мячик. Задача игрока — не пропустить мячик в свои «ворота», как в настольном теннисе. Автомат поддерживал как одиночную, так и парную игру с реальным соперником. Время матча, однако, было ограниченно, чтобы игроки не играли бесконечно. Новшеством, которое привнес Алкорн, было, в числе прочих, определение частей ракетки, от которых отскакивает мячик, так что его траектория полета постоянно менялась; частые попадания мячика в обе ракетки приводили к увеличению скорости его движения. Во время игры ведется подсчет очков, которые и определяют победителя. 185
186 РАЗДЕЛ 2. Создание игр Кстати! Сороковым по счету сотрудником компании Atari стал 19-летний Стив Джобс (тот самый, что подарил миру iPhone и iPad), нанятый Алланом Алкорном на должность техника в феврале 1974 года. Это интересно! В сентябре 1972 года был готов первый вариант игрового автомата Pong. Чтобы его протестировать, Бушнелл договорился с кафе по соседству об установке такого автомата. Уже на следующий день хозяин позвонил в Atari и сообщил о неисправности игрового автомата. Прибывший на место Алкорн обнаружил, что короткое замыкание в автомате вызвал наполненный сверх всякой меры монетоприемник. Структура программы В игре пять взаимодействующих объектов: 1) ракетка игрока; 2) ракетка компьютера; 3) мячик; 4) ворота игрока; 5) ворота компьютера.
Pong Объект: ракетка игрока Подвижный объект, представляющий собой белый прямоугольник. Управляется пользователем с помощью клавиш-стрелок, перемещаясь вверх и вниз по левой части экрана в пределах его границ. Спрайт: изображается вручную с помощью редактора костюмов (подробнее см.: «Реализация: ракетка игрока»). Функции y В начале игры располагается в левой части экрана. y После начала управление передается игроку. y Движение ракетки осуществляется при нажатии клавиш-стрелок вверх и вниз. y При попадании в ракетку мячик отскакивает от нее в сторону противника, причем конкретное направление будет задаваться случайно для увеличения сложности и повышения динамики игрового процесса. Объект: ракетка компьютера Подвижный объект, представляющий собой белый прямоугольник. Управляется программно, осуществляя движение по правой части экрана вверх и вниз, в пределах его границ. Спрайт: копия ракетки игрока. Функции y В начале игры располагается в правой части экрана. y После начала управление осуществляет программа. y Вычисляет текущее положение мячика, исходя из чего выбирает направление своего движения, стараясь предугадать траекторию полета мяча. y При попадании в ракетку мяч отскакивает от нее в сторону игрока, конкретное направление выбирается так же, как и для ракетки игрока. 187
188 РАЗДЕЛ 2. Создание игр Объект: мячик Подвижный объект круглой формы белого цвета. В начале игры располагается посередине экрана. Управляется программой. При соприкосновении с ракетками отскакивает от них в противоположную сторону. При соприкосновении с воротами игрока засчитывает очко компьютеру и наоборот, после чего возвращается в центр экрана и начинается следующий раунд. Спрайт: изображается вручную с помощью редактора костюмов (подробнее см.: «Реализация: мячик»). Функции y В начале игры появляется в середине экрана (x: 0, y: 0). y После начала через три секунды начинает движение в случайно выбранном направлении. y При соприкосновении с ракетками отскакивает в противоположную сторону. y При соприкосновении с воротами игрока засчитывает очко компьютеру и переходит в середину экрана. y Аналогично засчитывает очко игроку при соприкосновении с воротами компьютера и переходит в середину экрана. y При касании края экрана отскакивает от него в физически верном направлении. Объект: ворота игрока Неподвижный объект, представляющий собой прямую линию. Служит для фиксации пропуска мяча игроком. Спрайт: изображается вручную с помощью редактора костюмов (подробнее см.: «Реализация: ворота игрока»).
Pong Функция y В начале игры появляется в левой части экрана, за ракеткой игрока. Объект: ворота компьютера Неподвижный объект, представляющий собой прямую линию. Служит для фиксации пропуска мяча компьютером. Спрайт: копия ворот игрока. Функция y В начале игры появляется в правой части экрана, за ракеткой компьютера. Pong v1.0 Реализация: игровое поле «Театр начинается с вешалки», — сказал когда-то великий российский режиссер Константин Сергеевич Станиславский. А наша игра начнется с игрового поля, то есть с оригинального фона. В этот раз мы будем стараться приблизиться к классическому первозданному виду игры. И так как все игровые объекты у нас белого цвета, начнем мы именно с изменения фона. В области управления объектами слева под Сценой выберем команду Нарисовать новый фон. 189
190 РАЗДЕЛ 2. Создание игр Откроется графический редактор. Выберем инструмент Заполнить цветом. В палитре выберем черный цвет.
Pong Кликнем по белому полю фона — он окрасится в черный. Для разделения игрового пространства на две части нарисуем посередине белую линию с помощью инструмента Прямоугольник. В итоге получится вот такой оригинальный фон. 191
192 РАЗДЕЛ 2. Создание игр Первый белый фон можно удалить, нажав на крестик возле него в области управления объектами. Реализация: ракетка игрока Нарисуем спрайт ракетки. Для этого в области управления объектами выбираем команду Нарисовать новый спрайт. Откроется вкладка Костюмы, в которой нам доступен графический редактор. Сразу перейдем в векторный режим: в правом нижнем углу нажмем на кнопку Конвертировать в векторную графику. В панели инструментов (справа) выберем Прямоугольник. Так как нам нужен закрашенный прямоугольник, выберем внизу слева режим Закрашенный. Выберем цвет нашей ракетки в палитре снизу по центру белым.
Pong Нам нужно изобразить вытянутый в длину прямоугольник. Для ориентации в его размере воспользуемся кнопками масштабирования в правом нижнем углу редактора и приблизимся к холсту до 800%. При изображении прямоугольника будем ориентироваться на фоновые квадратики. Его оптимальные размеры: 12 квадратиков в длину и 2 в ширину. Внимание! Нужно не забыть определить центр костюма (команда в правом верхнем углу). Начальные настройки Перейдем на вкладку Скрипты и настроим созданный нами спрайт. Создадим его копию — она впоследствии станет ракеткой компьютера. Для этого в области управления объектами кликнем правой кнопкой мыши по нашему спрайту и в контекстном меню выберем пункт Дублировать. Зайдем в свойства info первой ракетки, дадим ей имя Player (в переводе с английского — игрок) и запретим любые повороты (стиль вращения «точка»). 193
194 РАЗДЕЛ 2. Создание игр Точно так же поступим и со второй ракеткой, но ее имя будет Comp (сокращенно от англ. Computer — компьютер). Теперь мы готовы написать программу для ракетки игрока! Это будет всего лишь один скрипт, определяющий ее местоположение и обеспечивающий управление с помощью клавиш-стрелок. Управление ракеткой игрока (Player) Для начала определим положение для ракетки. Она должна находиться в левой части экрана, но не у самого края. Мы помним, что по оси x левая граница равна –240, значит, пусть начальное положение ракетки будет x: –200, y: 0. Далее создадим уже привычную для нас конструкцию управления с помощью клавиш-стрелок. Только
Pong теперь мы используем две клавиши: вверх и вниз, а перемещение осуществляется по координате y. При этом не забываем о том, чтобы ракетка не могла «убежать» за границы экрана. Время провести промежуточное тестирование! Программа для управления ракеткой игрока готова! Реализация: ракетка компьютера Теперь мы запрограммируем поведение ракетки компьютера. На самом деле ее программа почти не отличается от управления ракеткой игрока, за исключением 195
196 РАЗДЕЛ 2. Создание игр лишь того, что ее начальное положение с противоположной стороны (x: 200, y: 0), а само движение происходит не по нажатию клавиш, а несколько иначе. Может ли ракетка Comp обладать интеллектом? Для начала соберем похожий скрипт, но пока не будем указывать условия для передвижения ракетки. Разберемся с тем, как ракетка компьютера должна определять положение мяча. Дело в том, что мы, как игроки, определяем положение мячика визуально (видим глазами). У компьютера глаз, увы, нет, поэтому он должен опираться на какие-то сугубо математические параметры. Как же ракетка Comp должна «понять», двигаться ей вниз или вверх? Рассмотрим следующие рисунки, изображающие возможные ситуации взаимного расположения ракетки и мячика. Как мы видим, все довольно просто. Нас будет интересовать лишь положение мячика по координате y и положение ракетки по той же самой координате. В первом случае: если положение мячика больше (выше ракетки), то ракетка должна двигаться в положительном направлении по оси y (вверх).
Pong Во втором случае: если положение мячика меньше (ниже ракетки), то ракетка должна двигаться в отрицательном направлении по оси y (вниз). Единственной загвоздкой остается то, как ракетка будет «узнавать» положение мячика по координате y. Но и это оказывается проще простого, ведь у нас есть переменные! Мы создадим специальную переменную, в которую мячик будет постоянно передавать свое положение, а ракетке останется лишь ориентироваться на ее значение. Поэтому первым делом создадим переменную BallPosition (в переводе с английского — положение мяча) в группе Данные. Конкретного значения для нее мы пока задать не можем, так как у нас еще нет мяча. Поэтому будем ее использовать, а тестирование проведем позже. 197
198 РАЗДЕЛ 2. Создание игр Первый оператор условия отвечает за проверку положений для движения вверх. В нем мы буквально проверим следующее условие: Если положение ракетки по y < BallPosition, то ... Во втором операторе условия нужно проверить обратное условие: Если положение ракетки по y > BallPosition, то ... Умная ракетка компьютера готова! Реализация: ворота игрока По сути, ворота — это просто линия, при касании которой мяч будет засчитывать очко и вновь появляться
Pong на середине игрового поля. Поэтому ее нужно лишь нарисовать и разместить позади ракетки Player. В области управления объектами выбираем команду Нарисовать новый спрайт. Выбираем инструмент Линия. Ворота не обязательно должны быть видны, поэтому рисовать их мы будем черными. Изображаем вертикальную линию, удерживая клавишу Shift, чтобы она была ровной. На ее размеры обращать внимание пока не стоит, она должна быть просто длинной. Перейдем к вкладке Скрипты. В области управления объектами сразу продублируем этот спрайт. Зайдем в свойства info первой линии, назовем ее PGate (сокращенно от английского Player Gate — ворота игрока) и запретим любой поворот. 199
200 РАЗДЕЛ 2. Создание игр То же самое сделаем и для второй линии, назовем ее CGate (сокращенно от английского Computer Gate — ворота компьютера). Установка ворот игрока Ворота должны располагаться позади ракетки игрока. Сама она располагается по x: –200, значит, для ворот будет вполне достаточно положения x: –230, y: 0. К тому же, как мы сказали, линия ворот должна быть довольно длинной. Чтобы не подбирать размеры в графическом редакторе, мы воспользуемся командой Установить размер … % из группы Внешность и в качестве параметра укажем достаточно большое значение, например 500. Тогда этот спрайт будет занимать всю длину игрового поля и мы точно сможем засчитать гол.
Pong Реализация: ворота компьютера Для спрайта CGate справедливы те же рассуждения, что и для PGate. Поэтому просто напишем для ворот компьютера точно такой же скрипт с тем лишь различием, что положение для них будет противоположным: x: 230, y: 0. Кстати! Правильность постановки ворот можно проверить. В области управления объектами нужно поочередно кликнуть на CGate и PGate. При этом они на время подсветятся в области анимации. Если они приняли нужное положение и своей длиной заняли все пространство позади ракетки, значит, все правильно (они также могут выходить и за пределы области анимации — ошибкой это не является). Если нет, то нужно увеличить их размеры в скрипте. Реализация: мяч Скрипт для мяча будет самым объемным и, в некоторой мере, сложным, так как он, по сути, является основным действующим объектом. Но сначала его надо нарисовать. В области управления объектами выбираем команду Нарисовать новый спрайт. Перейдем в векторный режим: в правом нижнем углу нажмем на кнопку Конвертировать в векторную графику. 201
202 РАЗДЕЛ 2. Создание игр В панели инструментов (справа) выберем Эллипс. Так как нам нужен закрашенный круг, выберем внизу слева режим Закрашенный. Выберем в палитре снизу белый цвет. Чтобы мячик получился ровным, при рисовании удерживаем клавишу Shift. Внимание! При необходимости нужно не забыть определить центр костюма. Размеры мячика нужно подкорректировать, чтобы на игровом поле он выглядел примерно так, как на рисунке.
Pong Перейдем также в свойства info мячика и назовем его Ball. Остальные настройки менять не нужно. Начальные параметры Вспомним, что именно мячик определяет, кому засчитать очко в случае проигрыша. А значит, для этого нам понадобятся две переменные. Создадим их с именами PS (сокращенно от английского Player Score — очки игрока) и CS (сокращенно от английского Computer Score — очки компьютера) в группе Данные. 203
204 РАЗДЕЛ 2. Создание игр Значение этих переменных будет отображаться на экране. Поэтому переместим их на свои места: PS — наверху слева, CS — наверху справа. Сделать это можно с помощью перетаскивания мышью прямо в области анимации. После начала игры мы должны обнулить счет, переместить мяч в середину игрового поля и случайным образом выбрать начальное направление его движения (помня, что мы ограничены диапазоном поворота от –179 до 180), что и сделаем.
Pong Основной функционал Дальше будет происходить ряд различных проверок, определяющих поведение мяча, и поэтому снова добавляем бесконечный цикл Всегда. Все остальные команды скрипта будут находиться внутри него. Прежде всего мячик должен двигаться в выбранном направлении с некоторой скоростью, поэтому добавляем команду Идти 10 шагов из группы Движение. Мяч должен постоянно «сообщать» свое положение по оси y (это нужно для ракетки компьютера). Мы должны записать значение этого положения в переменную BallPosition. Теперь можно проверить, что ракетка Comp начала двигаться, стараясь угадать траекторию мяча! Время провести промежуточное тестирование! Помимо простого перемещения мяч должен отскакивать от краев экрана. Для этого и добавляем хорошо знакомую команду из группы Движение. 205
206 РАЗДЕЛ 2. Создание игр Ну а теперь начинается самое интересное: нам нужно создать четыре проверки и варианты поведения мячика при их выполнении: 1) касание ракетки игрока; 2) касание ракетки компьютера; 3) попадание в ворота игрока; 4) попадание в ворота компьютера. Каждый из этих фрагментов будет представлять собой отдельный оператор условия Если …, то … из группы Управление. Пас компьютеру! Реализуем отскок от ракетки игрока. Для этого мы должны проверить следующее условие: Если касается Player, то … Все, что нужно сделать мячику, — это поменять направление своего движения. Но, как мы и говорили, мы добавим элемент случайности, чтобы сделать игру интереснее.
Pong Рассмотрим следующий рисунок, на котором видно, в каком направлении вообще должен направиться мячик после удара о ракетку игрока. Мы видим, что можно случайным образом выбрать любое направление от 45 до 135, что и сделаем. Пас игроку! Аналогичным образом реализуем отскок от ракетки компьютера. Здесь условие для проверки: Если касается Comp, то … Рассмотрим похожий рисунок по направлению отскока для ракетки компьютера. 207
208 РАЗДЕЛ 2. Создание игр Здесь можно выбрать любое направление от –45 до –135. Гол игроку! Третья проверка будет заключаться в том, коснулся ли мяч ворот игрока: Если касается PGate, то … Если мяч попал в ворота, то мы должны засчитать очко компьютеру, то есть увеличить переменную CS
Pong на единицу. Добавим внутрь условного оператора команду Изменить CS на 1 из группы Данные. Помимо этого, нужно начать следующий раунд, то есть вернуть мяч в центр игрового поля и подождать пару секунд, чтобы игрок успел перегруппироваться. Гол компьютеру! Последняя проверка связана с касанием мяча ворот компьютера: Если касается CGate, то … При истинности условия действия будут теми же, но только очко будет засчитываться игроку и соответственно на единицу мы увеличим переменную PS. 209
210 РАЗДЕЛ 2. Создание игр Время провести промежуточное тестирование! Наша игра готова! Теперь можно запустить ее и перенестись назад в прошлое — почувствовать захватывающий геймплей семидесятых! PS 0 CS 0 Апгрейд Улучшения, которые мы введем в нашу игру: 1) сделаем компьютер не таким быстрым и точным, чтобы увеличить шансы на выигрыш пользователя; 2) реализуем идею Алана Алкорна и с каждым ударом о ракетку будем увеличивать скорость движения мяча; 3) усложним игровой процесс: помимо увеличения скорости будем постепенно уменьшать размер мяча. Все ради победы! Можно заметить, что сейчас в нашей игре компьютер играет довольно точно и обыграть его почти невозможно. В настоящей игре такого быть не может, поэтому мы изменим скорость его движения, она станет немного меньше, чем у пользователя. Однако и компьютер не станет постоянно проигрывать. На самом деле это улучшение еще и задел на будущее, потому как мы создадим специальную перемен-
Pong ную, которая станет задавать скорость перемещения ракеток — это откроет перед нами новые возможности. Создаем переменную MoveSpeed (в переводе с английского — скорость перемещения) в группе Данные. Отображаться на экране она не должна, поэтому убираем галочку возMoveSpeed ле нее. В ней будем хранить скорость движения ракеток. В будущем мы будем менять эту скорость в процессе игры. Поэтому ее начальное значение мы зададим в спрайте Ball в самом начале скрипта. Теперь обе ракетки должны принимать в качестве скорости своего движения значение этой переменной. Перейдем к спрайту Player и в его первой команде Изменить y на 10 заменим неизменное число 10 на переменную MoveSpeed. Во второй такой команде необходимо получить отрицательное значение — для этого мы домножим значение переменной MoveSpeed на –1. 211
212 РАЗДЕЛ 2. Создание игр То же самое нужно сделать и в спрайте Comp. Только мы договорились, что скорость движения ракетки компьютера будет немного меньше. Поэтому из значения переменной MoveSpeed мы дополнительно вычтем 5. Время провести промежуточное тестирование! Ускорение мяча С каждым ударом о любую ракетку скорость мяча должна возрастать, а значит, за это снова будет отвечать переменная. Но учтем и еще одно: чем быстрее движется мяч, тем быстрее должны двигаться и ракетки. Для начала создадим переменную BallSpeed (в переводе с английского — скорость мяча) в группе Данные. Отображать ее на экране также не требуется, поэтому галочку возле нее убираем. Эта переменная влияет только на поведение мяча, поэтому работать мы будем исключительно со спрайтом Ball.
Pong Первым делом инициализируем ее — в начало скрипта добавим команду Задать BallSpeed значение 2 из группы Данные. Первая команда внутри бесконечного цикла Идти 10 шагов задает скорость движения мяча. Нам нужно заменить числовой параметр 10 на переменную BallSpeed. Далее нужно добавить команду, увеличивающую значение этой переменной в тех местах, где происходит обработка удара мяча о ракетку. За это отвечают два оператора условия, которые проверяют касание с Player и Comp. Добавим внутрь их по одной команде Изменить BallSpeed на 2 из группы Данные. 213
214 РАЗДЕЛ 2. Создание игр Однако после каждого пропуска мяча игроком или компьютером мы должны вернуть скорость обратно к значению 2. Сделать это нужно в двух других операторах условия, которые проверяют касание с PGate и CGate. Добавляем в каждый из них по одной команде Задать BallSpeed значение 2 из группы Данные. Время провести промежуточное тестирование! Но это еще не все. Аналогичным образом мы должны увеличивать значение переменной MoveSpeed, чтобы скорость движения ракеток «успевала» за скоростью мяча. Будет достаточно увеличивать ее на единицу с
Pong каждым ударом об одну из ракеток. И нужно не забыть вернуть ее начальное значение, равное 10, при пропуске мяча. Время провести промежуточное тестирование! 215
216 РАЗДЕЛ 2. Создание игр Уменьшение мяча Несмотря на все наши усилия, выиграть у компьютера все еще довольно сложно, но тем интереснее игра! Мы способны и на большие подвиги — похожим образом будем изменять размеры мяча при каждом ударе о ракетку, не забывая при этом возвращать его к начальному виду после каждого пропуска. В самом начале скрипта Ball нужно сперва установить полный размер мяча. Для этого добавим команду Установить размер 100% из группы Внешность. Для уменьшения мяча будем пользоваться командой Изменить размер на –5, а возвращать исходный размер той же командой Установить размер 100% из группы Внешность. Время провести промежуточное тестирование!
Pong 217
218 РАЗДЕЛ 2. Создание игр Отлично! Мы доработали игру до новой версии Pong v2.0! Пора выяснить, кто же станет королем самой популярной игры?! Геймпад Pong станет еще ближе к оригиналу, если управлять ракеткой игрок сможет с помощью рычажка на геймпаде. Изменим программу для ракетки игрока Player, а именно те части скрипта, которые выделены на рисунке: Управление теперь будет осуществляться не с помощью клавиш-стрелок, поэтому оба условия с их наполнением нам больше не понадобятся. На месте этих четырех блоков нужно создать управление с помощью рычажка. Можно заметить, что ракетка изменяет свое положение по вертикали в пределах от –160 до 160, в то время как показания рычажка находятся в пределах от 0 до 100 соответственно.
Pong 100 160 75 80 50 0 25 –80 0 –160 Положение ракетки Положение рычажка Значит, как мы это делали в игре Arkanoid, нам нужно уравнять их значения. Рассмотрим следующий рисунок и экспериментально выведем нужную формулу для преобразования: На этот раз получить преобразование несколько сложнее, так как прямая зависимость сразу не видна. Обратим внимание на второе снизу положение. Если отбросить минус и разделить положение ракетки (80) на положение рычажка (25), то мы получим коэффициент масштаба, равный 3.2. Также заметим, что положение рычажка 50 снова соответствует положению 0 ракетки. А значит, в формуле мы должны вычитать 50. Попробуем применить эти выводы к каждому из положений. Рычажок Ракетка Преобразование 0 –160 (0 – 50) · 3.2 = –160 25 –80 (25 – 50) · 3.2 = –80 50 0 (50 – 50) · 3.2 = 0 75 80 (75 – 50) · 3.2 = 80 100 160 (100 – 50) · 3.2 = 160 219
220 РАЗДЕЛ 2. Создание игр Значит, из значения положения рычажка нужно вычесть 50 и полученную разность умножить на 3.2, чтобы получить соответствующее значение положения платформы-ракетки. Тогда общая формула получится такой: Положение ракетки по y = (Рычажок – 50)˜ 3.2 Воспользуемся командой Установить y в … из группы Движение. В качестве значения реализуем выведенную формулу: Поместим созданную команду на свое место в бесконечном цикле. Скорее подключаем геймпад и начинаем путь на вершину Pong-почета! Идеи для обновления до Pong v3.0 Идея 1. Добавьте таймер обратного отсчета перед началом игры и каждого раунда. Для этого понадобится отдельная переменная, которая будет уменьшаться на единицу один раз в секунду, пока не станет равна нулю. После чего пропадет с экрана.
Сообщество Scratch Идея 2. Добавьте ситуацию победы в игре. Например, если игрок набрал 10 очков, то безоговорочная победа присуждается ему, и наоборот. Идея 3. Приблизьте игру к оригиналу еще сильнее — подобно Аллану Алкорну создайте звуковое сопровождение. Если вы внимательно читали историю, то понимаете, насколько важно, чтобы она сопровождалась звуками. Идея 4. Добавьте в игру уровни — с каждым заработанным очком ракетка того, кто выигрывает, должна становиться меньше. Идея 5. Сделайте так, чтобы после завершения игры она задавала вопрос пользователю: «Try again?1» и в зависимости от его ответа «Y2» или «N3» игра, соответственно перезапускалась заново или завершалась. Сообщество Scratch Самое крупное сообщество разработчиков игр, анимации и просто интересных программ представлено на официальном сайте Scratch: https://scratch.mit.edu/. Вступай в сообщество, делись своими идеями, общайся с единомышленниками по всему миру! 1 Попробовать еще раз? 2 Yes — да. 3 No — нет. 221
222 РАЗДЕЛ 2. Создание игр Ты можешь загрузить индивидуальную работу, а можешь открыть целую студию вместе со своими друзьями или присоединиться к уже существующей! Но это еще не все! С 2017 года в России проводится уникальная в своем роде Международная Scratch-олимпиада по креативному программированию. Главными организаторами являются дистанционная электронная школа «Знаника» и компания ROBBO. Олимпиада проводится ежегодно! Принять участие может любой учащийся 1–11 классов! Формат проведения — дистанционный, поэтому для участия нужен только компьютер, Scratch и желание стать лучшим из лучших! Подробнее об олимпиаде можно узнать по ссылке: http://znanika.ru/scratch. Официальный сайт компании ROBBO: http://robbo.ru/. Официальный сайт электронной школы «Знаника»: http://znanika.ru/.
Заключение Поздравляем тебя! Ты проделал огромную работу и теперь тебя смело можно называть настоящим программистом и разработчиком игр! Надеемся, что ты весело и с пользой провел время в нашем увлекательном путешествии по миру программирования и разработки игр вместе со Scratch! Однако помни: это только начало пути! Впереди еще много интересного, сложного, удивительного! Для повышения уровня своей квалификации тебе нужно изучить и текстовые языки программирования высокого уровня, такие как Python, C++, C#, Java. Настоящему разработчику игр или создателю мультфильмов не обойтись без технологий 3D-моделирования. А если ты хочешь стать известным на весь мир, то тебе, как минимум, понадобится собственный сайт, на котором ты сможешь познакомить жителей нашей планеты со своими достижениями и идеями! Продолжай заниматься и совершенствовать свои навыки, развиваться в самых различных направлениях и, в частности, в программировании. Наша серия «Школа юного программиста» поможет тебе в этом! Успехов, дорогой друг! Еще увидимся!
Словарь программиста Понятие Определение Алгоритм Строгая последовательность действий, созданная для решения поставленной задачи и получения конкретного результата за ограниченное число шагов Алгоритмизация Процесс создания алгоритма под конкретную задачу Аппаратное обеспечение Набор реальных частей (например, деталей компьютера), входящих в состав устройства Ввод данных Получение данных от пользователя (с помощью клавиатуры, мыши, микрофона и других устройств) или другой программы для обработки в программе Вывод данных Отображение данных на экране монитора, воспроизведение звука с помощью акустической системы, печать текста принтером и т. д. Естественный язык Набор символов, слов и правил построения предложений, возникший естественным путем при развитии речи у людей (русский, английский, французский и другие языки) Интерактивность Взаимодействие пользователя и технического устройства, при котором возникает диалог между ними. На действия пользователя возникает ответная реакция устройства (например, передвижение объектов на экране при нажатии кнопок на клавиатуре) Интерфейс Внешний вид устройства или программного обеспечения, стоящий на границе взаимодействия пользователя и технического устройства Исполнение Выполнение компьютером (или другим устройством) созданной для него программы
Словарь программиста Продолжение табл. Понятие Определение Оператор Команда (символ), выполняющая определенную операцию Операция В программировании: математическое (сложение, умножение и др.) или логическое (сравнение и др.) действие Переменная Именованная область памяти компьютера, которую можно свободно использовать для хранения данных в программе Пользователь Человек, использующий программу, не разбираясь в ее «внутренностях» Постусловие Условие, проверяемое после выполненных действий Предусловие Условие, проверяемое перед выполнением действий Присваивание Задание конкретного значения конкретной переменной Программа Набор скриптов, составляющий единое целое, позволяющий аппаратному обеспечению выполнять различные действия Программирование Процесс создания программы Программист Человек, создающий программу и разбирающийся в ее «внутренностях»; специалист, разрабатывающий программное обеспечение Программное обеспечение Набор виртуальных компонентов (программ), обеспечивающих функционирование аппаратного обеспечения Псевдокод Язык описания алгоритмов, использующий естественный язык для написания предварительного плана для создания программы Псевдослучайное число Число, выбираемое из некоего диапазона значений 225
226 Словарь программиста Окончание табл. Понятие Определение Разработка Процесс «придумывания», конструирования (создания) нового материального или виртуального продукта, к которому обычно привлекается команда специалистов разных областей Рекурсия Обращение скрипта к самому себе (например, создание клона объекта самим объектом) Системное сообщение Сообщение, отсылаемое внутри программы и вызывающее к исполнению ее отдельную часть; скрыто от глаз пользователя Скрипт Самостоятельная часть программы, выполняющая возложенную на нее функцию Спрайт Виртуальный объект, имеющий визуальную (видимую) форму Тип данных Допустимое множество значений для хранения в памяти компьютера (например, в переменной) Условие Проверка, осуществляемая с целью принятия решения о выполнении тех или иных действий Цикл Повторение заданных действий Язык программирования Набор символов, слов и правил построения фраз, понятных программисту, предназначенный для создания компьютерных программ
Приложение. Математический тренажер
Содержание От авторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Загрузка и установка Scratch 2.0 Offline Editor . . . . 3 4 5 9 РАЗДЕЛ 1. Программирование . . . . . . . . . . . . . . . . . . . . 11 Обзор интерфейса . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Первая программа . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Декартова система координат . . . . . . . . . . . . . . . . . 36 Рисование по координатам . . . . . . . . . . . . . . . . . . . 48 Псевдослучайные числа, интерактивность, управление программами . . . . . . . . . . . . . . . . . . . . . 63 Переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Ввод данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Математический тренажер . . . . . . . . . . . . . . . . . . 113 РАЗДЕЛ 2. Создание игр . . . . . . . . . . . . . . . . . . . . . . . . .119 ROBBO Lab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Arkanoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 «Змейка» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Pong . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Сообщество Scratch . . . . . . . . . . . . . . . . . . . . . . . . . 221 Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Словарь программиста . . . . . . . . . . . . . . . . . . . . . . . . 224 Приложение. Математический тренажер . . . . . . . . 227
Минимальные системные требования определяются соответствующими требоваң ниями программ Adobe Reader версии не ниже 11ңй либо Adobe Digital Editions версии не ниже 4.5 для платформ Windows, Mac OS, Android и iOS; экран 10" Электронное издание для дополнительного образования Серия: «Школа юного программиста» Тарапата Виктор Викторович Прокофьев Борис Викторович УЧИМСЯ ВМЕСТЕ СО SCRATCH. ПРОГРАММИРОВАНИЕ, ИГРЫ, РОБОТОТЕХНИКА Для детей среднего и старшего школьного возраста Ведущий редактор Ю. А. Серова. Художественный редактор В. А. Прокудин Технический редактор Т. Ю. Федорова. Корректор И. Н. Панкова Компьютерная верстка: Е. Г. Ивлева Подписано к использованию 13.11.18. Формат 155×225 мм Издательство «Лаборатория знаний» 125167, Москва, проезд Аэропорта, д. 3 Телефон: (499) 157ң5272 eңmail: info@pilotLZ.ru, http://www.pilotLZ.ru
Программирование – это грамотность XXI века! Книги новой серии «Школа юного программиста» издательства «Лаборатория знаний» построены на методике пошагового обучения программированию. Следуя этой методике, любой желающий, от школьника до студента вуза, сможет научиться писать программы, разрабатывать мобильные приложения и компьютерные игры и даже освоить технологии машинного обучения и нейросетей. В серию войдут следующие учебные пособия: • «Учимся вместе со Scratch: программирование, игры, робототехника» (5–6 классы) • «Scratch 2.0: от новичка к продвинутому пользователю. Пособие для подготовки к Scratch-Олимпиаде» (1–11 классы) • «Творческие задания в среде Scratch. Рабочая тетрадь для 5–6 классов» • «Scratch 2.0: творческие работы на вырост. Рабочая тетрадь для 7–8 классов» • «Создаем игры с Kodu Game Lab» (4–5 классы) • «Python для начинающих – от основ до ООП и приложений» (7 класс) • «Олимпиадное программирование на Python» (7–8 классы) • «C# – новый учебный курс программирования от основ до продвинутого уровня» (8–9 классы) • «Android-разработка: мобильные приложения» (8–9 классы) • «Web-разработка: создай свой идеальный сайт. Обучаемся тонкостям HTML, HTML5, CSS3, SQL, PHP, JavaScript» (8–10 классы) • «Основы искусственного интеллекта и нейросетей» (10–11 классы, студенты) и другие.