Как написать программу бот для игры

Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.

20 818 просмотров

Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.

Идея не приходит одна

Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.

Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.

Я сделал бота для Terraria! | Python бот для игры

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

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

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

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

Какое решение быстрее наберёт пять плюсов, то и выбирается ботом как лучшее. Это хорошее решение не только с точки зрения справедливости, но и автоматизации: нам больше не придётся следить за чатом и читать все ответы.

Подготовка к созданию

Дело осталось за малым: написать бота. Мы ограничились Composer, библиотекой telegram-bot-sdk и symfony/dotenv для парсинга .env-файла. Весь код приводить не буду: он большой. Посмотреть на то, что получилось, можно по ссылке.

Composer — это стандарт при разработке на PHP. Он позволяет скачивать сторонние библиотеки на проект и предоставляет удобный механизм по автозагрузке классов. Вся работа с Composer происходит через консоль и в файле composer.json. Обычно он выглядит так:

Читайте также:
Принцип построения программы искусство слышать

Как создать бота для любой игры?

Если вы разрабатываете не на фреймворке, то во множестве случаев создаёте composer.json самостоятельно и заполняете секцию autoload, которая загружает ваши классы по правилу psr-4, о котором можно найти много информации в интернете.

Далее вы выполняете команду composer install, и автозагрузка начинает работать. Также не забудьте про библиотеки, которые нужно установить, для этого выполните в терминале в папке с проектом следующие две команды:

composer require irazasyed/telegram-bot-sdk composer require symfony/dotenv

И тогда ваш composer.json станет похож на тот, что я показывал выше.

Сразу же продемонстрирую готовую структуру проекта:

Файл app.php является точкой входа в наше приложение, на который мы вешаем веб-хук (это значит, что бот не будет постоянно опрашивать сервер на наличие обновлений; он их будет получать только тогда, когда они будут). Вот как он выглядит:

Ничего необычного, создаём объекты всех нужных нам классов и делаем проверку на то, в каком чате мы находимся — приватном или супергруппе. Да, разделить код на достаточно независимые части является хорошей практикой. К тому же легче рефакторить и добавлять код, когда проблемы того потребуют.

Руководство для начинающих по ИИ и написанию собственного бота для игры 2048

Искусственный интеллект — одно из самых развивающихся направлений в ИТ-индустрии. Это просто интеллект, демонстрируемый машинами, в отличие от естественного интеллекта, демонстрируемого людьми и другими животными. За последние несколько лет тема получила массовую популяризацию.

Бьюсь об заклад, вы уже слышали об автономных автомобилях, роботах для повседневного использования и многом другом. Это не только упрощает нашу жизнь, но и позволяет делать дела быстрее, качественнее и с гораздо большей вероятностью успеха. Теория игр — одна из самых первых областей, с которой столкнулся искусственный интеллект, и в этой статье я объясню самые основы создания собственного бота.

Описание и анализ игры 2048

2048 — это однопользовательская игра-головоломка с раздвижными блоками, разработанная итальянским веб-разработчиком Габриэле Чирулли. Основная цель игры состоит в том, чтобы перемещать пронумерованные плитки по сетке, чтобы объединить их и создать плитку с номером 2048. Игра стала вирусным хитом и завоевала мировую популярность.

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

Вот некоторые наблюдения, которые помогут нам создать нашу игровую стратегию:

  • Оптимально держать плитку с наибольшим значением в одном из углов
  • Ряды плиток должны быть монотонными, чтобы их можно было легко складывать.
  • Чем больше пустых плиток, тем выше шанс не быть заблокированным
  • Разница между соседними плитками должна быть как можно меньше

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

Первые шаги по написанию бота

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

Читайте также:
Что такое патч к программе и как его установить

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

Чтобы это произошло, нам сначала нужны координаты для каждой плитки на доске. Для этого я использую библиотеку pyautogui. Вот действительно простой код для этого:

import pyautogui while True: print(pyautogui.displayMousePosition())

Он покажет координаты вашего курсора.

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

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

# Printing gray scale values for every point in Coords class # coordsArray is just an array of coordinates def printGrayscale(): image = ImageGrab.grab() image = ImageOps.grayscale(image) for i in range(4): row = [] for j in range(4): row.append(image.getpixel(Coords.coordsArray[i*4 + j])) print(row)

