Наверное, такое случается со многими: нечего делать на работе, или нужно подумать перед выполнением очередного задания, или к чаю просто нет ничего вкусного, тогда рука автоматически тянется к мышке и начинает играть в сапёра.
И тут, в порыве очередного приступа тральщикомании, ко мне пришла мысль, что я уже не думаю, как раньше, где находятся мины, а просто автоматически, по разработанному алгоритму, тыкаюсь по полю, ломая мышь.
А поскольку я действую по алгоритму, без особых творческих усилий, то я могу написать бота, который будет играть вместо меня, наверное, внимательнее и быстрее.
Итак, вместо того, чтобы самому играть в сапёр в свободное время, я решил научить игре бота — написать программу на C#, которая будет делать следующее: 1) используя картинку игрового окна заполнить матрицу размеров 16*30 (размеры поля тральщика в профессиональном режиме) числами в соответствии с расположением на экране; 2) прогнать эту матрицу через алгоритм, выполняющий шаблонные действия; 3) в ходе алгоритма тыкаем по полю мышкой, расставляя флажки и открывая поле, и возвращаемся в первую точку.
4) так как из-за третьего пункта мышь занята, то для остановки программы необходимо настроить перехват нажатия клавиш в операционной системе (так как всегда активно окно Сапёра, а не нашей программы).
5) Освоив четыре предыдущих пункта, я решил добавить изюминку - сделать программу хоть немного больше.
полезный/юзабельный - сделать из него скринсейвер, т.е.
автоматически запускать игру "Сапёр" при неактивности клавиатуры и мыши через заданное пользователем время (по желанию пользователя, конечно).
Программа была написана и протестирована для классического сапера, который был доступен в версиях Windows до XP включительно.
Далее я решил перенести его на MineSweeper — сапер от Windows7, об этом в конце статьи.
Итак, давайте по порядку.
1) На первом этапе мы создаем глаза нашего бота.
Следующий код поможет нам получить представление об игре:
Теги: #C++ #Алгоритмы #распознавание изображений #EmguCV #KeyboardHooker #Алгоритмы #Обработка изображений #C++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; }
-
Все О Страховании Ноутбуков
19 Oct, 24 -
Тайные Общества: История Deus Ex
19 Oct, 24 -
Калькулятор На Mysql
19 Oct, 24 -
Миллион И Один День Inotifypropertychanged
19 Oct, 24