Списки в Scratch
В Scratch в категории блоков кода "Переменные" есть кнопка "Создать список". В отличие от обычной переменной, список может хранить не одно значение, а много.
Например, мы создаем обычную переменную "число" и связываем ее с хранящимся в памяти компьютера числом 5. Но если мы создаем список "числа", то можем связать его с несколькими числами, расположенными в памяти друг за другом. Пусть это будут числа 30, 88, 17, 59.
У элементов принадлежащих одному списку есть порядковые номера. Так в нашем примере число 30 имеет номер 1, число 88 – номер 2, число 17 – номер 3, число 59 – номер 4. Таким образом, используя номера элементов, мы можем извлекать значения элементов. Например, команда "элемент 2 в числа" вернет нам 88.
В программировании часто используется понятие массива. Списки и массивы – близкие понятия. Однако обычно их различают следующим образом. В массиве могут содержаться только данные, принадлежащие одинаковому типу. Например, только слова или только числа. Элементами одного и того же массива не могут быть и числа и слова.
А вот в случае со списком такое может быть. Например, список [3, А, 4, 5.2, Кот] содержит целые числа, дробное число, букву и слово. С другой стороны, списку ничего не мешает содержать данные только одного типа и внешне походить на массив.
Зачем вообще нужны списки и массивы? В первую очередь для удобства обработки данных. Представьте, что вам надо изменить нескольких чисел. Если каждое число будет храниться в своей переменной, то придется помнить имена всех переменных и обращаться к каждой индивидуально.
Если же ряд чисел хранится в одном списке, у нас имеется только одна переменная – имя списка. А извлекать отдельные числа мы можем по их порядковым номерам, то есть индексам.
Рассмотрим пример. Создадим список под именем "Координата X", заполним его числами с помощью команды "добавить … к Координата X". Чтобы увидеть, что находится в списке, установим напротив его имени флажок. Содержащиеся в списке значения отобразятся на сцене.
Команда "удалить все из Координата X" нужна, чтобы список всегда оставался длинной в 5 элементов. Без этого блока при каждом запуске сценария будет добавляться еще по пять новых чисел, хоть и с теми же значениями.
Теперь представим, что кот должен использовать данные списка. Пусть его координата y остается постоянной, а для x допустимыми являются только те значения, которые есть в списке.
Получить какое-нибудь одно значение из списка можно с помощью блока "элемент … в Координата X", в котором вместо точек указывается номер элемента, значение которого мы хотим получить. Если нам нужно число 55, мы должны вписать в эту команду число 4, так как в нашем списке значение 55 четвертое по счету.
Блок "элемент … в Координата X" имеет форму скругленного прямоугольника без выемок. Такие блоки в Scratch ни к чему не присоединяются, они вставляются внутрь других блоков. Действительно, ведь можно сказать, что мы получаем чистые данные и должны передать их какому-то обработчику. Тому, кто с ними что-то сделает.
В нашем случае в качестве такого получателя информации подойдет команда "перейти в x: … y: …".
На скрине выше показано, что спрайт после клика по нему перешел в координату (0, -100). Координата 0 для оси x была взята из списка. Это значение является третьим в списке.
Теперь представим, что кот должен не только переходить в заданную координату, но еще сообщать зрителям свою позицию по оси x:
Поскольку один и тот же номер элемента используется два раза, неплохо было бы хранить его в отдельной переменной. И тогда, когда нам потребуется его поменять, делать это придется только в одном месте.
Мы создали обычную переменную "номер" и вначале скрипта присвоили ей 1. Потом, когда мы извлекаем нужное нам число из списка, вместо того, чтобы писать его номер, используем переменную.
В данном примере вводить в программу отдельную переменную для индекса (номера) элемента списка не обязательно. Однако бывают случаи, когда это просто необходимо. Например, нам надо перебрать все значения списка по-очереди, чтобы кот побывал во всех позициях, которые есть в списке.
В этом случае разумнее не повторять пять раз один и тот же набор команд, меняя в них только индекс. Правильнее использовать цикл, меняя в нем значение переменной индекса.
Когда цикл только начинает выполняться, "номер" равен 1. Из списка извлекается и используется первое значение. Потом мы изменяем "номер" на 1, то есть прибавляем единицу, и теперь переменная "номер" равна 2. Когда тело цикла будет повторяться пятый раз, в конце "номер" уже станет равным 6.
Вы можете установить флажок у переменной "номер" и понаблюдать, как меняется ее значение в процессе выполнения сценария.
В цикле выше есть один недочет. Программист не всегда знает, сколько элементов в списке. Ведь добавляться туда значения могут как угодно и где угодно в разных сценариях одной программы. Поэтому, если вы посмотрите на вкладку "Код", там где команды списка, то найдете блок "длина списка …". Он возвращает число, которое равно количеству элементов в списке, который указывается вместо троеточия.
Так как длина списка равна количеству необходимых повторов цикла, мы можем вставить эту команду в заголовок цикла. Она сама, вместо нас, узнает, сколько элементов в списке, и вернет это значение.
Рассмотрим другой пример, когда такой тип данных как список бывает полезен. Есть два спрайта-игрока, каждый из которых должен получить имя и начальные координаты. Их задает пользователь. В данном случае имеет смысл хранить данные о каждом игроке в отдельных списках – "Первый игрок" и "Второй игрок".
Договоримся, что первым элементом каждого списка будет имя игрока, вторым – координата x, а третьим – координата y.
Заполняющие списки скрипты спрайтов.
Обратите внимание, что добавление элементов происходит в конец списка. Поэтому имя будет иметь порядковый номер 1, а координата y – номер 3.
В процессе игры у спрайтов могут выполняться сценарии, извлекающие данные из списков.
Можно заподозрить, что мы сделали много бессмысленных вещей. Зачем добавлять данные в список, если можно сразу использовать "ответ" для команд "думать …" или перемещения? Однако если данные будут требоваться неоднократно, то надо сохранять их. Причем мы обошлись только двумя переменными типа список – "Первый игрок" и "Второй игрок, а не шестью, как если бы пользовались обычными переменными.
Чтобы приведенная выше программа правильно работала во второй и последующий разы, надо удалять элементы, помещенные в списки ранее.
Задание 1
Составьте скрипт заполнения списка десятью случайными числами. Используйте при этом цикл. У переменной списка должен быть установлен флажок для отображения его содержимого на сцене. Также перед тем, как будет сгенерировано и помещено в список очередное случайное число, необходимо подождать 1 секунду.
Задание 2
Заполните список пятью значениями, который вводит пользователь. Заставьте кота произнести одно из них. Выбор элемента списка должен быть случайным.
Задание 3 (сложное)
Создайте список под названием "Y". Добавьте в него значения -100, -35, 35 и 100. Они будут играть роль меняющейся координаты y спрайта. Запрограммируйте его движение зиг-загом. Это значит, что сначала герой идет на уровне -100, когда достигает края сцены, перепрыгивает на уровень -35, идет до другого края и т. д.
PDF-версия курса с ответами к заданиям