Оглавление "Программирование для игр"

До этого момента мы рассматривали приложения для имитации поведения реальных объектов – игрального кубика, ведущего лото и ассистента при игре в дартс. Но помимо этого можно придумать механику для настольной игры, которую при всей своей простоте будет затруднительно реализовать на практике. Например, вероятность выпадения числа очков в произвольном диапазоне.

Возьмём для примера сражение с использованием двух наборов домино, как предлагал Митя, когда сила атаки приравнивалась количеству точек на передней половине доминошки. На практике редко бывает так, что удар всегда происходит с одинаковой силой. Для большего разнообразия и приближения к реальности количество точек на домино следует считать максимально возможной силой атаки, а на практике подбрасывать кубик для получения случайного значения от 1 до количества точек на половинке. Сколько кубиков для этого потребуется?

Для доминошки x|1 кубик не нужен. Атака всегда = 1. Для доминошки x|2 используем кубик d6 и 2 интервала (от 1-3 = 1, а 4-6 =2) Для доминошки x|3 используем кубик d6 и 3 интервала (от 1-2 =1, 3-4 =2, 5-6 = 3) Для доминошки x|4 используем кубик d20 и 5 интервалов Для доминошки x|5 используем кубик d20 и 4 интервала Для доминошки x|6 используем кубик d6

Ответ: два кубика.

Но можно обойтись и одним кубиком d6, но ввести в правила игры ситуацию промаха, когда выпавшее количество очков на кости превышает количество точек на половинке. Обоснование этого может быть таким:

Количество точек на половинке также относится и к мастерству рыцаря. Рыцарь с шестью точками – это воин уровня мастер, который всегда наносит урон. Но не все являются мастерами. Больше рыцарей среднего уровня, а чем ниже уровень мастерства, тем больше вероятность промаха или нанесения минимального урона.

Как быть, если сила атаки находится в разных диапазонах 2-5, 8-15, 13-24? В этом случае можно подогнать диапазоны под диапазон игральных кубиков, например, 2-5 – состоит из 4-х возможных значений, для которых использовать кубик d20: 1-5 = 2 6-10 = 3 11-15 = 4 16-20 = 5

Несложно, но в случае произвольных и больших диапазонов игра превратится в занятие по математике. В этом случае можно использовать электронные средства для упрощения расчетов.

Но одновременно с имитацией можно и упростить игру, как в случае с викториной. ”Говорилка” на смартфоне может имитировать ведущего викторины, а упрощение состоит в исключении необходимости распечатывать карточки с вопросами. Для этого можно создать виртуальный список вопросов, а можно воспользоваться информацией из уже созданных баз данных.

Создадим для примера викторину по географии на знание столиц государств. За правильный ответ игроку даётся одна фишка. Выигрывает тот, у кого по окончании игры будет больше фишек.

На предыдущих занятиях мы познакомились с компонентами синтезатора речи и голосового ввода, функциями получения случайных целых чисел и алгоритмом работы с уменьшаемым размером списка элементов. Всё это пригодится и для данного приложения, но для начала создадим простой вариант при помощи блоков. Воспользуемся бесплатным сервисом restcountries.eu, который даёт возможность получить информацию по странам и столицам.

Создайте новый проект в Thunkable X, добавьте в него кнопку и компонент для работы с web-сервисами Web Api. Также добавим в приложение “говорилку” Text To Speech. Для контроля получения корректных данных добавьте в проект текстовую область Label и область просмотра списка List Viewer. Контроль данных можно производить и при помощи одной текстовой области, но компонент List Viewer позволяет выбрать опцию из списка и произвести с ней дополнительные действия, например, воспроизвести, что удобно при отладке.

Некоторые разработчики предпочитают сразу делать приложение в дизайне. Когда он сделан, то очень сложно морально заставить себя “портить его” выводом на экран отладочной информации. И может получиться так, что через 2 месяца работы приложение сделано на 90% и тут разработчик узнаёт, что используемая им платформа элементарно не имеет требуемую функциональность. Интересно, а наше приложение можно будет реализовать в полном объёме?

Выбранный web-сервис имеет очень простой и понятный интерфейс команд. Для получения всех данных по странам введите в адресную строку браузера запрос https://restcountries.eu/rest/v2/all. Только после проверки работоспособности сервиса следует переходить к взаимодействию с ним в приложении, а не наоборот.

Ниже показан базовый блок.


В обработчике нажатия на кнопку создаётся GET-запрос, после чего происходит отображение ответа от web-сервиса или текст ошибки. Для надёжности позже добавим проверку статуса ответа status. Чаще всего успешный запрос имеет статус 200, но бывают и исключения.

Для викторины нам не нужна полная информация по странам. Достаточно сохранить в списке пару - название страны и столицы. Существует разные способы хранить данные – в переменной с разделителями, в списке, в параллельных списках, в словаре и др. Каждый вариант имеет свои преимущества и недостатки. Для простоты воспользуемся списком строк.

Как правило, сервисы возвращают ответ в виде текста в формате JSON, который можно преобразовать в объект или список объектов. Из списка объектов и будет получен интересующий нас список строк, в котором название страны и столицы будут идти через разделитель. Для этого нужно в цикле пройтись по всему списку полученных объектов, указать названия свойств и добавить их значения в список, который затем отобразить для контроля на экране в компоненте ListViewer.

Распишем задачу по шагам.

1) Проверить статус ответа. Если он равен 200, то перейти к следующему шагу.

2) Из содержимого в формате JSON получить список объектов.

3) Создать пустой список строк.

4) Создать цикл по списку объектов и в нём добавлять в список строк пару ”Название страны,столица”.

5) Отобразить список строк на экране.

Теперь можно переходить к добавлению нужных блоков в функцию согласно этим понятным инструкциям.



Если кто-то скажет, что это не программирование, а Лего из разноцветных блоков, то предложите ему написать для Android и iOS аналогичное по функциональности приложение и не забудьте засечь время. Кто сказал, что программирование должно быть сложным? При помощи блоков можно реализовать не всё, но главный и основной недостаток визуального программирования всего один - надёжность. А какой главный недостаток программирования кодом? Сложность. В мире электроники уже давно перешли на компоненты для решения задач, в программировании до сих пор учат программированию.

Результат работы проекта показан ниже.

А это кто такой красивый? Это окно эмулятора BlueStacks 4 с версией Android 7. Отличный помощник при отладке.

Проект можно открыть по ссылке https://x.thunkable.com/copy/fadbc3e6ae79eb352bbb3640d13a4e75

На следующем занятии мы продолжим работу над викториной.