Ответ 1
Я только что создал случайную карточку, играющую в бот (а не в покер) примерно через 3 дня, и это было совершенно легко. Метод ниже будет работать для большинства игр на основе кнопок. Конечно, для 3D-игр и быстрой движущейся 2D-графики вам понадобится другой подход.
Странно, что там так мало полезной информации. Все статьи о написании ботов будут связаны с материалами Windows с DLL, перехватами, отслеживанием памяти и всеми другими трюками. И, конечно же, вам не нужна такая глупость. Все, что вам нужно, это Java и awt.Robot.
Испускающие клики достаточно просты, логика игры - это то, что вам нужно выяснить самостоятельно, поэтому я сосредоточусь на получении ввода с экрана.
Вы начинаете с полноэкранного захвата. Затем вы найдете отличное изображение, которое присутствует в каждом кадре, и используйте это изображение в качестве привязки для вычисления смещения левого верхнего угла игрового интерфейса. Якорный образ может быть любой, даже шириной в два или три пикселя между игрой и фоном браузера, просто сделайте это достаточно долго. Затем вы просто просматриваете захват экрана, чтобы найти, где находится это изображение, это очень простой алгоритм, который сравнивает изображения по одному пикселю в то время и изменяет смещение до тех пор, пока совпадение не будет найдено. Когда у вас есть смещение пользовательского интерфейса, вы найдете относительное смещение ко всем кнопкам на экране и сделайте небольшой снимок для каждой кнопки, с которой вы хотите взаимодействовать. Вы используете эти смещения для обнаружения активных кнопок или других индикаторов. В качестве бонуса вы также можете использовать эти смещения при нажатии на кнопки. Вы должны создать коллекцию png (не jpg) изображений всех кнопок, которые вы хотите обнаружить. Затем вы запускаете простые алгоритмы сравнения изображений с содержимым захвата экрана.
Flash выполняет визуализацию векторных шрифтов и не создает идеальную согласованность пикселей между различными экземплярами игры. Также масштабирование изображения не будет согласованным. Вот способы борьбы с этим:
- Фильтрация. Вы можете использовать многие методы фильтрации, самым простым из которых является пороговый фильтр. Просто сделайте все пиксели 100% черными, если интенсивность меньше, чем ваш порог, или 100% белый в противном случае. Затем выполните сравнение по пикселям по отфильтрованным изображениям и найдите количество отдельных пикселей. Предположим, что для низких значений разных пикселей. Вам также может потребоваться сдвинуть изображения на + или - 1 пиксель в каждом направлении, в общей сложности 3 * 3 = 9 сравнений. Просто выберите наименьшее значение отдельного пикселя в результате.
- Средний цвет. Если вы просто смотрите, есть ли индикатор (например, зеленый светящийся круг) на экране или нет, просто найдите средний цвет в прямоугольнике, где находится индикатор, и посмотрите, достаточно ли он близок к среднему цвету сохраненного изображения.
Распознавание шрифтов может быть сложным. Если вы можете отделить буквы (обычно с монохромными шрифтами), вы можете просто использовать метод фильтрации выше, чтобы распознать каждую букву индивидуально.
Если вы нажмете на стену, вы можете попробовать множество более сложных методов фильтрации (размытие + интенсивность порога - хорошая комбинация).
Конечные советы:
- Держите распознавание вашего изображения и логику полностью разделенной.
- Инвестируйте в письменные инструменты хорошего отладки, которые выгружают информацию о процессе обнаружения изображений, чтобы вы могли настраивать фильтры и пороговые значения, пока они не будут работать. Этот отладочный дамп должен включать сопоставленные отфильтрованные изображения, поэтому вы хорошо разбираетесь в том, как работают фильтры, что пошло не так и как их исправить. Без этих инструментов вам не удастся добиться успеха, поэтому, если вы планируете пропустить их, тогда не беспокойтесь.
- У вас есть рабочий прототип раньше. Даже если он обнаруживает только одну кнопку.
- Не оптимизируйте алгоритмы изображения до тех пор, пока у вас не будет рабочий бот.