Вопросы:
· Определение переменной.
· Создание переменных.
· Применение переменных.
Вспомним одну из своих старых игр. Загрузим из нашей рабочей папки проект «Пинг-понг» и вспомним, о чём он. В этой игре 2 игрока играют друг против друга. Проигрывает тот игрок, который не успел отбить мяч платформой. При проигрыше одного из игроков игра сразу заканчивается.
В настоящем пинг-понге игра заканчивается не сразу. Идёт счёт очков. Игра заканчивается, когда один из игроков наберёт 11 очков при перевесе не менее 2 очков. Что нам мешает так сделать? Нам не хватает датчиков счёта игроков. Сегодня мы научимся создавать свои собственные датчики. В этом нам помогут переменные.
Переменной называется именованный участок оперативной памяти, в котором хранятся данные. Это определение может показаться сложным, поэтому пока запомним, что переменная состоит из имени и данных. Спрайт обращается к переменной по имени и получает данные, которые в ней хранятся. Некоторые из вас заметили, что с датчиками происходит точно так же. Спрайт обращается к датчику, используя его блок, а датчик сообщает спрайту значение величины, то есть данные.
Как работать с переменными в Scratch? Для этого на вкладке «Скрипты» есть категория «Данные». Перейдя в эту категорию, поначалу мы не увидим ни единого привычного блока. Нас встретят только кнопки «Создать переменную» и «Создать список». Нажмём на кнопку «Создать переменную». Появилось окно, в котором предлагается ввести имя первой переменной. В этой переменной будет храниться счёт первого игрока, поэтому назовём её Player 1. Также предлагается выбрать, для каких спрайтов будет доступна переменная, сделаем её доступной для всех спрайтов и нажмём на кнопку «ОK».
После того как мы создали переменную, стали доступны некоторые блоки. Рассмотрим их. Первый блок, на котором изображено название переменной, не является командой. Через этот блок с переменной можно работать так же, как с уже знакомыми нам датчиками. Щёлкнув по нему, можно посмотреть данные, которые хранятся в переменной. Сейчас это число 0. Также у этого блока, как у многих датчиков, есть квадратное окошко, которое позволяет вывести данные, которые содержаться в переменной, на экран. Блок «Задать значение» позволяет задать новые данные для переменной. С помощью блока «Изменить на...» можно увеличить или уменьшить число, которое хранится в переменной, на некоторое значение. Чтобы уменьшить значение переменной, нужно указать в блоке отрицательное число.
Два последних блока дублируют назначение квадратного окошка перед первым блоком. С помощью блока «Показать переменную» можно вывести значение переменной на экран, а с помощью блока «Скрыть переменную» можно убрать это значение с экрана. Эти два блока позволяют проделать эти действия в скрипте.
Создадим переменную, в которой будем считать очки второго игрока. Назовём её «Плеер два». Чтобы вывести значения переменных на экран, установим галочки в окошках переменных. Установим окошко Player 1 в одном из нижних углов сцены, а окошко Player 2 – в одном из верхних углов. Так они не будут мешать игре.
Теперь добавим в игру подсчёт очков. Добавим всё в скрипт мяча. В начале игры у обоих игроков должно быть ноль очков. Поэтому при запуске скрипта обнулим переменные. Для этого используем блоки «Задать значение», в выпадающих списках которых установим имена переменных. Дальше нужен подсчёт очков. Чтобы понять, кому засчитывать очко, нужно знать, верхнего или нижнего края сцены коснулся мяч. Пока края обозначены линиями одного цвета, этого сделать не получится, поэтому изменим фон сцены. С помощью заливки изменим цвет верхней линии на синий.
Теперь изменим в скрипте шара ветвление, которое отвечает за окончание игры. Изменим в нём условие. Достанем из блока сенсор касания цвета и установим его рядом. Установим в блок ветвления блок оператора «Или». В первую ячейку блока «Или» установим сенсор касания красного цвета, а во вторую ячейку установим сенсор касания синего цвета. Уберём из ветвления блок «Стоп», теперь при касании края игра заканчиваться не будет. После звукового блока добавим блок полной формы ветвления. В него установим условие, при котором первому игроку нужно засчитать очко. Для этого шар должен коснуться верхнего края сцены, то есть синего цвета. Установим в блок сенсор касания синего цвета. Этот блок будет срабатывать, когда мяч коснётся верхнего или нижнего края сцены.
Если шар коснётся верхнего края, мы должны засчитать очко первому игроку, то есть увеличить число, которое хранится в переменной Player 1, на единицу. Используем для этого блок «Изменить на...». Если условие этого ветвления не выполняется, значит, мяч коснулся красного цвета, а значит, нужно засчитать очко второму игроку, то есть увеличить число, которое хранится в переменной Player 2, на единицу. После того как мы засчитали очко одному из игроков, нужно вернуть мяч на начальную позицию. Для этого продублируем блоки, которые расположены перед циклом.
Запустим скрипты на выполнение. Теперь, если мяч касается верхнего или нижнего края сцены, соответствующий счётчик увеличивается на единицу. После этого мяч оказывается на исходной позиции и летит в изначальном направлении.
Однако в направлении полёта мяча есть небольшая проблема. Если в начале полёта мяча верхняя платформа находится близко к левому краю, то игроку будет сложно успеть переместить её под мяч. Да и почему мяч сначала всегда летит вверх? Немного уравняем шансы игроков. Остановим скрипты. Сделаем так, чтобы платформы после пропущенного мяча оказались в середине сцены, а мяч случайным образом летел либо вертикально вверх, либо вертикально вниз. Для этого после ветвления добавим блок «Передать», в нём создадим новое сообщение с названием «Очко». Дальше перейдём к первой платформе и добавим в рабочее поле блок для запуска скрипта «Когда я получу», в котором укажем сообщение «Очко». В новый скрипт добавим единственный блок из категории «Движение»: «Установить x в 0». Такой же скрипт составим для второй платформы. Так платформы при новом запуске мяча будут оказываться в середине сцены.
Теперь сделаем так, чтобы мяч после запуска случайным образом летел либо случайно вверх, либо случайно вниз. Для этого в начале скрипта мяча в блок поворота установим блок оператора умножения. В первую ячейку этого блока установим датчик случайных чисел и сделаем так, чтобы он выдавал случайное число от 0 до 1. То есть блок будет выдавать либо 1, либо 0. Во вторую ячейку блока умножение запишем число 180. Так блок умножения будет выдавать либо число 0, либо число 180, а спрайт мяча будет поворачиваться в направлении соответствующей градусной меры, то есть либо вертикально вверх, либо вертикально вниз. Продублируем блок умножения и установим копию в блоке поворота мяча после того, как засчитано очко.
Запустим игру в режиме презентации. При касании мячом верхнего или нижнего края сцены засчитывается очко соответствующему игроку, после чего платформы перемещаются в середину сцены, а мяч летит из центра сцены случайно либо вверх, либо вниз. Остановим скрипты.
Игра подсчитывает очки игроков, осталось только научить её определять победителя. Игра заканчивается, когда один из игроков наберёт 11 очков при разнице не менее 2 очков. А выигрывает при этом тот игрок, у которого большее количество очков. Для начала добавим в скрипт мяча, после того как засчитано очко, блок для сокращённой формы ветвления, который будет срабатывать при окончании игры. Составим в нём условие конца игры так, как это показано на экране. Это условие будет работать, если хотя бы один из игроков набрал одиннадцать или более очков и разница очков меду игроками два и более.
Определимся с действиями для конца игры. В этом случае сделаем так, чтобы спрайт мяча передавал сообщение «Конец», а после отработки скриптов, вызванных сообщением, завершал и все оставшиеся скрипты.
Сделаем так, чтобы на экран выводилась заставка, говорящая о том, какой из игроков победил. Для этого всем спрайтам добавим скрипты, которые будут прятать их при получении сообщения о конце игры. Чтобы спрайты отображались в начале игры, добавим соответствующие блоки в скрипты, которые запускаются при нажатии на зелёный флажок.
Дальше добавим для сцены фоны заставок. На фоне первой заставки с помощью инструмента «Текст» на английском языке напишем сообщение о том, что победил первый игрок. Точно так же создадим фон для второй заставки. Его текст будет говорить о том, что победил второй игрок.
Дальше составим для сцены скрипт, который будет запускаться при получении сообщения «Конец». В него установим блок для полной формы ветвления с условием, что первый игрок набрал больше очков, чем второй. В этом случае сменим фон на первую заставку, то есть «Фон два». В противном случае сменим фон на вторую заставку, то есть «Фон три». Чтобы в начале игры на сцене было игровое поле, добавим цене скрипт, который при нажатии на зелёный флажок будет менять фон на изначальный.
Мы закончили составление скриптов. Запустим игру. Платформы всё ещё двигаются, счётчики очков так же работают, как и запуск мяча. Осталось протестировать окончание игры, но целую партию играть долго, поэтому немного схитрим. Остановим скрипты и уберём на время тестирования из скрипта мяча блоки, обнуляющие счётчики в начале игры. С помощью соответствующего блока зададим переменной Player 1 значение 10. Затем запустим скрипт и сделаем так, чтобы первый игрок заработал последнее, одиннадцатое очко. На экране появилась заставка, говорящая о победе первого игрока. Теперь установим счёт десять, десять и снова запустим игру. Сделаем, чтобы очко набрал второй игрок. Счётчик увеличился, но игра не закончилась, так как разница между игроками в 1 очко. Сделаем так, чтобы второй игрок получил ещё 1 очко. Теперь на экране появилась заставка, говорящая, что победил второй игрок. Игра работает правильно. Вернём блоки обнуления счётчиков на место и сохраним проект.
Мы узнали:
· Переменной называется именованный участок оперативной памяти, в котором хранятся данные.
· Блоки для работы с переменными находятся в категории «Данные». Это блоки-датчики, которые позволяют просмотреть значение переменной и вывести его на экран, а также блоки, задающие и изменяющие значение переменной.