В этом разделе вы можите выкладывать свои сценарии ИИ. Самые лучшие будут включены в комплект с ботом.
С обновлением конструктора ИИ, будет обновляться данная тема.
Язык написания сценариев ИИ.
Язык написания сценариев ИИ не сложный. А вот запомнить название всех переменных не просто:). Информация представлена в справочном виде.
Синтаксис.
ВАЖНО! Сохраняйте файл со скриптом в кодировке Юникод.
Язык чувствителен к регистру.( Переменные _ААА и _ааа , разные)Использовать в имени переменной можно буквы и цифры.
Переменные начинаются с “_”, делятся на пользовательские и системные. Значение пользовательских переменных можно изменять и считывать, а системных только считывать. Все переменные имеют целый тип. Т.е являются целым числом( 1, 3, -8 , 0 и т.д). Все логические системные переменные/функции возвращают 1 в случаи истины, и 0 в случаи лжи. У некоторых системных переменных есть свойства, доступ к ним идет через “.”.
Перед выражениями можно ставить любое число пробелов и знаков табуляции (отступов).
“/” – комментарии, должен идти в начале строки
Функции начинаются с “~” . Свои пользователи создавать не могут.
Доступны операторы(идут в порядке приоритета):
() – скобки, определяют приоритет обработки
Арифмитические(возвращают целые числа):
*, / - умножить и поделить
+, - - сложить и вычесть
Сравнения(возращают 1 или 0 в случаи: истины или лжи):
<, > - меньше , больше
= - равенство
Логические(возвращают 1 или 0 в случаи: истины или лжи):
|,& - ИЛИ , И
Присвоение значения переменной осуществляется через пробел. Расчет идет слева на право.
Примеры операций с переменными:
_А 1
// _А =1
_Б _А + -2
/ _Б = -1
_С _Б = _А
/ _С = 0
_С ( _С > _Б )
/ _С = 1
_А _С | 0
/_A = 1
Скрипт ИИ разделен на разделы:
Магия:
Здесь вы задаете параметры заклинания. Очень важна позиция каждой строки, переставлять нельзя. Каждое новое заклинание начинается со слова “Магия:”
Переменные:
Здесь вы объявляете свои переменные(пользовательские). Для каждой переменной должно быть задано значение по умолчанию.
Успешное_считывание_камней:
Здесь происходит обработка кода после успешного считывания ваших/врага жизней и камней.
Успешное_считывание_поля:
Здесь происходит обработка кода после успешного считывания ваших/врага жизней и камней, а также поля.
Константы содержащие значение настроек бота, не изменяются во время работы бота:
_Пуха_Позиция
_Скилл1_Позиция
_Скилл1_Красных
_Скилл1_Синих
_Скилл1_Зеленых
_Скилл1_Минимальный_Урон
_Уровень
_Базовый_Урон
_Урон
Переменные содержащие вычисляемые значения, обновляются ботом:
Был ли предыдущий ход ваш(пока дорабатывается, использование не рекомендуется)
_Ход_Продолжен
Количество камней и жизней у вас и противника:
_Красных_Моих
_Синих_Моих
_Зеленых_Моих
_Красных_Врага
_Синих_Врага
_Зеленых_Врага
_Жизни_В_%_Моих
_Жизни_В_%_Врага
Сумма камней/черепов на поле без учета их уровня и с учетом:
_Черепов_На_Поле
_Красных_На_Поле
_Синих_На_Поле
_Зеленых_На_Поле
_Черепов_На_Поле_С_Ур
_Красных_На_Поле_С_Ур
_Синих_На_Поле_С_Ур
_Зеленых_На_Поле_С_Ур
Количество вариантов ходов:
_Вариантов_Ходов
Выбранный вариант хода, отсчет начинаетя от 0:
_Ход[{индекс}]
Свойства хода(соответствуют столбцам в расчетчике поля):
С какого сложения стола собирается 4-ка или более линия камней/черепов. Отсчет начинается с 1.
Уровень_Сложности
Координаты ячеек куда нужно кликнуть, что бы сходит. Для Детонации и Сдвига учитывается только первая. За начало принимается левый верхний угол поля, отсчет идет от 0. Первый параметр по горизонтали второй по вертикали.
Ячейка_11
Ячейка_12
Ячейка_21
Ячейка_22
Число сложенных не пересекающихся линий черепов, при включенной галке “ВС” учитываются и линии камней.
Атак
Сумма собираемых камней этим ходом:
Черепов_Соберется
Красных_Соберется
Синих_Соберется
Зеленых_Соберется
Черепов_С_Ур_Соберется
Красных_С_Ур_Соберется
Синих_С_Ур_Соберется
Зеленых_С_Ур_Соберется
Сумма собираемых линий разной длины этим ходом:
Число_3
Число_4
Число_5
Число_6
Какая линия черепов по длине максимум собралась:
Возвращаемые значения:
4 – Четыре или больше
3 – Тройка
0 – Линий черепов нет.
Комбо_Черепов
Что можно сложить на поле, после этого хода:
Возвращаемые значения(старшие могут включать младших):
0 – Конец, т.е стол разобран
1 – Тройки камней
2 – Тройки черепов
3 – Четверки и более камней
4 – Четверки и более черепов
Итог
Максимальная сумма камней + черепов которое можно собрать на поле, после этого хода и их сумма с учетом уровня камней.
Макс_Возм_Сбор_Без_Ур
Макс_Возм_Сбор_С_Ур
Вид детонации, зависит от количества и длины сложенных линий черепов:
Возвращаемые значения:
0 – Пусто, нельзя сложить не одну линию черепов
1 – Сложена четверка черепов, но при активации не задет череп
2 – Сложена четверка черепов, при активации задет череп
3 – Сложена тройка черепов, при активации задет череп
Вид_Детонации
Примерный урон от Властелина Стихий
Урон_От_ВС
Сумма камней/черепов на поле, после хода, без учета их уровня и с учетом:
Черепов_Без_Уровня_После
Красных_Без_Уровня_После
Синих_Без_Уровня_После
Зеленых_Без_Уровня_После
Черепов_С_Уровня_После
Красных_С_Уровня_После
Синих_С_Уровня_После
Зеленых_С_Уровня_После
Функции:
~Сортировка {направление сортировки} {столбцы для сортировки}
Сортирует варианты ходов по различным свойствам.
Краткое название свойств: 6, 5, 4 , 3, К, С, З, Ч, КУ, СУ, ЗУ, ЧУ, А, Вид_Детонации, Урон_ВС, Итог, СХ, МСУ, МС
Пример
~Сортировка 1 6 5 4 С
/ Все ходы отсортируются от большого к меньшему по столбцам : 6, 5, 4, С
/индексы их изменяться
~Трассировка {Строка или выражение}
Позволяет сохранить в файл log.txt переданное значение или строку
Пример
~Трассировка “Привет мир!
/Сохранит: Привет мир!
~Трассировка 2+2
/Сохранит: 4
~Расчитать_Поле
~Расчитать_Детонацию
~Расчитать_Сдвиг
Заполняет Ход вариантами ходов
~Расчитать_Ритуал
~Расчитать_АА
То же самое, но только один вариант хода
~Выход_Из_Обработки
Позволяет пропустить раздел “Успешное_считывание_поля:” при работе скрипта в
“Успешное_считывание_поля:”
~Спать {Время в миллисекундах}
Останавливает на указанное время работу бота
Пример
~Спать 3000
/Бот не работает 3 сек
~Клик {позиция заклинания или позиция Ячейки для клика(указывается двумя числами)}
Кликает по заклинанию или полю
Пример
~Клик 1
/Кликает по первому заклинанию (считать сверху)
~Клик 2 3
/Кликает по ячейки на поле, 3 по горизонтали, 4 по вертикали. Отсчитывать от левого верхнего угла.
~Клик_по_лотку {позиция эля в лотке от 1 до 9}
Кликать по элям в лотке
Пример:
~Клик_по_лотку 3
/клик по 3 -му в списке элю
~Случайное_Число {Верхний предел} {Переменная для записи}
Записывает в переменную число от 0 до {Верхний предел}-1
Пример
~Случайное_Число 100 _А
/В _А будет записано значение от 0 до 99
~Пауза_Боя {Время в миллисекундах}
Блокирует режим игры на поле на указанное время.
Пример
~Пауза_Боя 5000
/Бот попытается сыграть на поле, только через 5 сек.
Операторы:
/ - комментарий
ЕСЛИ {Выражение}
{
}
ИНАЧЕ
{
}
Если оператор ЕСЛИ получает 1, то интерпретатор скрипта заходит в скобки,если 0 то пропускает их содержимое, но заходит в скобки ИНАЧЕ если он есть
Пример 1:
ЕСЛИ 1
{
/сюда зайдет
}
ИНАЧЕ
{
/Сюда не зайдет
}
Пример 2:
ЕСЛИ 0 > 1
{
/не зайдет
}
ИДТИ {Указатель}
: {Указатель}
Оператор идти переводит интерпретатор на стоку, где стоит указатель. В сочетании с ЕСЛИ можно сделать различные циклы. А также имитировать рекурсивные функции.
Пример “цикл с счетчиком”:
_И 0
:цикл
_И _И +1
/некоторое выражение
/оно выполнится 9 раз
ЕСЛИ _И < 10
{
ИДТИ цикл
}
Пример “цикл с предусловием”:
_И 0
:цикл
ЕСЛИ _И < 10
{
/некоторое выражение
/оно выполнится 9 раз
_И _И +1
ИДТИ цикл
}
Вот и все:)
Пример рабочего скрипта:
//Раздел инициализации
/Нельза вставлять строки в разделе магии
/Сначала называем магию, потом задаем значение
/ для ее свойств, можно использовать выражения
Магия:
_ББ
Позиция _Скилл1_Позиция
Камни:
Красные _Скилл1_Красных
Синие _Скилл1_Синих
Зеленые _Скилл1_Зеленых
Магия:
_Выстрел
Позиция _Пуха_Позиция
Камни:
Красные 3
Синие 3
Зеленые 3
/Дальше никаких ограничений по вставке коментариев нет
/Все переменные целые числа
Переменные:
_i 0
/Каждой переменной нужно присваивать значение
_Выбор 0
_Случ 0
_Кр 0
_Син 0
_Зел 0
//Все события происходят, только если ваш ход
//Ваши камни(жизни) и врага распознаны
Успешное_считывание_камней:
{
/Между ЕСЛИ и условием обязателен пробел
/Условие для ЕСЛИ должно быть записано в одну строку
/Для более компактной записи можно
/использовать переменные посредники
ЕСЛИ ( ((_Красных_Моих > _ББ.Красные)| (_Красных_Моих = _ББ.Красные)) & ((_Синих_Моих > _ББ.Синие)| (_Синих_Моих = _ББ.Синие)) & ((_Зеленых_Моих > _ББ.Зеленые)| (_Зеленых_Моих = _ББ.Зеленые)))
{
/в функциях с одним параметром можно
/использовать выражения
~Клик _ББ.Позиция
/в функциях с несколькими параметрами нельзя
/использовать выражения
/Помните, что в бою бот считывает экран
/раз в 200 миллисекунд(когда его ход)
/в остальных раз в 500 миллисекунд(когда его ход)
~Случайное_Число 500 _Случ
/В переменную можно записывать ее же значение
_Случ _Случ + 500
~Пауза_Боя _Случ
~Выход_Из_Обработки
}
}
//Распознаны камни(жизни)свои и врага, а также поле
Успешное_считывание_поля:
{
/Сортирум по убыванию
/Переменные хода получают новый индекс
~Сортировка 1 6 5 4 Ч
/Цикл со счетчиком
_i -1
:начало
_i _i + 1
/ помните вариаты хода начинаются с 0
/ а значит последний из них
/всегда имеет номер равный ( _Вариантов_Ходов – 1 )
ЕСЛИ _i < _Вариантов_Ходов
{
/Разные операторы (=, +, * , & и т.д) имеют
/разный приоритет, но если вы не уверены
/что посчитает первым
/используйте скобки
ЕСЛИ _Ход[_i].Число_6 > 0 | _Ход[_i].Число_5 > 0 | _Ход[_i].Число_4 > 0
{
/Здесь оператор ИДТИ выходит
/из цикла как только находит
/нужный вариант хода
_Выбор _i
ИДТИ конец
}
ИНАЧЕ
{
ЕСЛИ ( _Ход[_i].Итог = 0)
{
_Выбор _i
ИДТИ конец
}
}
/Если подходящих так и не нашли
/то выбираем самый первый в списке
/Вообще то это условие лишнее
/переменная _Выбор изначально имеет значение 0
ЕСЛИ _i = (_Вариантов_Ходов - 1 )
{
_Выбор 0
ИДТИ конец
}
ИДТИ начало
}
:конец
/Что бы пауза между ходами была разной
/Используем функцию случайного числа
~Случайное_Число 3000 _Случ
_Случ _Случ + 4000
~Пауза_Боя _Случ
/Кликаем по ячейкам что указаны
/в выбранам нами вариатом хода
~Клик _Ход[_Выбор].Ячейка_11 _Ход[_Выбор].Ячейка_12
/Т.к. игра не успевает оброботать два клика сразу,
/Между ними нужно делать паузу
/трети секунды вполне хватает
~Спать 300
~Клик _Ход[_Выбор].Ячейка_21 _Ход[_Выбор].Ячейка_22
}