Что такое переменная в Scratch
Переменная — это коробка с наклейкой-именем: в неё кладут одно значение, потом достают его, заменяют или увеличивают. В Scratch такие коробки лежат в оранжевой категории «Переменные».
Без переменных игра не может ничего помнить. Кот съел монету — откуда программе знать, сколько их было до этого? Нужна ячейка «очки», где лежит число, и блок, который прибавит к нему единицу. Школьная информатика подходит к той же теме с другой стороны: по федеральной образовательной программе переменные и присваивание изучают на информатике в 8 классе[1], но в Scratch ребёнок сталкивается с ними раньше — как только хочет вести счёт. Карен Бреннан и Митчел Резник из MIT Media Lab называют работу с данными одной из семи концепций вычислительного мышления[2].
Овальный блок с именем переменной — это её значение. Его можно вставить в любое круглое окошко: в «идти … шагов», в «говорить», в сравнение. Если поставить галочку рядом с блоком в палитре, на сцене появится табло, где значение видно в реальном времени. Это удобно и для игрока, и для отладки: сразу понятно, меняется ли число так, как задумано.
В статье Maloney и соавторов из MIT такие табло названы одним из способов сделать работу программы видимой: ребёнок не гадает, что происходит внутри, а смотрит на числа[4]. Поэтому переменные в Scratch удобно изучать «на просвет»: включить табло, запустить проект и следить, как меняется значение после каждого блока. Если число повело себя не так, ошибка почти всегда найдётся рядом с последним блоком «задать» или «изменить на».
Как создать переменную: 4 шага
Чтобы создать переменную, достаточно 4 шагов: открыть категорию «Переменные», нажать «Создать переменную», ввести имя и выбрать, кому она доступна. После этого в палитре появятся её блоки.
- Откройте категорию. Оранжевый кружок «Переменные» в колонке слева от палитры.
- Нажмите кнопку. «Создать переменную» — первая строка категории.
- Дайте имя. Короткое и понятное: «очки», «жизни», «время», а не «а» и «б».
- Выберите доступ. «Для всех спрайтов» или «Только для этого спрайта» — разница объясняется ниже.
В новом проекте уже есть переменная «моя переменная»: её можно переименовать или удалить правой кнопкой мыши по блоку в палитре. Там же находится кнопка «Создать список» — список хранит не одно значение, а много, например все вопросы викторины. Имена переменных в Scratch можно писать по-русски и с пробелами — в отличие от Python, где допустимы только буквы, цифры и подчёркивание без пробелов. Владельцам аккаунтов иногда доступна галочка «облачная переменная»: её значение хранится на сервере и одно на всех игроков, так делают общие таблицы рекордов. Справка Scratch Foundation для родителей напоминает, что опубликованное в сообществе видят другие люди, и облачные значения — не исключение.
«Задать» и «изменить на»: в чём разница
Блок «задать … значение 0» записывает в переменную новое число, стирая старое, а «изменить … на 1» прибавляет число к тому, что уже лежит внутри. Это 2 главных блока категории.
| Блок | Было в переменной | Стало | Когда нужен |
| «задать очки значение 0» | 15 | 0 | Сброс в начале игры |
| «изменить очки на 1» | 15 | 16 | Подобрал монету |
| «изменить жизни на −1» | 3 | 2 | Коснулся врага |
| «задать уровень значение 2» | 1 | 2 | Переход на новый уровень |
Отдельного блока «уменьшить» нет: вычитание делают тем же «изменить», только с отрицательным числом. А вот «задать» почти всегда ставят под блоком «когда щёлкнут по флажку», в самом начале скрипта. Иначе после второго запуска счёт продолжится с того места, где закончилась прошлая игра.
Эти два блока покрывают почти всё, что делают переменные в Scratch в первых играх. Для сложных расчётов в окошко «задать» вставляют зелёные операторы: «задать скорость значение (скорость) * 2» удваивает число, а «задать сторона значение выдать случайное от 1 до 6» бросает кубик.
Счёт очков: первая переменная в игре
Счёт очков — это переменная «очки», которой задают 0 при старте и прибавляют 1 при каждом касании монеты; табло на сцене показывает результат игроку.
когда щёлкнут по флажку
задать [очки] значение 0
повторять всегда
если <касается [Монета]?> то
изменить [очки] на 1
играть звук [Coin]
ждать 0.5 секунд
Пауза в конце нужна, чтобы одно касание не засчиталось много раз подряд: цикл крутится быстро, и пока кот стоит на монете, условие истинно в каждом повторе. Ещё аккуратнее — сразу переносить монету в новое случайное место. Когда очки дойдут до 10, можно сменить фон на «Победа» — для этого понадобится сравнение «очки > 9» в блоке «если». О проверках подробно рассказано в уроке про условия и касания в блоках.
Жизни и конец игры
Жизни — это переменная со стартовым значением 3, которая уменьшается на 1 при каждом касании врага; когда она становится равной 0, игра заканчивается.
когда щёлкнут по флажку
задать [жизни] значение 3
повторять всегда
если <касается [Призрак]?> то
изменить [жизни] на -1
перейти в x: -200 y: 0
если <(жизни) = 0> то
переключить фон на [Конец игры]
стоп [все]
После касания герой возвращается на старт — так он не потеряет все жизни за секунду. Проверку «жизни = 0» лучше держать в том же цикле: тогда игра закончится сразу. Можно показывать жизни не числом, а сердечками: отдельный спрайт меняет костюм в зависимости от значения.
Таймер: встроенный и самодельный
Для отсчёта времени есть 2 способа: встроенный блок «таймер» из категории «Сенсоры», который считает секунды с начала проекта, или своя переменная, которую уменьшают на 1 раз в секунду.
когда щёлкнут по флажку
задать [время] значение 30
повторять пока не <(время) = 0>
ждать 1 секунд
изменить [время] на -1
говорить [Время вышло!]
Самодельный обратный отсчёт удобнее показать игроку: на табло видно 30, 29, 28. Встроенный «таймер» точнее и считает доли секунды, его сбрасывают блоком «сбросить таймер». Он подходит, чтобы засечь, за сколько игрок прошёл уровень: в конце скопируйте его значение в свою переменную «рекорд».
Для всех спрайтов или только для этого
При создании нужно выбрать 1 из 2 вариантов: переменная «для всех спрайтов» общая для проекта, её читают и меняют все, а «только для этого спрайта» принадлежит одному герою.
| Вариант | Кто видит и меняет | Пример |
| Для всех спрайтов | Все спрайты и сцена | Очки, уровень, время игры |
| Только для этого спрайта | Только сам спрайт и его клоны, у каждого клона своя копия | Здоровье каждого врага, скорость падения снежинки |
Если сомневаетесь, выбирайте общий вариант — так проще начать. Личные значения нужны, когда у нескольких героев или клонов должно быть своё число: у каждого врага своё здоровье, у каждой снежинки своя скорость. У сцены собственных личных ячеек не бывает, всё созданное на ней — общее. Как клоны получают свои копии, показано в уроке про клоны в Scratch.
Переменные в Scratch и в Python
Блок «задать очки значение 0» в Python записывается как ochki = 0, а «изменить очки на 1» — как ochki += 1; идея та же, меняется только запись.
ochki = 0
zhizni = 3
ochki += 1
zhizni -= 1
print("Очки:", ochki, "Жизни:", zhizni)
Программа выведет «Очки: 1 Жизни: 2». В Python нет табло на сцене, поэтому значения показывают функцией print. Имена латиницей в стиле snake_case рекомендует руководство PEP 8[3]. Подробно о текстовом варианте — в статье про переменные в Python, а готовые упражнения — в разделе задач на переменные.
Когда отдельная ячейка не нужна
Отдельная ячейка не нужна, если нужное число уже есть в готовом блоке или значение никогда не меняется. Вот 4 таких случая.
- Положение героя. Координаты уже хранят овальные блоки «положение x» и «положение y» — 2 лишние ячейки не нужны.
- Время с начала игры. Встроенный «таймер» считает его сам, с точностью до 0,1 секунды и лучше.
- 20 вопросов викторины. Двадцать отдельных ячеек неудобны — для этого есть список.
- Шаг, который всегда равен 10. Число, которое не меняется, можно просто вписать в блок.
Миф: «Переменные — тема для старшеклассников». Это не подтверждается: очки в своей игре ребёнок 8–9 лет понимает без объяснений, а слово «переменная» просто даёт имя тому, что он уже делает.
Миф: «Табло на сцене и есть сама ячейка: спрятал табло — значение пропало». Такого не существует: «скрыть» убирает только отображение, а число продолжает храниться и меняться.
Чего делать нельзя
Нельзя забывать стартовое значение: без блока «задать» под флажком каждая новая игра продолжит старый счёт. Вот и другие правила.
- Нельзя ставить «задать … 0» внутрь игрового цикла — счёт будет обнуляться постоянно.
- Не стоит называть ячейки «а», «б», «x1»: через неделю никто не вспомнит, что в них лежит.
- Не следует засчитывать касание без паузы или переноса монеты — одно касание даст десятки очков.
- Не стоит делать личной ячейку, которую должны видеть все — другие спрайты её не изменят.
- Нельзя хранить в облачной ячейке имена и личные данные — её значение видят все игроки.
Источники
[1] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[2] Brennan K., Resnick M. New frameworks for studying and assessing the development of computational thinking // Proceedings of the 2012 Annual Meeting of the American Educational Research Association. Vancouver, 2012.
[3] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.
[4] Maloney J., Resnick M., Rusk N., Silverman B., Eastmond E. The Scratch Programming Language and Environment // ACM Transactions on Computing Education. 2010. Vol. 10, № 4. Article 16.
Вопросы и ответы
Почему счёт не обнуляется при новом запуске?
В скрипте нет блока «задать очки значение 0» под флажком. Добавьте его в самое начало, до цикла.
Как убрать табло со сцены?
Снимите галочку рядом с блоком в палитре или используйте блок «скрыть переменную». Значение при этом сохранится.
Можно ли хранить текст, а не число?
Да. Блок «задать» принимает и слова: имя игрока, ответ на вопрос, название уровня.
Как сделать ползунок на сцене?
Щёлкните правой кнопкой по табло и выберите «слайдер». Игрок сможет менять значение мышкой, а диапазон настраивается там же.
Чем список отличается от обычной ячейки?
Ячейка хранит одно значение, список — сколько угодно, по порядку и с номерами. Для вопросов викторины или рекордов нужен список.
Почему у клонов разные значения?
Если ячейка создана «только для этого спрайта», каждый клон получает свою копию и меняет её независимо от остальных.