Pull to refresh

Comments 24

Расскажите, как сделали платформонезависимый клик. Кажется, силами Qt в любую точку экрана не кликнешь…
UFO just landed and posted this here
То ли дело java.awt.Robot — кликает всегда и везде.
Увы, под линукс я как раз и не сделал. Я в начале статьи написал, что код содержит платформозависимый код только под Windows. Этот код — захват окна и клик мышкой.

Но не всё так плохо. Я сейчас занялся написанием полностью автоматического бота через Qt WebKit, где, судя по всему, эмуляция клика мышки возможна через событие mousePressEvent. Это будет работать под любой платформой, где работает Qt.
Вот какраз Ваше замечание про возможность кроссплатформенного решения (я почему-то посчитал полного) через QWebKit и сбило меня с толку. Но платформенный клик — это нормально, пара-тройка #ifdef в роде

#ifdef Q_WS_WIN
SendMessage()…
#endif

И малой кровью, как говорится :)
ура!!! покликаем :)
давно ждал бота именно для этой игры
Видео завораживает. Поставить на бесконечный вариант игры и сутками наблюдать.
Писал такого бота для игры Bejeweled 2 (desktop версия), так там есть 2 секретных режима: Hyper (дико быстрый) и Finity (ооооочень долгий). Последний уровень проходился ботом порядка 3-4 недель, собственно под него и писался. быстрый режим так быстро проходился, что возникали глюки, был постоянный бонус за непрерывность комбинаций, шкала прогресса доходила до конца и закручивалась по второму разу, а общее время игры отображалось чуть ли не в месяцах :)
Я так понимаю, цели написать оптимальную стратегию игры не ставилось?
Просто в такой игре надо учитывать перемещения кристаллов и думать на ход-два (а то и больше) вперёд, чтобы получать длинные цепочки и бонусы.
Если просчитать несколько ходов для максимума бонусов — тогда ходы нужно будет выполнять строго по очереди. Значит, надо каким-то образом дожидаться завершения предыдущего хода, что сильно усложняет задачу и расходует время.

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

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

На самом деле тут нужен не простой алгоритм, а алгоритм нахождения пути для изменяющегося окружения (угу, такие используются в марсоходах и соревнованиях Darpa). Имхо, вам лучше не найти, только информации о них мало (в вики пусто).
Возьмем обычный жадный алгоритм, там как правило, сохраняется информация о цене перехода к следующему ноду в графе. Если, как у вас, ситуация меняется, то приходится пересчитывать (в худшем случае) весь граф (доску).
Один из вариантов — добавить в каждый нод переменную, описывающую соседние ноды. На пример среднее от расстояния до них и перед каждым ходом проверять изменилось ли обстановка вокруг и пересчитывать только изменившиеся места.
UFO just landed and posted this here
У меня была идея написать бота для Starcraft2, с помощью перехвата D3D9 потока, довольно интересная задача, но на это надо очень много свободного времени.
Хорошо, что она осталась идеей, ато либо Вас посадил бы близзард, либо добрые 90% процентов играющей кореи просто распяли бы
Перехватить вызовы DirectX очень просто, например, с помошью написания проксирующего DLL. Вопрос в том, что дальше делать с перехваченными данными?
Этак половину игрового движка придётся реализовать в своей программе, чтобы понять что происходит в игре :-)
На самом деле не так сложно, нам достаточно снимать с фрейма информацию о юнитах, строениях, возможных действиях и т.п., то есть снимать текущее состояние игры. Далее необходимо принять решение, на основе текущего состояния. Самое простое это вывести простые шаблоны его поведения, скажем граф тактик.

Создать бота который будет играть по простой тактике с очень хорошим микро, не сложная задача, и такие боты уже есть. А вот создать бота который сможет хранить большую базу знаний о игре, и используя эту базу принимать решение в реальном времени, вот это уже намного интересней.
Перехват DX через «проксирующую DLL»? Разве проще сгенерировать бешенное «нечто» за вместо инжекта с парой хуков?
> В последнее время появилось много статей про написание ботов для flash игр.
Знаю что меня за это сольют, но:
В последнее время появилось много статей начинающихся со фразы «в последнее время появилось много статей про… (нужное вставить)».
Это такая тенденция?
Я знаю это такой коварный план, выложить статью ровно 1 сентября, чтоб все планы пошли лесом и все засели за программирование…
Тоже сначала хотел писать бота на C++ Qt, но не хотелось разбираться с WinAPI, поэтому выбрал AutoIT. Спасибо за статью!
PS Это уже 6-я статья про бота за последние 2 недели на хабре? Мне как заварившему эту кашу, хочется сказать «горшочек НЕ ВАРИ!»
хочется сказать «горшочек НЕ ВАРИ!»
а можно узнать почему? я, например, благодаря этим статьям открыл для себя AutoIT.
Интересно в каком браузере бот нормально работает? Что-то под семеркой в ie и ff ничего не происходит, хотя все сделано по инструкции и зеленые кнопочки горят
фф под семеркой — полет нормальный. выложите скриншот интерфейса бота
Я в свободное время тоже занимался написанием бота для этой игры, вернее подсказчика, на поле показываются стрелочки подсказки всех существующих ходов.

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

И возникла у меня идея поискать в памяти игры, вдруг там есть массив с положением фигурок и их режимомами.

Но всё оказалось печально: Не понятно какой размер массива: 8х8 байт? ок, делаю скриншот игры, в паинте на всех треугольниках рисую букву «а», на ромбах «b», на квадратах «с» et cetera.

Потом в коде бота пишу шаблон из типа «aabacbdb.....» (64 символа построчно со скриншота)

Беру первый байт памяти — допустим F0 и шаблона — «а». следующая буква шаблона тоже «а» — значит берем следующий байт памяти, сравниваем с F0 ну и так далее, пока блок памяти и шаблон не совпадут :)

Не совпадений :(

Хорошо, может быть в памяти массив данных состоит не из байт подряд, а из байт с каким-то шагом — проверил все варианты от шага в 1 байт до шага в 512 байт — тоже нет совпадений, в общем зашел в тупик и сделал тоже по цвету пикселов.

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

Еще может быть, пока игра на паузе (или не активна) массив шифруется
Или просто шифруется :) В общем програмисты — молодцы.

Если вдруг у кого-то еще какие-то идеи — отпишитесь, все-таки интересно :)
Sign up to leave a comment.

Articles

Change theme settings