"Информатика (в 2 частях)", Павлов Д.И., Полежаева О.А., Коробкова Л.Н. и др./ Под ред. Горячева А.В.
Игра «Поймать и посчитать!» показывает, как программа реагирует на события и хранит результат действий игрока. Один объект ловит другой, а переменная-счётчик увеличивается после каждого успешного касания. Чтобы игра продолжалась, движение и проверка столкновения помещаются в повторяющийся алгоритм. Случайные координаты делают появление предметов непредсказуемым, поэтому каждый запуск может проходить немного по-разному.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Событие — действие или ситуация, после которых запускается определённая часть программы. Например, событием может быть нажатие клавиши или касание объектов. События нужны, чтобы программа реагировала на действия игрока и изменения на сцене.
Переменная — именованная ячейка памяти, в которой программа хранит изменяющееся значение. У переменной есть имя, например «счёт», и текущее значение. Она нужна, чтобы программа могла помнить результат игры, координату или время.
Счётчик — переменная, значение которой изменяется при каждом наступлении нужного события. В игре счётчик увеличивается после пойманного предмета. С его помощью на сцене можно показывать текущий результат игрока.
Датчик касания — команда, проверяющая, соприкасаются ли два объекта на сцене. Она возвращает ответ «да» или «нет». Такая проверка помогает понять, поймал ли ловящий объект движущийся предмет.
Случайное число — число, выбранное программой из заданного диапазона для непредсказуемого поведения объекта. Например, оно задаёт новую горизонтальную координату яблока. Благодаря этому расположение предметов меняется от запуска к запуску.
Игру удобно разделить на сцену, ловящий объект и движущийся предмет. Ловящий объект получает команды игрока, предмет выполняет собственный алгоритм, а сцена показывает их взаимодействие и счёт. Такое разделение нужно потому, что каждому объекту проще назначить только те действия, которые относятся именно к нему.
Для количества пойманных предметов нужна переменная, потому что результат меняется во время игры и должен сохраняться между проверками. В начале ей задают значение 0, иначе программа может использовать старое число. После успешного касания счёт увеличивают на единицу, ведь каждое попадание добавляет ровно один предмет.
Постоянное движение организуют циклом, поскольку предмет должен перемещаться не один раз, а до конца игры. Внутри цикла после очередного шага проверяют датчиком, коснулся ли предмет ловящего объекта. Если проверка выполняется регулярно, программа не пропустит быстрое попадание.
После касания сначала изменяют счёт, а затем переводят предмет в новое состояние. Его можно вернуть наверх сцены или переместить в случайную точку, чтобы он снова стал целью. Это нужно и для продолжения игры, и для защиты от многократного подсчёта одного и того же столкновения.
Случайное число выбирают в подходящем диапазоне координат, например по горизонтали между левой и правой границами сцены. Иногда случайным делают и время появления или скорость движения. Поэтому игрок не может выучить единственный маршрут и каждый раз сталкивается с немного новой ситуацией.
Таблица показывает, какую роль играет каждый элемент программы. По столбцу «Когда используется» можно восстановить порядок действий, а по столбцу «Результат» — проверить, что должно произойти после команды. Если результат не совпал с таблицей, ищите ошибку в условии или цикле.
| Элемент | Что хранит или выполняет | Когда используется | Результат |
|---|---|---|---|
| Ловящий объект | Перемещается по командам игрока | При попытке поймать предмет | Изменяет своё положение |
| Движущийся предмет | Перемещается по заданному алгоритму | Во время игры | Появляется в новой позиции или продолжает движение |
| Переменная-счётчик | Хранит количество пойманных предметов | После успешного касания | Увеличивается на единицу |
| Условие касания | Проверяет взаимодействие объектов | Внутри повторяющегося алгоритма | Запускает обработку пойманного предмета |
| Случайное число | Выбирает непредсказуемое значение | При выборе новой позиции или скорости | Игра становится разнообразнее |
Условие. Игрок двигает корзину и ловит яблоки, падающие сверху. На экране должно отображаться число пойманных яблок. Значит, нужно одновременно управлять корзиной, двигать яблоко и хранить результат.
Ответ. Игра работает как взаимодействие двух объектов. Корзина меняет положение по командам игрока, а яблоко постоянно движется вниз. Счёт изменяется только в момент успешного касания.
Условие. После каждого пойманного предмета он должен появляться наверху. Его горизонтальная координата должна выбираться заново и случайно. Так одно попадание не повторяется, а следующая цель оказывается в другом месте.
Ответ. Проверка, подсчёт и перемещение должны находиться внутри одной обработки касания. Случайную координату выбирают после попадания, поэтому новое яблоко не повторяет прежнюю позицию. Затем цикл снова запускает его движение.
Условие. За 30 секунд игрок должен поймать как можно больше предметов. Программа обязана одновременно двигать предметы, считать касания и следить за временем. После окончания времени дальнейшие действия нужно прекратить.
Ответ. Основной цикл ограничивается таймером, а внутри него обрабатываются движение и попадания. Так программа не считает события после завершения игры. На экране остаётся итоговое количество пойманных предметов.
Переменную-счётчик не обнуляют в начале игры, потому что считают её значение постоянным. В результате новый запуск продолжается со старого результата. Проверьте первую часть алгоритма: команда присваивания 0 должна выполняться до начала движения.
Изменение счётчика помещают вне повторяющегося алгоритма, поэтому значение меняется только один раз. Такая ошибка появляется, когда команда увеличения не связана с условием касания. Проверьте, находится ли она внутри ветвления, которое выполняется при каждом попадании.
Иногда касание проверяют, но предмет после этого не перемещают. Пока объекты соприкасаются, следующий проход цикла снова прибавляет единицу. Убедитесь, что после подсчёта предмет возвращается наверх, исчезает или меняет состояние.
Случайное значение выбирают один раз до запуска нужного цикла, поэтому предметы появляются в одной позиции. Причина в том, что случайная команда больше не выполняется. Проверьте, стоит ли она внутри обработки нового появления предмета.
До этой темы нужно знать команды движения, повторения и ветвления, координаты объектов и запуск программы по событию. Без них трудно задать управление, постоянное перемещение и реакцию на касание. Новая тема объединяет эти приёмы в одну работающую игру.
Полученные навыки пригодятся при создании интерактивных игр, симуляций и тестов с подсчётом результатов. Та же схема используется в программах, которые реагируют на действия пользователя и хранят изменяющиеся данные. Меняются объекты и условия, но принцип обработки событий остаётся похожим.
Почему счётчик нужно обнулять перед началом игры?
Чтобы каждая новая игра начиналась с нулевого результата. Если не задать начальное значение, программа может продолжить считать с числа, оставшегося после прошлого запуска.
Почему одно касание иногда засчитывается несколько раз?
Предмет может долго оставаться внутри ловящего объекта, а цикл за это время несколько раз обнаружит касание. После засчитывания нужно переместить предмет или изменить его состояние.
Можно ли считать пойманные предметы без переменной?
Постоянно хранить и показывать изменяющийся результат без переменной нельзя. Можно лишь вывести отдельные сообщения, но программа не сможет надёжно помнить общее количество пойманных предметов.
Зачем в игре нужны случайные координаты?
Они позволяют выбирать новое место появления предмета не по одному и тому же шаблону. Благодаря этому игрок не может заранее знать, где появится следующий предмет.
Как сделать так, чтобы игра завершалась по времени или по достижении нужного счёта?
Нужно хранить время или проверять его с помощью таймера, а также задать условие окончания. Цикл продолжается, пока время не вышло и нужный счёт не достигнут, после чего движение и обработка касаний останавливаются.
26. Поймать и посчитать!