Advertisement
Guest User

Minesweeper!

a guest
Sep 6th, 2021
1,099
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <SFML/Audio.hpp>
  3. #include <ctime>
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10. using namespace sf;
  11. int width = 32;
  12. int gridLogic[12][12];
  13. int gridView[12][12];
  14. bool selected = false;                  //true, когда игрок уже нажал на какое-либо поле
  15. bool end_game = false;                  //true, когда либо подорвались на мине, либо нашли все мины. Запускает процесс окончания игры
  16. int mines_found = 0;
  17. int mines = 0;
  18.  
  19.  
  20. int main()
  21. {
  22.     RenderWindow app(VideoMode(320, 320), "Minesweeper!");
  23.  
  24.    
  25.  
  26.  
  27.  
  28.     srand(static_cast<unsigned int>(time(0)));
  29.     SoundBuffer buffer;
  30.     buffer.loadFromFile("C:\\Users\\ztsvm\\Downloads\\08699.ogg");
  31.     SoundBuffer buffer1;
  32.     buffer1.loadFromFile("C:\\Users\\ztsvm\\Downloads\\d9960b6b2c1ec5f.ogg");
  33.     Sound sound;
  34.     Texture t;
  35.     t.loadFromFile("C:\\Users\\ztsvm\\Downloads\\tiles.jpg");
  36.     Sprite s(t);
  37.  
  38.  
  39.     //Создание мин и их распределение на поле
  40.     for (int i = 1; i <= 10; i++)
  41.     {
  42.         for (int j = 1; j <= 10; j++)
  43.         {
  44.             gridView[i][j] = 10;
  45.             if (rand() % 5 == 0) { gridLogic[i][j] = 9; mines++; }
  46.             else gridLogic[i][j] = 0;
  47.         }
  48.     }
  49.  
  50.     //Подсчёт мин вокруг каждой клетки
  51.     for (int i = 0; i < 10; i++)
  52.     {
  53.         for (int j = 0; j < 10; j++)
  54.         {
  55.             int n = 0;
  56.             if (gridLogic[i][j] == 9) continue;
  57.             if (gridLogic[i + 1][j] == 9) n++;
  58.             if (gridLogic[i][j + 1] == 9) n++;
  59.             if (gridLogic[i - 1][j] == 9) n++;
  60.             if (gridLogic[i][j - 1] == 9) n++;
  61.             if (gridLogic[i + 1][j + 1] == 9) n++;
  62.             if (gridLogic[i - 1][j - 1] == 9) n++;
  63.             if (gridLogic[i + 1][j - 1] == 9) n++;
  64.             if (gridLogic[i - 1][j + 1] == 9) n++;
  65.             gridLogic[i][j] = n;
  66.         }
  67.     }
  68.  
  69.  
  70.     //Задаёт стандартное отображение по началу игры
  71.     for (int i = 0; i < 10; i++)
  72.     {
  73.         for (int j = 0; j < 10; j++)
  74.         {
  75.             gridView[i][j] = 10;
  76.         }
  77.     }
  78.  
  79.  
  80.  
  81.     while (app.isOpen())
  82.     {
  83.  
  84.         Vector2i pos = Mouse::getPosition(app);
  85.         int x = pos.x / width;
  86.         int y = pos.y / width;
  87.  
  88.         Event e;
  89.  
  90.         while (app.pollEvent(e))
  91.         {
  92.             if (e.type == Event::Closed) app.close();
  93.  
  94.             if (e.type == Event::MouseButtonPressed) {
  95.                 if (e.key.code == Mouse::Left) {
  96.                     gridView[x][y] = gridLogic[x][y];
  97.                     selected = true;                                //Указываем, что игрок выбрал какое-то поле
  98.                 }
  99.                 else if (e.key.code == Mouse::Right && gridView[x][y] != 11) {
  100.                     gridView[x][y] = 11;
  101.                     if (gridLogic[x][y] == 9 && gridView[x][y] == 11)mines_found++; }           //Тег-флаг + проверка на правильность метки
  102.                
  103.                 else
  104.                 {
  105.                     gridView[x][y] = 10;
  106.                     if (gridLogic[x][y] == 9 && selected == false) mines_found--;               //Если кликнуть на флаг правой кнопкой мыши, флаг будет снят (если при этом это был правильный флажок, количество обнаруженных мин тоже уменьшаем)
  107.                 }
  108.             }
  109.         }
  110.  
  111.  
  112.         app.clear(Color::White);
  113.  
  114.  
  115.         //Проверка на мину
  116.         if (selected == true) {
  117.             if (e.key.code == Mouse::Left && gridLogic[x][y] == 9)          //Если игрок выбрал поле с миной, завершаем игру
  118.             {
  119.                 for (int i = 0; i < 10; i++)
  120.                 {
  121.                     for (int j = 0; j < 10; j++) {
  122.                         gridView[i][j] = gridLogic[i][j];
  123.                         sound.setBuffer(buffer);                            //Траурный звук взрыва бомбы
  124.                         sound.play();
  125.                         end_game = true;                                    //Запускаем конец игры
  126.  
  127.  
  128.                     }
  129.                 }
  130.  
  131.             }
  132.  
  133.             //Если мины нет, открывает случайные поля рядом
  134.             else {
  135.                 sound.setBuffer(buffer1);                                   //Звук вскрытия выбранного поля
  136.                 sound.play();
  137.                 int random = 1 + rand() % 2;                                //Генерируем случайный диапазон (от 1го до 3х) выскрытия случайых полей
  138.                 for (int s = x - random; s <= x + random; s++)              //Цикл для вскрытия случайных полей
  139.                 {
  140.                     for (int d = y - random; d <= y + random; d++)
  141.                     {
  142.                         int n = 1 + rand() % 4;                             //Вероятность вскрытия поля составляет 25%
  143.                         if (n == 1 && gridLogic[s][d] != 9) gridView[s][d] = gridLogic[s][d];       //Проверяем на бомбу. Если её нет, открываем поле
  144.                         n = 0;
  145.                     }
  146.                 }
  147.  
  148.             }
  149.  
  150.         }
  151.  
  152.         //Проверка на то, нашёл ли игрок все мины
  153.  
  154.         if (mines_found == mines)
  155.         {
  156.             end_game = true;
  157.         }
  158.  
  159.         //Отрисовка
  160.         for (int i = 0; i < 10; i++)
  161.         {
  162.             for (int j = 0; j < 10; j++)
  163.             {
  164.  
  165.                 s.setTextureRect(IntRect(gridView[i][j] * width, 0, width, width));
  166.                 s.setPosition(i * width, j * width);
  167.                 app.draw(s);
  168.  
  169.             }
  170.         }
  171.         selected = false;
  172.  
  173.         app.display();
  174.     }
  175.  
  176.  
  177.     //Окно Game Over!
  178.  
  179.     if (end_game == true)
  180.     {
  181.         RenderWindow end(VideoMode(360, 60), "Game Over!");             //Создаём новое окошко
  182.         Font font;                                                      //Новый шрифт
  183.         font.loadFromFile("C:\\Windows\\Fonts\\Calibrib.ttf");          //передаем нашему шрифту файл шрифта
  184.  
  185.         while (end.isOpen())
  186.         {
  187.             Text text("", font, 17);                                    //Создаём два текста
  188.             Text record("", font, 17);
  189.             if(mines_found != mines){ text.setString("The game is over! You lost!"); }              //Если нашли все мины, то победа. В противном случае поражение:)
  190.             else  text.setString("The game is over! You win!");
  191.            
  192.             record.setString("Bombs found " + std::to_string(mines_found) + " from " + std::to_string(mines) + "!");                        //Записываем в текст, сколько мин из возможных было найдено
  193.  
  194.             text.setFillColor(Color::Black);
  195.             text.setPosition(Vector2f(10, 5));
  196.  
  197.             record.setFillColor(Color::Black);
  198.             record.setPosition(Vector2f(10, 25));
  199.  
  200.             end.draw(text);
  201.             end.draw(record);
  202.             Event a;
  203.             while (end.pollEvent(a))
  204.             {
  205.                 if (a.type == Event::Closed) end.close();
  206.             }
  207.             end.clear(Color::White);
  208.             end.draw(text);
  209.             end.draw(record);
  210.             end.display();
  211.  
  212.  
  213.         }
  214.        
  215.     }
  216.     return 0;
  217. }
  218.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement