ИИ для игры Тройки! ООО «Сирво». Вы можете скачать игру здесь: http://asherv.com/threes/
Создание этого ИИ послужило вдохновением для моего более позднего ИИ 2048 года, и некоторые идеи ИИ 2048 года также были перенесены в этот ИИ.
Хотя я официально не оценивал производительность этого ИИ (пока), я знаю, что он несколько раз успешно достигал плитки 6144, которая является самой высокой плиткой, доступной в игре. (Более высокие плитки возможны, но маловероятны из-за серьезных случайных эффектов). Максимальный результат (на момент написания статьи) — 775 524 балла:
Этот ИИ гораздо более экспериментальный, чем его новый брат 2048 ИИ, из-за повышенной сложности Троек! и потому, что ему не было уделено столько времени на разработку. Кроме того, Тройки! в целом это своего рода движущаяся цель, поскольку алгоритмы генерации случайных плиток время от времени настраиваются, что требует изменений в ИИ.
Алгоритм для этого ИИ уже подробно описан в этом ответе StackOverflow, описывающем мой ИИ 2048 года. По сути, он реализует высокооптимизированный перебор перебора по дереву игры (все возможные ходы, значения появления плиток и значения плиток), используя оптимизацию ожидаемого максимума для объединения результатов и поиска «наилучшего» возможного хода.
Этот ИИ Тройки на самом деле более сложен, чем ИИ 2048 года, во многих отношениях: в частности, он учитывает «колоду» предстоящих плиток (хорошо документированный процесс, с помощью которого выбираются случайные входящие плитки) и правильно обрабатывает все возможные места появления плиток в зависимости от сделанных ходов. Вкратце: этот ИИ Threes правильно (насколько мне известно) имитирует каждую деталь игры Threes в рамках процесса оптимизации ожидаемого максимума.
Самый простой способ запустить ИИ — клонировать одну из prebuilt/
ветвей, соответствующих вашей ОС и процессору. Эти ветки имеют предварительно созданные двоичные файлы в каталоге bin/
.
Обратите внимание, что Python «по умолчанию» в Windows является 32-битным, а Python «по умолчанию» в OS X и Linux — 64-битным. 32-битные сборки имеют тег i386
, а 64-битные сборки — x86_64
.
Если вы хотите собрать его самостоятельно из исходного кода (например, если вы вносите изменения), следуйте инструкциям ниже.
Выполнять
./configure
make
в терминале. Любой относительно недавний компилятор C++ должен быть в состоянии построить выходные данные.
Обратите внимание, что вы не делаете make install
; эта программа предназначена для запуска из этого каталога.
У вас есть несколько вариантов, в зависимости от того, что вы установили.
Pure Cygwin: следуйте инструкциям Unix/Linux/OS X, приведенным выше. Полученную DLL можно использовать только с программами Cygwin, поэтому для запуска версии управления браузером необходимо использовать Cygwin Python (а не Python.org Python). Пошаговые инструкции любезно предоставлены Тамасом Зеллом (@matukaa) в этом документе.
Cygwin с MinGW: запустить
CXX=x86_64-w64-mingw32-g++ CXXFLAGS='-static-libstdc++ -static-libgcc -D_WINDLL -D_GNU_SOURCE=1' ./configure ; make
в оболочке MinGW или Cygwin для сборки. Полученную DLL можно использовать с программами, отличными от Cygwin.
Visual Studio: откройте командную строку Visual Studio, cd
в каталог Threes-ai и запустите make-msvc.bat
.
Для запуска программ Python вам понадобятся Python 2.7, NumPy и PIL.
Запустите bin/threes
если хотите увидеть ИИ в действии.
Существует несколько веб-версий Threes, но я хотел, чтобы ИИ играл против реального приложения. Итак, я создал программу-помощник для устройств Android под названием android_assistant.py
, которая связывается с телефоном через ADB и делает движения полностью автоматически. Для этого требуются только разрешения USB ADB (стандартный доступ разработчика) и не требуется рутирование или какая-либо другая модификация устройства или приложения. Он использует стандартную утилиту Android screencap
для получения (видимого) состояния игры, вычисляет оптимальный ход, а затем использует подсистему входных событий Linux для генерации событий смахивания.
Чтобы использовать android_assistant.py
, вам необходимо настроить подсистему OCR для вашего устройства. Вам также придется записывать события смахивания для повтора. В настоящее время настроены два устройства: LG Nexus 5 и OnePlus One (соответствует телефонам, на которых я это тестировал). Патчи приветствуются для добавления большего количества телефонов.
Чтобы настроить систему OCR, вам следует добавить в ocr/devices.py
запись, соответствующую вашему устройству. Название модели можно получить, просто запустив android_assistant.py
при подключении к устройству (должна появиться ошибка с ожидаемым названием модели). По сути, вам нужно будет сделать снимок экрана игры и определить положение панели «предстоящая плитка», а также положение и интервал сетки плиток. (В этой части, вероятно, можно было бы использовать больше автоматизации и/или упрощения!)
Чтобы записать события, просто запустите python -m android.inputemu --record up down left right
и при появлении соответствующего запроса выполните соответствующий жест на телефоне.
Ручной помощник – универсальная Тройка! помощник, работающий с любой реализацией Threes!. Вы сообщаете ему доску и предстоящий набор плиток, и помощник рассчитывает лучший ход.
Запустите manual_assistant.py
, чтобы запустить ручной помощник.
Обратите внимание, что ручной помощник ожидает увидеть последовательные ходы. Если вы пропускаете вперед (делаете ходы без помощника), выйдите из помощника, нажав Ctrl+C, и запустите его снова. В противном случае вы можете получить сообщение об ошибке типа «невозможная ситуация», если вы войдете на доску, которая не является последовательной по отношению к предыдущей доске.
При переходе на следующую доску вы можете использовать пробелы, переводы строк и/или запятые для разделения плиток. Читайте слева направо, затем сверху вниз. Введите ноль для пустых мест. Пример ввода:
Использование запятых и новой строки:
96,2,3,0
2,1,1,0
2,1,0,0
0,0,2,0
Использование только запятых:
96,2,3,0,2,1,1,0,2,1,0,0,0,0,2,0
Использование пробелов:
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
Вы также можете ввести «дельту» от предыдущей платы. Укажите строку или столбец, в котором появилась новая плитка, и значение появившейся плитки (вы можете пропустить это, если последним ходом была только одна возможная новая плитка, например, если она была красной или синей). Также укажите ход, который вы сделали, если это не ход, предложенный ИИ.
Столбцы и строки нумеруются слева направо и сверху вниз: столбец 1 — это левый столбец, а строка 1 — верхняя строка.
Например, если доска проведена вверх и переходит от
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
к
96 3 3 0
2 1 1 0
2 0 2 0
0 3 0 0
тогда вы отправите 2,3,up
в качестве доски (во 2-м столбце появится цифра 3). Если бы ИИ рекомендовал движение up
, вы могли бы просто пропустить это и отправить 2,3
. Если бы предстоящая плитка была предсказана как 3, вы могли бы опустить 3 и отправить только 2
.
Вводя дельты, вы сэкономите себе массу времени. В большинстве случаев вам нужно ввести только одно число (столбец/строку, которая изменилась).
При вводе следующей плитки используйте один из следующих форматов:
blue
(1), red
(2) или white
(3+)1
, 2
, 3
, 3+
, 6+
или, например, 24,48,96
, 24 48 96
3+
означает, что это может быть 3 или выше; используйте это со старыми тройками! которые не показывают знак «плюс» на бонусных плитках6+
означает, что это любой бонусный тайл; используйте это, если следующая плитка «+»24,48,96
означает, что это один из этих трех; используйте это с новыми Threes! которые показывают вам явные варианты значения бонусной плитки.