Вопросы:
· Создание и редактирование списков.
· Применение списков.
В быту мы постоянно сталкиваемся с разными списками, например список учеников в классе или же список покупок в магазине. В Scratch тоже есть списки. Списком в Scratch называется упорядоченный набор нумерованных значений. Элементами списка называются экземпляры этих значений. Каждый элемент списка имеет свой порядковый номер, который называется индексом. По сути, каждый элемент списка представляет собой переменную. Спрайт может обратиться к элементу списка, используя название списка и индекс элемента.
Рассмотрим списки в Scratch. Для этого в категории «Данные» нажмём на кнопку «Создать список». На экране появилось окно, в котором нам предлагают назвать новый список. Назовём его «Животные» и сделаем доступным для всех спрайтов. Мы создали список «Животные», в категории «Данные» стали доступны новые блоки, а на сцене появилось окошко списка. Как и в случае с переменной, его можно вывести и спрятать, устанавливая и убирая птичку рядом с сенсором списка. Перетаскивая правый нижний угол окошка, мы можем менять его размер.
С помощью этого окошка можно добавлять в список новые элементы. Для этого нажмём на кнопку с плюсом в левом нижнем углу окошка. В окошке появилась строка, в которой можно ввести значение элемента с индексом один. Введём значение «Слон» и нажмём на клавишу Enter. Появилась строка, в которой можно ввести значение второго элемента. Назовём его «Лев» и снова нажмём Enter. Когда мы решим закончить ввод, мы можем нажать на крестик рядом с очередной строкой или на пустом месте сцены. Также элементы в список можно добавлять с помощью блока «Добавить». Введём в его поле значение «Кошка» и щёлкнем по блоку левой кнопкой мыши. Новое значение было добавлено в конец списка. Точно так же добавим в список значение «Собака».
С помощью блока «Удалить» можно удалить из списка элемент с заданным номером. Удалим из списка элемент «Кошка». Он находится в списке под номером 3. Элемент был действительно удалён. При этом на его место переместился элемент «Собака» с четвёртой позиции. Так при удалении элементов из списка элементы, следующие за ними, смещаются, заполняя пустые позиции.
С помощью блока «Вставить в...» можно добавить новый элемент в список на любую позицию. Перенесём блок в рабочее поле спрайта. Добавим элемент «Кошка» в список «Животные» на позицию с индексом 3. Щёлкнем по блоку. Действительно, на третью позицию был добавлен элемент «Кошка». При этом элемент «Собака», находившийся на третьей позиции, переместился на четвёртую. Так при вставке элемента на позицию элементы списка, следующие за ним, смещаются вперёд, освобождая заданную позицию для нового элемента.
Блок «Заменить элемент» позволяет изменить значение указанного элемента списка. Перенесём этот блок в рабочее поле спрайта. Установим для второго элемента списка значение «Енот». Щёлкнем левой кнопкой мыши по блоку. Элемент «Лев», находящийся на второй позиции списка, изменил значение на «Енот».
Следующие два блока – сенсоры. Блок «Элемент» возвращает значение с указанным индексом из указанного списка. Если мы зададим индекс два и щёлкнем по блоку, то он вернёт значение второго элемента в списке, то есть «Енот». Блок «Длина списка» возвращает длину указанного списка. Длиной списка называется количество элементов в нём. Щёлкнем по блоку. Он вернул число четыре. Действительно, в нашем списке четыре элемента.
Блок «Список содержит» – датчик. Он позволяет проверить, есть ли в списке элемент с указанным значением. Введём в датчик значение «Слон» и щёлкнем по нему левой кнопкой мыши. Блок вернул значение «true», то есть «Истина». Теперь введём в датчик значение, которого нет в списке, например «Лев», и снова щёлкнем по датчику левой кнопкой мыши. Он вернул значение «false», то есть «Ложь». Блоки «Показать список» и «Скрыть список» – команды. Они позволяют показать и спрятать окошко списка в процессе выполнения программы.
Мы изучили блоки для работы со списками. Используем их в нашем новом проекте. Сделаем шар с предсказаниями. Удалим со сцены спрайт Царапки, он в этом проекте не потребуется. Шар с предсказаниями отвечает на вопросы, ответ на которые должен быть «да» или «нет». Человек произносит свой вопрос вслух, трясёт шар и получает предсказание. Добавим на сцену спрайт шара. Загрузим его из нашей рабочей папки из файла «Шар». Установим нужный размер шара и с помощью соответствующего блока из категории «Движение» поместим его в центр сцены.
Теперь составим скрипт для шара. Пусть он запускается, когда пользователь щёлкнет по шару. То есть блоком запуска будет «Когда спрайт нажат». Сперва сделаем, чтобы шар трясся. Для тряски зададим перемещение шара между двумя точками за короткое время, повторяющееся несколько раз. Добавим в скрипт цикл «Повторить». Количество повторений укажем равным трём. Так шар тряхнёт 3 раза. Пусть шар перемещается между точками (0; 0) и (10; 10). Для этого добавим в цикл 2 блока «Плыть», в которых укажем соответствующие точки. Чтобы перемещение было быстрым, зададим его время равным 0,1 секунды.
Запустим режим презентации и щёлкнем по шару. Шар несколько раз встряхнуло. Такая анимация тряски нас устроит. Дальше нужно позаботиться о предсказаниях. Для этого в категории «Данные» удалим список «Животные» и создадим новый список, который назовём «Предсказания». Добавим в список элементы. Это будут предсказания. Придумаем несколько, например «Да», «Нет», «Никогда», «Не сейчас», «Совсем скоро» и «Не могу ответить». Так у нас получилось шесть предсказаний. Спрячем список.
Дальше добавим в скрипт блок для предсказаний. Используем для этого блок «Сказать» из категории «Внешность». Установим его после цикла. Шар должен сказать одну из фраз, которые хранятся в списке «Предсказания». Для этого из категории «Данные» используем сенсор «Элемент». Установим его в блок «Сказать». В сенсоре «Элемент» указан индекс конкретного элемента списка, а нам нужно, чтобы этот элемент был случайным. Для этого используем датчик случайных чисел, который будет генерировать случайное число от 1 до 6, по количеству элементов списка. Скроем окно списка «Предсказания».
Перейдём в режим презентации и щёлкнем левой кнопкой мыши по шару. Он выдал одно из случайных предсказаний. Щёлкнем по шару ещё раз. Теперь шар трясёт вместе со старым предсказанием. Исправим это. Добавим сразу после запуска скрипта пустой блок «Сказать». Снова в режиме презентации протестируем шар. Теперь при вызове нового предсказания старое исчезает сразу.
Шар с предсказаниями готов, но у него есть одна проблема. Вновь выведем на сцену список предсказаний. Добавим в него новое предсказание, например «Духи молчат», но это предсказание не будет выводиться. Дело в том, что в качестве индекса предсказания выступает случайное число от 1 до 6, а у нового предсказания индекс 7. Нужно просто изменить число в датчике случайных чисел, но так его придётся менять каждый раз при добавлении новых предсказаний. Однако мы можем это изменить, и при добавлении новых предсказаний в список они сразу будут работать. Вспомним про сенсор длины списка. Установим его в датчик случайных чисел. Теперь датчик будет выдавать случайное число от 1 до количества элементов в списке. Так может быть получено любое из предсказаний списка.
Снова протестируем шар в режиме презентации. Несколько раз щёлкнем по нему. Он выдаёт разные предсказания. Задача решена. Сохраним проект в нашей рабочей папке под именем «Шар с предсказаниями».
Рассмотрим ещё одно применение списков. Загрузим из нашей рабочей папки проект «Путешествие». В нём маркер перемещается по карте, рисуя маршрут путешествия героев романа «Вокруг света за 80 дней». Рассмотрим в нём скрипт маркера. Он довольно длинный, но используя списки и переменные мы можем его немного сократить. Посмотрим, как это можно сделать. Создадим новый список, который назовём x. В нём будем хранить координаты x всех городов, начиная с Бриндизи и заканчивая Лондоном в порядке их посещения. Только вместо координаты города Сан-Франциско зададим координату крайнего правого положения маркера, то есть двести сорок. Точно так же создадим список y, в котором будем хранить координаты y тех же точек, что и в списке x. Дальше создадим список t. В нём будем хранить время перемещения в каждую точку, координаты которой заданы в списках x и y. Создадим список «Города», в котором будем хранить названия городов по порядку от Лондона до Нью-Йорка. После того как мы сохранили данные в списках, сделаем так, чтобы списки не отображались на экране.
Обратим внимание на основной скрипт маркера. Большую часть скрипта повторяются одни и те же три команды: передать сообщение с названием города, подождать половину секунды и переместиться в следующий город. Как мы знаем, такое повторение команд можно заменить циклом. Так и поступим. Переместим блок «Опустить перо». Установим его сразу после блока «Показаться». Отсоединим часть скрипта, начиная с блока «Передать “Бриндизи”». Последние 3 команды поместим в цикл «Повторить».
Теперь изменим содержимое цикла так, чтобы команды брали данные из списков. Для этого создадим переменную, которую назовём «Счётчик». Перед циклом зададим ей значение один. Эта переменная будет хранить индекс используемых элементов списков. Так, в первом блоке цикла мы будем передавать не «Лондон», а сообщение, которое хранится в элементе списка «Города» с индексом, равным значению переменной «Счётчик». Время ожидания изменим на половину секунды, как и в других городах. А блок «Плыть» будет брать данные из соответствующих элементов списков x, y и t. После того как мы посетили очередной город, значение счётчика увеличим на 1 для перехода к данным следующего города.
Этот цикл повторится девять раз, по количеству городов, до правого крайнего положения маркера. Дальше маркер должен поднять перо, переместиться в левый край сцены, опустить перо и дойти до города «Сан-Франциско». Соответствующие блоки возьмём из отсоединённой части скрипта. Дальше мы ещё дважды повторим цикл для городов Сан-Франциско и Нью-Йорк, а затем передадим сообщение «Конец» для вывода конечной заставки. Уберём лишние части скриптов.
Запустим проект в режиме презентации. Всё работает, как и раньше, маркер перемещается по городам, над которыми высвечиваются их названия. При этом скрипт маркера стал значительно короче. Сохраним проект.
Мы узнали:
· Списком называется упорядоченный набор нумерованных значений, а элементами списка – экземпляры этих значений.
· Индексом элемента списка называется его порядковый номер.
· Длина списка – это количество его элементов.