Esempio n. 1
0
        public void RightClick(int y, int x, SaperCell[,] field)
        {
            mouse_event((int)(MouseEventFlags.MOVE | MouseEventFlags.ABSOLUTE), (leftSideOfSaperWindow + FIRST_WINDOW_X + x * (WINDOW_WIDTH + WINDOW_DIST) + WINDOW_WIDTH / 2) * 65536 / SCREEN_WIDTH,
                        (topSideOfSaperWindow + FIRST_WINDOW_Y + y * (WINDOW_HEIGHT + WINDOW_DIST) + WINDOW_HEIGHT / 2) * 65536 / SCREEN_HEIGHT, 0, 0);


            mouse_event((int)(MouseEventFlags.RIGHTDOWN), (leftSideOfSaperWindow + FIRST_WINDOW_X + x * (WINDOW_WIDTH + WINDOW_DIST) + WINDOW_WIDTH / 2) * 65536 / SCREEN_WIDTH,
                        (topSideOfSaperWindow + FIRST_WINDOW_Y + y * (WINDOW_HEIGHT + WINDOW_DIST) + WINDOW_HEIGHT / 2) * 65536 / SCREEN_HEIGHT, 0, 0);

            System.Threading.Thread.Sleep(10 * (Form1.mouseSpeed + SPEED_ADDER));

            mouse_event((int)(MouseEventFlags.RIGHTUP), (leftSideOfSaperWindow + FIRST_WINDOW_X + x * (WINDOW_WIDTH + WINDOW_DIST) + WINDOW_WIDTH / 2) * 65536 / SCREEN_WIDTH,
                        (topSideOfSaperWindow + FIRST_WINDOW_Y + y * (WINDOW_HEIGHT + WINDOW_DIST) + WINDOW_HEIGHT / 2) * 65536 / SCREEN_HEIGHT, 0, 0);
            if (Form1.version == Form1.SAPER_TYPE.XP)
            {
                if (SaperImageDetection.IfAnyChanges(field, rect, y, x) == false)
                {
                    FirstTimeRightClick(y, x, field);
                }
            }
            if (Form1.version == Form1.SAPER_TYPE.Seven)
            {
                if (SaperImageDetectionWindows7.IfAnyChanges(field, rect, y, x) == false)
                {
                    FirstTimeRightClick(y, x, field);
                }
            }
        }
Esempio n. 2
0
        //основной цикл игры, получает старую диспозицию и счетчик статистики
        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);
        }