Следующее, что нужно сделать, это реализовать ключевой ввод. Я просто использовал функцию в библиотеке pyautogiu. Код действительно прост:

# Constant values representing directions UP = 100 DOWN = 101 LEFT = 102 RIGHT = 103 # Performing move def performMove(move): if move == UP: print(«Going UP») pyautogui.keyDown(‘up’) pyautogui.keyUp(‘up’) if move == DOWN: print(«Going DOWN») pyautogui.keyDown(‘down’) pyautogui.keyUp(‘down’) if move == LEFT: print(«Going LEFT») pyautogui.keyDown(‘left’) pyautogui.keyUp(‘left’) if move == RIGHT: print(«Going RIGHT») pyautogui.keyDown(‘right’) pyautogui.keyUp(‘right’)

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

Эта функция определяет, как будет выглядеть сетка после перемещения в определенном направлении. Благодаря этому мы сможем решить, какой ход будет лучшим, сравнив результаты после обмена во всех возможных направлениях. Мой код для этого довольно длинный, и я не буду вставлять его сюда. Если у вас возникнут какие-либо проблемы с реализацией, я поставлю ссылку на свой репозиторий GitHub в конце этой статьи.

Жадный подход к проблеме

На данный момент вы реализовали самые необходимые функции для взаимодействия вашего бота с игрой. Теперь вам нужно сосредоточиться на какой-то тактике, которой нужно следовать во время игры. Первая идея состоит в том, чтобы просто сравнить результирующие сетки после каждого возможного свайпа и затем выбрать лучший ход. Для этого мы должны определить нашу первую эвристику, функцию, которая будет возвращать оценку данной сетки, чтобы мы могли их сравнить. Самая простая идея — просто придать каждой позиции на доске определенный вес. Например, взвешенная сетка может выглядеть так:

scoreGrid = [50, 30, 20, 20, 30, 20, 15, 15, 15, 5, 0, 0, -5, -5, -10, -15]

Читайте также:
Как в программе мовави установить фон на видео

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

Я рекомендую вам изменить свой вес и посмотреть, как это повлияет на то, как играет ваш бот. Это действительно помогает вам понять идею, стоящую за этим, и, возможно, ваш бот выиграет игру, используя только эту эвристику! При изменении веса помните о тех наблюдениях, которые мы сделали в начале этой статьи.

Я сам пробовал несколько вариантов, когда начинал этот проект, и набрал лучший результат (даже выиграл один или два раза) с увеличением веса в форме змеи. Это выглядит так (4^^3 означает 4³ и т. д.):

scoreGrid = [4^^15, 4^^14, 4^^13, 4^^12, 4^^8, 4^^9, 4^^10, 4^^11, 4^^7, 4^^6, 4^^5, 4^^4, 4^^0, 4^^1, 4^^2, 4^^3]

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

Плюс мы не смотрим, что происходит, когда на доске появляются новые тайлы. Это довольно большая проблема, но всегда есть решение! Это подводит нас к алгоритму MiniMax.

Обновление нашего алгоритма и теории минимаксных деревьев

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

В этих играх у обоих игроков одна и та же цель и набор ходов. В 2048 году наша ситуация выглядит совершенно иначе. Установка по своей сути асимметрична; то есть компьютер и игрок в свой ход совершают совершенно разные действия. Однако можно использовать этот алгоритм в своих интересах.

Игровые боты. Начало

Что может быть интереснее процесса игры в игры? Правильно! Процесс наблюдения за тем, как играет в игры написанный тобой бот.

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

Введение

Боты для онлайн игр я бы грубо разделил на 3 разновидности по способам реализации:
1. Боты не использующие приложение игры. Имитирующие протокол обмена с сервером.
2. Боты работающие с процессом приложения игры. В случае с Web, работающие с окном браузера.
3. Боты работающие со скриншотом и имитирующие устройства ввода мышь и клавиатуру.

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

Вторая разновидность более реальна и может быть реализована. Бот второго вида получает полезную информацию из памяти процесса игры. Недостаток — версии клиентов могут регулярно обновляться и тогда может потребоваться заново искать интересующие адреса памяти.

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru