Перевод

Руководство для QuBot - скрипты как способ реализации логики ботов

Назад к видео

1. Вступление

Это видео является частью обучащих материалов по редактору QuBot от компании QuData.

Урок посвящён использованию скриптов в ботах на примере шаблона BlackJack.

Кроме стандартных визуальных элементов, рассматриваемых в других видео серии, редактор поддерживает реализацию логики ботов с помощью скриптов.

Скрипты - это мощный инструмент в руках разработчика. Они существенно расширяют возможности Ваших ботов, тем самым делая их более "умными" и конкурентноспособными.

2. Инициализация данных

Откроем бота BlackJack нажав на соответствующую кнопку пункта меню Templates.

Первым элементом шага MAIN является actions задающий начальные значения для слотов.

Единственным слотом, который будет изменятся в процессе игры, является MONEY - деньги игрока, остальные слоты: URL, PREFIX и CARDS - задаются один раз при запуске бота и не меняются. Слоты URL, PREFIX и CARDS предназначены для работы с колодой карт.

Разберём слоты подробнее.

Слот URL - это адрес сервера (включая путь внутри сервера), на котором хранятся изображения карт.

Слот PREFIX - это массив обозначений для масти карт.

Слот CARDS - это массив из объектов с двумя полями img - номер карты и pt - очки за карту, когда она в руке.

С помощью комбинации этих трёх слотов выводятся изображения всех 56 карт.

Обратим внимание на последнее свойство actions - это первый скрипт в боте. Скрипт использует функцию len для записи в слот COUNT размера массива CARDS.

Благодаря этому скрипту бот будет работать корректно даже в случае, если мы изменим количество карт в массиве CARDS.

После выполнения всех действий элемента actions игроку будет выведено сообщение, в котором он можен начать игру нажав на кнопку "Run".

3. Выбор ставки

Первым игровым шагом является SELECT BET, в котором игроку предлагается выбрать ставку в 10, 100, 1000 долларов или сыграть на все деньги.

Как и в случае с начальным экраном элемент actions располагается в самом верху шага. Рассмотрим его подробнее.

В первом скрипте для очков дилера (DEALER_SCORE) и игрока(PLAYER_SCORE) устанавливается значение 0, после чего раздаются карты.

Так как игрок не знает какие карты сейчас на руках, для него нет разницы в каком порядке будет выполнена раздача - до того как он выбрал ставку или после.

Скрипты раздачи карт для диллера и игрока различаются только слотами, которые в них используют.

Разберём подробнее скрипт диллера.

Первой функцией скрипта clear очищается массив DEALER_HAND, который представляет в памяти карты диллера. Очистка слота необходима для того, чтобы удалить карты диллера с прошлой партии.

Затем, для слота INDEX устанавливается значение два. Тем самым указывается количество карт, которое необходимо раздать.

Карты раздаются внутри цикла while, который выполняется до тех пор, пока количество карт для раздачи не уменьшится до 0.

Разберём подробнее алгоритм раздачи карт.

С первом блоке алгоритма необходимо выбрать карту и масть. Для этого в слоты CD и PR записываются случайные числа от нуля, до размера массива CARDS и PREFIX соответственно. Такое ограничение связано с тем, что невозможно взять элемент, вне массива.

После того как были получены индексы карты(CD) и масти(PR), в массив DEALER_HAND добавляеттся строка с полным именем карты. Полное имя карты получается путём сложения масти и имени карты из соответствующих массивов PREFIX и CARDS.

Обратите внимание что для массива PREFIX используется только обращение по индексу, так как это обычный массив строк, а для массива CARDS дополнительно используется обращение к полю img через точку.

Далее увеличивается количество очков дилера. Для этого происходит обращение к полю pt массива CARDS, полученное значение складывается с очками диллера.

Последним этапом уменьшается значение INDEX на 1, тем самым указывая сколько ещё карт осталось раздать.

После выполнения элемента actions игроку будет предложено выбрать ставку.

При клике на любую из кнопок в слот BET будет записана сумма ставки и произведён переход на игровой стол.

4. Вывод карт игроков

Вывод карт игроков разделён на два шага - вывод карт диллера (шаг DEALER TABLE) и вывод карт игрока (шаг TABLE).

Как и в предыдущих шагах, первым элементом шага является элемент actions.

В этом элементе выполняется проверка, хватает ли игроку денег для того, чтобы совершить ставку. Если нет, то происходит переход в шаг NO MONEY FOR BET. В котором игроку сообщается что у него недостаточно денег для ставки.

Если у игрока денег достаточно, то будут выведены очки и карты дилера.

Очки выводятся в поле text, а карты - во втором actions.

