示例#1
0
        //запуск бесконечного цикла с игрой
        public static void SaperGame()
        {
            int[,] oldTableOfNumbers = new int[16, 30];
            FillTableWithEmptyCells(oldTableOfNumbers);
            SaperStatistics counter = new SaperStatistics();

            for (; ;)
            {
                oldTableOfNumbers = GameIteration(oldTableOfNumbers, counter);
            }
        }
示例#2
0
 //проверяет, выиграли ли мы, если в течение 20 секунд не закрыть программу, то начнет новую игру
 public bool IfVictory(SaperStatistics counter)
 {
     if (field.numberOfNotOpened == 0)
     {
         if (Form1.statisticsOn == true)
         {
             counter.StatisticForVictory();
         }
         System.Threading.Thread.Sleep(TIME_TO_BEGIN_NEW_GAME * 1000);
         IfRecord();
         mouse.NewGame();
         return true;
     }
     return false;
 }
示例#3
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);
        }
示例#4
0
 //проверяет, подорвались ли мы, если в течение 4 секунд не закрыть программу, то начнет новую игру
 public bool IfGameOver(SaperStatistics counter)
 {
     SaperCell[,] saperField = field.GetSaperField();
     for (int i = 0; i < 16; ++i)
         for (int j = 0; j < 30; ++j)
         {
             if (saperField[i, j].value == 10)
             {
                 if (Form1.statisticsOn == true)
                 {
                     counter.StatisticForGameOver(field.numberOfMines);
                 }
                 System.Threading.Thread.Sleep(TIME_TO_BEGIN_NEW_GAME * 1000);
                 mouse.NewGame();
                 return true;
             }
         }
     return false;
 }