Бот-Сапер С Изюминкой

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

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

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

Итак, вместо того, чтобы самому играть в сапёр в свободное время, я решил научить игре бота — написать программу на C#, которая будет делать следующее: 1) используя картинку игрового окна заполнить матрицу размеров 16*30 (размеры поля тральщика в профессиональном режиме) числами в соответствии с расположением на экране; 2) прогнать эту матрицу через алгоритм, выполняющий шаблонные действия; 3) в ходе алгоритма тыкаем по полю мышкой, расставляя флажки и открывая поле, и возвращаемся в первую точку.

4) так как из-за третьего пункта мышь занята, то для остановки программы необходимо настроить перехват нажатия клавиш в операционной системе (так как всегда активно окно Сапёра, а не нашей программы).

5) Освоив четыре предыдущих пункта, я решил добавить изюминку - сделать программу хоть немного больше.

полезный/юзабельный - сделать из него скринсейвер, т.е.

автоматически запускать игру "Сапёр" при неактивности клавиатуры и мыши через заданное пользователем время (по желанию пользователя, конечно).

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

Далее я решил перенести его на MineSweeper — сапер от Windows7, об этом в конце статьи.

Итак, давайте по порядку.

1) На первом этапе мы создаем глаза нашего бота.

Следующий код поможет нам получить представление об игре:

   

using Emgu.CV; using Emgu.CV.Structure; .

DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); public struct RECT { public int Left; public int Top; public int Right; public int Bottom; }

Теги: #C++ #Алгоритмы #распознавание изображений #EmguCV #KeyboardHooker #Алгоритмы #Обработка изображений #C++
Вместе с данным постом часто просматривают: