
- •Введение.
- •1 Подходы к реализации ai в логических играх.
- •1.1 Понятие поиска.
- •1.2 Позиционная игра.
- •1.3 Подходы к решению задач выбора хода в позиционных играх.
- •1.4 Особенности игры нарды.
- •1.5 Правила игры в нарды.
- •1. 6 Оценочная функция
- •1.7 Самообучение
- •1.8 Нетранзитивность игр
- •1.9 Обзор литературы и существующих программ.
- •1.10 Игровые деревья.
- •1.11 Дерево игры в нарды
- •2 Построение эвристических оценочных функций.
- •2.1 Выделение параметров.
- •2.2 Определение более сильного игрока из двух.
- •2.3 Настройка весовых коэффициентов.
- •2.4 Линейная модель из 3-х параметров. Вид поверхности.
- •2.5 Таблицы вероятностей.
- •2.6 Снижение размерности. Гипергаммон.
- •2.7 Разделение игрового процесса на фазы.
- •3 Построение оценочных функций на основе нейронных сетей.
- •3.1 Теория нейронных сетей.
- •3.2 Использование нейронных сетей в качестве оценочной функции.
- •3.3 Использование MatLab для обучения нейронных сетей.
- •3.4 Экспериментальные данные.
- •4 Реализация версии для мобильных устройств.
- •4.1 Особенности программирования портативных устройств.
- •4.1.1 Размер экрана.
- •4.1.2 Быстрый отклик.
- •4.1.3 Ввод данных.
- •4.1.4 Питание.
- •4.1.5 Память.
- •4.1.6 Файловая система.
- •4.2 Выбор средств разработки.
- •4.3 Реализация игры.
- •Использованные классы.
- •Заключение.
- •Список литературы.
4.3 Реализация игры.
Итогом работы стала игровая программа нарды для мобильных устройств с поддержкой технологии Java. Игра обладает богатой графикой и набором особенностей, позволяющих выделить именно эту реализацию среди подобных игр конкурентов. К этим особенностям можно отнести возможности игры с историческими личностями, имеющими собственные стили игры, игры в турнирах, ведение рейтингов. Скриншоты из игры представлены на рисунке 3.
Для управления игрой используются переменные: private byte gameState, private int currentColor, private int moveNumber.
moveNumber – это номер хода. currentColor – цвет игрока, выполняющего ход(чёрный или белый). gameState может принимать значения:
byte GAMEOVER=1;//игра кончена
byte INPLAYERMOVE=3;//приложение ожидает выполнения хода игрока
byte INCOMPUTERMOVE=4;//приложение ожидает выполнения хода компьютера
byte MOVECOMPLETED=5;//ход выполнен
Переменная gameState используется для управления событиями и определения, какие процессы имеют место в данный момент. К примеру, если пользователь хочет поставить фишку, он может это сделать только если сейчас его очередь.
Теперь представляю вашему вниманию структурную схему игры:
рис 5. Структурная схема игры.
Функция StartTurn() вызывается в начале игры и после выполненного хода любым из игроков. Она отвечает за определение игровой ситуации и подготовку следующего хода.
Прежде всего она проверяет, имеет ли текущий игрок хоть одну клетку для хода. Если нет, она переключает ход на другого игрока и проверяет, имеет ли другой игрок клетки для хода. Когда ни один игрок не может делать ход, значит, игра окончена.
В противном случае, функция организует выполнение хода для текущего игрока. Если текущий игрок – пользователь, всё очень просто далее вызывается MakePlayerMove(), которая выполняет некоторые служебные оерации и вызывает MakeMove() для выполнения хода.
Если текущий игрок – компьютер, вызывается функция CalculateComputerMove() для вычисления лучшего хода. Затем вызывается MakeComputerMove() и MakeMove(). MakeMove() обновляет класс Board и помещает новую фишку в нужную клетку.
Далее вызывается функция EndMove(), которая переключает текущего игрока и вновь вызывает StartTurn().
Функция CalculateComputerMove() содержит 6 вспомогательных функций:
Первая функция генерирует все возможные ходы (с текущим положением кубиков) и осуществляет выборку наиболее вероятных ходов.
Вторая функция осуществляет подсчёт пипсов. Количество пипсов – это число, которое нужно выбросить на игральных костях, чтобы вывести все свои фишки. По этому параметру определяют лидерство и близость победы.
Третья функция максимизации числа полей с двумя и более фишками. Число полей с двумя и более фишками является противоположностью предыдущему параметру, его стремятся максимизировать. Чем больше таких полей, тем устойчивее позиция и тем сложнее через нее пройти.
Четвертая функция рассчитывает возможность блокад – несколько смежных полей, занятых двойными или более фишками. С этим параметром можно связать изменение стратегии – нужно проводить свои фишки вперед, если их запирают.
Пятая функция анализирует число прямых возможностей взятий – это число одинарных фишек на расстоянии 6 или меньше полей. Есть схожий с этим параметр – число одинарных фишек на расстоянии меньшем 12. Схожим параметром является вероятность взятия одинарной фишки, которая в большинстве случаев рассчитывается по предварительно посчитанной таблице.
Шестая анализирует выгодную позицию. Анализируя сыгранные партии можно заметить, что занятие определенных позиций на доске способствует победе. Такими позициями является 4-я и 5-я клетки и соответственно 20-я и 21-я симметричные клетки. Таким образом, в простейшем случае можно ввести факт занятия этих клеток в оценочную функцию. В более общем случае, вводят весовые коэффициенты для всех полей доски.
Рис. 6 Скриншоты игры.