Как стать автором
Обновить

Как можно внедрить ИИ в свою первую игру на Python

Уровень сложностиСредний

В современном мире искусственный интеллект(ИИ) стал неотъемлемой частью компьютерных игр. Благодаря ИИ персонажи становятся "умнее", а игровой процесс — более увлекательным. Одним из наиболее заметных примеров использования ИИ в играх является создание ботов, которые могут играть на уровне профессиональных игроков в такие игры, как Dota 2, StarCraft II. Но для первой попытки внедрить ИИ лучше выбрать что-то по проще. Например, можно взять классическую игру Змейка. В этой статье мы сначала разберем, как работает сама игра, а потом постараемся научить ИИ управлять нашим персонажем.                                                                                               

Начнем пожалуй с выбора подходящей библиотеки : Tkinter и Pygame — два популярных инструмента, но для новичков предпочтительнее использовать Tkinter. Выделим основные достоинства:

  • Простота: Tkinter входит в стандартную библиотеку Python, не требует установки и обеспечивает базовый, но функциональный графический интерфейс. В отличие от Pygame, он не перегружает новичков сложной графикой.

  • Легкий старт: Tkinter позволяет сосредоточиться на логике игры, а не на продвинутых визуальных эффектах. Это важно для тех, кто изучает основы программирования.

  • Универсальность: с Tkinter легко добавлять интерфейсные элементы (кнопки, текстовые поля), что полезно при разработке простых игр с функциями управления.

После выбора библиотеки переходим к пониманию структуры игры "Змейка". Это классическая аркадная игра, где главная задача — увеличить длину змейки, избегая столкновений с границами экрана и собственным телом. Следовательно мы имеем три важных объекта : игровое поле, змейка, еда.  

Игровое поле представляет собой сетку, где каждая клетка равна фиксированному размеру (например, 20x20 пикселей). Это поле создается с помощью объекта Canvas из библиотеки tkinter. Координаты игрового пространства измеряются в пикселях, и каждая клетка имеет четко определённые позиции по осям X и Y. Размер поля можно задать переменными GAME_WIDTH и GAME_HEIGHT, что позволит легко менять размеры игры.  

Змейка реализована как список координат, где каждая координата — это сегмент тела змейки. Голова змейки — это первый элемент списка. Логика движения заключается в добавлении новой головы в заданном направлении и удалении последнего сегмента (если еда не съедена). Например, если змейка движется вверх, к координатам головы прибавляется отрицательное значение по оси Y.

Еда — это простой объект, который генерируется в случайной клетке игрового поля. Местоположение еды создаётся с помощью генерации случайных координат, которые проверяются на отсутствие в теле змейки. Если голова змейки достигает координат еды, змейка "ест" её: к телу змейки добавляется новый сегмент, а на поле появляется новая еда.     

Теперь перейдем к логике и управлению игры. Игрок управляет направлением движения змейки с помощью клавиш(в будущем наш ИИ сам будет определять направление). В коде управление будет реализовано с использованием события bind, которое отслеживает нажатия клавиш. Важно, чтобы змейка не могла мгновенно развернуться в противоположном направлении, так как это вызовет немедленное столкновение с собой. Сам процесс игры управляется с помощью цикла, вызываемого функцией after. Он каждые 100 миллисекунд проверяет:

  • Змейка движется в текущем направлении.

  • Проверяется столкновение с границами или телом.

  • Перерисовывается змейка и еда.

Этот цикл продолжается, пока не сработает условие окончания игры. Игра завершается, если голова змейки сталкивается:

  • С границей игрового поля (координаты выходят за пределы).

  • С собственным телом (координаты головы совпадают с координатами одного из сегментов тела).

Когда происходит столкновение, игра останавливается, и на экране отображается сообщение "GAME OVER".  Для удобства отслеживания игрового процесса можно добавить счетчик, который показывает количество съеденной еды. Счет увеличивается на единицу при каждом успешном сборе еды. Очки отображаются в верхней части игрового поля с помощью метода create_text. А для удобства игрока мы добавим функцию перезапуска, активируемая нажатием клавиши R. Она сбрасывает параметры игры к начальному состоянию: змейка возвращается на стартовую позицию, счет обнуляется, а на поле появляется новая еда.

Теперь, когда мы разобрали основную механику базовой версии игры "Змейка", пора перейти к созданию искусственного интеллекта, который будет управлять змейкой. Логика ИИ в игре будет основана на оптимизации выбора безопасных направлений с целью минимизации расстояния до цели (еды). Математически это будет выглядеть как алгоритм, задача которого сводится к решению проблемы поиска оптимального пути с учётом ограничений (границы поля и тело змейки).

Определение безопасных направлений:  для каждого возможного направления (вверх, вниз, влево, вправо)  вычисляем новое положение головы змейки. Формулу можно выразить так:

где Δx и Δy — это изменения координат для каждого направления. Направление считается безопасным, если новая позиция головы не выходит за границы поля и не совпадает с частью тела змейки. Для каждого безопасного направления мы вычисляет манхэттенское расстояние до еды: 

где (Xhead,Yhead)  — координаты головы змейки, а (Xfood,Yfood) — координаты еды.

Выбор направления: Алгоритм выбирает направление с минимальным D значением ,то есть то, которое сокращает расстояние до еды:

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

Добавление функции для получения безопасных направлений

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

Функция проверки безопасности движения

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

Функция выбора направления ИИ

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

Функция расчета расстояния до еды

Для того чтобы ИИ выбирал направление, минимизирующее расстояние до еды, нам нужно вычислить расстояние между текущим положением головы змейки и едой. Расстояние можно измерить как манхэттенское расстояние — сумма абсолютных разностей координат по осям X и Y.    

Теперь, когда у нас есть функции для анализа безопасных направлений и выбора наилучшего пути к еде, нам нужно интегрировать ИИ в основной игровой цикл. Мы будем вызывать функцию ai_decision() в каждом цикле игры, чтобы ИИ мог обновлять направление змейки. 

Внесем изменения в цикл игры, чтобы направление выбиралось ИИ:

В результате внедрения ИИ в "Змейку" мы создали алгоритм, который эффективно решает задачу поиска оптимального пути с учётом безопасных направлений и минимизации расстояния до цели. Основная концепция такого ИИ заключается в том, что на вход он получает информацию о текущем состоянии игры (позиции змейки, еды и доступных направлений), а на выходе принимает решение, которое наиболее выгодно с точки зрения достижения цели.

По итогу может получиться такая змейка с искусственным интеллектом
По итогу может получиться такая змейка с искусственным интеллектом

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.