Для выводе карт, в цикле foreach, последовательно перебирается массив DEALER_HAND. Изображения в сообщение добавляются функцией image.

Для вывода изображения формируется ссылка на сервер, путём сложения URL, заданного на первом шаге, и имени карты, которое берёт из массива цикл foreach. Для того, чтобы изображения не были слишком большие или маленькие для каждого из них задаётся размер в 20% от ширины сообщения.

Последним элементом шага являетя таймер, который через одну секунду откроет шаг с картами игрока.

Вывод очков и карт игрока осуществляется аналогичным образом, а вот первый actions в шаге отличается.

В первом actions шага устанавливается значение clear - 0, это связано с тем, что карты игрока могут изменятся по одной и, чтобы не выводились карты дилера несколько раз, шаг с картами игрока должен удалятся.

После установки clear производится две проверки, в результате которых может закончится партия - очки игрока больше 21 (игрок проиграл) и очки игрока равны 21 (заканчивается партия)

5. Процесс игры

Во время партии, игрок имеет право взять карту, нажав кнопку Hit или закончить партию, нажав кнопку Stand.

Посмотрим как добавляется карта при нажатии кнопки Hit.

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

Согласно правилам игры, установленным в боте, туз может быть единицей в случае, количество очков игрока (или диллера) в сумме превышает 21.

Для соответствия этому правилу используется проверка, в результате которой 11 может превратиться в 1. Суть её сводится к тому что, если количество очков игрока больше 21, а последняя взятая карта это туз, то от очков игрока отнимает 10.

Согласно правилам работы ботов, после клика на кнопку Hit, в котором не указан step или goto, заново запускается текущий шаг, следовательно, проверка на конец партии будет осуществляться в первом actions.

Если игрок решил закончить партию и нажимает кнопку Stand. Будет осуществлён переход на логический шаг ADD DEALER CARDS, в котором диллер будет "набирать карты себе".

В шаге ADD DEALER CARDS есть только один actions.

Рассмотрим элемент подробнее.

Первой операцией элемента является проверка - достаточно ли диллеру карт.

Если у диллера очков больше 15 или если у него больше очков чем у игрока, то карты набирать не нужно. При таком исходе будет осуществлён переход на шаг проверки результатов.

Если у диллера карт недостаточно, то диллеру будет добавлена карта, затем выполнятся скрипты и проверка аналогичные тем, что выполняются при добавлении карты игроку.

После получения карты диллером происходит явный переход в текущий шаг с помощью goto.

6. Результат игры

Результат игры определяется в логическом шаге CHECK WIN.

В шаге есть только один actions. Рассмотрим его подробнее.

Внутри actions выполняется две проверки. Первая проверка на победу игрока - когда его очки больше чем у диллера (вариант с переполнением проверяется на шаге TABLE, в процессе игры).

Вторая проверка - на проигрыш. Когда у игрока очков меньше чем у диллера.

В случае, если игрок не выйграл и не проиграл объявляется ничья.

В результате каждой из проверок осуществляется переход на соответствиующий шаг (WIN, LOSE или PASS).

Эти шаги имеют одинаковую структуру (за исключением шага LOSE, который немного отличается).

Разбёрём структуру шага на примере WIN.

В первом actions шага WIN задаётся clear 1, это необходимо для того, чтобы удалить сообщение с картами диллера (сообщение с картами игрока удаляются на шаге TABLE).

После удаления сообщений выводятся итоговые карты диллера и игрока.

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

При нажатии на кнопку Play again деньги игрока увеличиваются на ставку и производится переход на шаг SELECT BET. (В случае ничьи деньги игрока не изменяются)

Посмотрим на отличия в шаге LOSE.

В шаге LOSE изменение денег игрока производится в отдельном actions, который располагается после всех визуальных элементов кроме кнопок.

Внутри actions проверяется остались ли деньги у игрока и, когда игровых денег нет, производится переход на шаг NO MONEY.

В шаге NO MONEY игроку выводится сообщение о том что денег .. больше .. нет.

7. Запрос контактов и новая игра

После проигрыша всех денег, чтобы начать новую и получить 1000 на игровой счёт игроку необходимо заполнить свои контактные данные.

Для опроса игрока используется шаблон бота Customer, которsй можно посмотреть нажав в меню на кнопку Templates -> Customer.

После окончания опроса игрок попадает на шаг CUSTOMER END, в котором его данные сохраняются в WordPress, а сам игрок может получить 1000 игровых денег нажав на кнопку Get 1000.

Завершение

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

Если у Вас будут возникать вопросы, Вы можете задавать их на форуме страницы плугина, или обратившись на прямую к специалистам компании QuData.

Желаем удачи в Вашем творчестве.

Назад к видео