//основной цикл игры, получает старую диспозицию и счетчик статистики public static int[,] GameIteration(int[,] oldTableOfNumbers, SaperStatistics counter) { //провнряем, на месте ли окно, если нет, то открываем новое if (CheckSaperWindow() == false) { StartNewSaperProcess(); FillTableWithEmptyCells(oldTableOfNumbers); } var handle = FindWindow(null, "Сапер"); if (handle == IntPtr.Zero) { handle = FindWindow(null, "MineSweeper"); if (handle == IntPtr.Zero) { System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); } } //получает координаты окна сапера(прямоугольник) GetWindowRect(handle, out rect); //определяем версию сапера if (rect.Bottom - rect.Top == 371 && rect.Right - rect.Left == 506) { version = SAPER_TYPE.XP; } else if (rect.Bottom - rect.Top == 409 && rect.Right - rect.Left == 616) { version = SAPER_TYPE.Seven; System.Threading.Thread.Sleep(500); } else { version = SAPER_TYPE.NotRecognized; MessageBox.Show("Извините, данная версия не поддерживается либо размеры окна изменены!"); System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); } //вот и наш прямоугольник с игрой Rectangle gameScreenRect = new System.Drawing.Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top); //получает изображение игры Bitmap gameBmp = GetScreenImage(gameScreenRect); Image <Bgr, Byte> img = new Emgu.CV.Image <Bgr, byte>(gameBmp); int[,] newTableOfNumbers = null; if (version == SAPER_TYPE.XP) { //распознает изображение игры, заполняет матрицу числами, соответствующими текущей диспозиции на экране SaperImageDetection saperTableOfNumbers = new SaperImageDetection(img, oldTableOfNumbers); //запоминает текущую диспозицию на экране newTableOfNumbers = saperTableOfNumbers.GetSaperField(); } if (version == SAPER_TYPE.Seven) { //распознает изображение игры, заполняет матрицу числами, соответствующими текущей диспозиции на экране SaperImageDetectionWindows7 saperTableOfNumbers = new SaperImageDetectionWindows7(img, oldTableOfNumbers); //запоминает текущую диспозицию на экране newTableOfNumbers = saperTableOfNumbers.GetSaperField(); } //по матрице с числами заполняет матрицу из элементов класса "ячейка сапера" SaperFieldOfCells fieldOfCells = new SaperFieldOfCells(newTableOfNumbers); //позволяет проще управлять мышью в ходе алгоритма игры SaperMouseClick mouse = new SaperMouseClick(gameScreenRect); //класс, содержащий различные алгоритмы по прохождению игры, получает текущую диспозицию и мышь SaperAlgorithm alg = new SaperAlgorithm(fieldOfCells, mouse); //проверка на проигрыш/победу if (version == SAPER_TYPE.XP) { if (alg.IfGameOver(counter) == true) { FillTableWithEmptyCells(newTableOfNumbers); return(newTableOfNumbers); } if (alg.IfVictory(counter) == true) { FillTableWithEmptyCells(newTableOfNumbers); return(newTableOfNumbers); } } if (version == SAPER_TYPE.Seven) { if (SaperImageDetectionWindows7.IfGameOverWin7(img) == true) { System.Threading.Thread.Sleep(4000); mouse.NewGame(); System.Threading.Thread.Sleep(1000); //получает изображение игры var gameBmp2 = GetScreenImage(gameScreenRect); Image <Bgr, Byte> img2 = new Image <Bgr, byte>(gameBmp2); if (SaperImageDetectionWindows7.IfNewGameStarted(img2) == false) { if (statisticsOn == true) { counter.StatisticForVictory(); } mouse.VictoryWin7(); } else { if (statisticsOn == true) { counter.StatisticForGameOver(numberOfMinesWin7); } } FillTableWithEmptyCells(newTableOfNumbers); return(newTableOfNumbers); } } if (PauseResume() == true) { return(newTableOfNumbers); } //собственно игра, эти алгоритмы описаны в классе SaperAlgorithm alg.SimpleAlgorithm(); if (PauseResume() == true) { return(newTableOfNumbers); } alg.HardAlgorithm(); if (PauseResume() == true) { return(newTableOfNumbers); } alg.DoubleClickingAlgorithm(); if (PauseResume() == true) { return(newTableOfNumbers); } if (version == SAPER_TYPE.Seven) { numberOfMinesWin7 = fieldOfCells.numberOfMines; } //если после предыдущих алгоритмов диспозиция не изменилась, то щелкаем в любую неоткрытую клетку if (SaperAlgorithm.EndOfCycle(oldTableOfNumbers, newTableOfNumbers) == true) { alg.CleverRandomClick(); } if (PauseResume() == true) { return(newTableOfNumbers); } return(newTableOfNumbers); }
public SaperAlgorithm(SaperFieldOfCells saperField, SaperMouseClick mouseClicker) { field = saperField; mouse = mouseClicker; }