Как хранить данные в проекте: создание, «задать» и «изменить на»

Scratchобновлено 07.10.20269 мин чтения

Переменные в Scratch — это оранжевые ячейки памяти с именем, в которых проект хранит число или текст: очки, жизни, оставшееся время, номер уровня. Их создают кнопкой «Создать переменную», значение записывают блоком «задать», а увеличивают или уменьшают блоком «изменить на».

Что такое переменная в Scratch

Переменная — это коробка с наклейкой-именем: в неё кладут одно значение, потом достают его, заменяют или увеличивают. В Scratch такие коробки лежат в оранжевой категории «Переменные».

Без переменных игра не может ничего помнить. Кот съел монету — откуда программе знать, сколько их было до этого? Нужна ячейка «очки», где лежит число, и блок, который прибавит к нему единицу. Школьная информатика подходит к той же теме с другой стороны: по федеральной образовательной программе переменные и присваивание изучают на информатике в 8 классе[1], но в Scratch ребёнок сталкивается с ними раньше — как только хочет вести счёт. Карен Бреннан и Митчел Резник из MIT Media Lab называют работу с данными одной из семи концепций вычислительного мышления[2].

Овальный блок с именем переменной — это её значение. Его можно вставить в любое круглое окошко: в «идти … шагов», в «говорить», в сравнение. Если поставить галочку рядом с блоком в палитре, на сцене появится табло, где значение видно в реальном времени. Это удобно и для игрока, и для отладки: сразу понятно, меняется ли число так, как задумано.

В статье Maloney и соавторов из MIT такие табло названы одним из способов сделать работу программы видимой: ребёнок не гадает, что происходит внутри, а смотрит на числа[4]. Поэтому переменные в Scratch удобно изучать «на просвет»: включить табло, запустить проект и следить, как меняется значение после каждого блока. Если число повело себя не так, ошибка почти всегда найдётся рядом с последним блоком «задать» или «изменить на».

Как создать переменную: 4 шага

Чтобы создать переменную, достаточно 4 шагов: открыть категорию «Переменные», нажать «Создать переменную», ввести имя и выбрать, кому она доступна. После этого в палитре появятся её блоки.

  1. Откройте категорию. Оранжевый кружок «Переменные» в колонке слева от палитры.
  2. Нажмите кнопку. «Создать переменную» — первая строка категории.
  3. Дайте имя. Короткое и понятное: «очки», «жизни», «время», а не «а» и «б».
  4. Выберите доступ. «Для всех спрайтов» или «Только для этого спрайта» — разница объясняется ниже.

В новом проекте уже есть переменная «моя переменная»: её можно переименовать или удалить правой кнопкой мыши по блоку в палитре. Там же находится кнопка «Создать список» — список хранит не одно значение, а много, например все вопросы викторины. Имена переменных в Scratch можно писать по-русски и с пробелами — в отличие от Python, где допустимы только буквы, цифры и подчёркивание без пробелов. Владельцам аккаунтов иногда доступна галочка «облачная переменная»: её значение хранится на сервере и одно на всех игроков, так делают общие таблицы рекордов. Справка Scratch Foundation для родителей напоминает, что опубликованное в сообществе видят другие люди, и облачные значения — не исключение.

«Задать» и «изменить на»: в чём разница

Блок «задать … значение 0» записывает в переменную новое число, стирая старое, а «изменить … на 1» прибавляет число к тому, что уже лежит внутри. Это 2 главных блока категории.

БлокБыло в переменнойСталоКогда нужен
«задать очки значение 0»150Сброс в начале игры
«изменить очки на 1»1516Подобрал монету
«изменить жизни на −1»32Коснулся врага
«задать уровень значение 2»12Переход на новый уровень

Отдельного блока «уменьшить» нет: вычитание делают тем же «изменить», только с отрицательным числом. А вот «задать» почти всегда ставят под блоком «когда щёлкнут по флажку», в самом начале скрипта. Иначе после второго запуска счёт продолжится с того места, где закончилась прошлая игра.

Эти два блока покрывают почти всё, что делают переменные в 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» под флажком. Добавьте его в самое начало, до цикла.

Как убрать табло со сцены?

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

Можно ли хранить текст, а не число?

Да. Блок «задать» принимает и слова: имя игрока, ответ на вопрос, название уровня.

Как сделать ползунок на сцене?

Щёлкните правой кнопкой по табло и выберите «слайдер». Игрок сможет менять значение мышкой, а диапазон настраивается там же.

Чем список отличается от обычной ячейки?

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

Почему у клонов разные значения?

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