Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SFML/Graphics.hpp>
- #include <SFML/Audio.hpp>
- #include <ctime>
- using namespace sf;
- int width = 32;
- int gridLogic[12][12];
- int gridView[12][12];
- bool selected = false; //true, когда игрок уже нажал на какое-либо поле
- bool end_game = false; //true, когда либо подорвались на мине, либо нашли все мины. Запускает процесс окончания игры
- int mines_found = 0;
- int mines = 0;
- int main()
- {
- RenderWindow app(VideoMode(320, 320), "Minesweeper!");
- srand(static_cast<unsigned int>(time(0)));
- SoundBuffer buffer;
- buffer.loadFromFile("C:\\Users\\ztsvm\\Downloads\\08699.ogg");
- SoundBuffer buffer1;
- buffer1.loadFromFile("C:\\Users\\ztsvm\\Downloads\\d9960b6b2c1ec5f.ogg");
- Sound sound;
- Texture t;
- t.loadFromFile("C:\\Users\\ztsvm\\Downloads\\tiles.jpg");
- Sprite s(t);
- //Создание мин и их распределение на поле
- for (int i = 1; i <= 10; i++)
- {
- for (int j = 1; j <= 10; j++)
- {
- gridView[i][j] = 10;
- if (rand() % 5 == 0) { gridLogic[i][j] = 9; mines++; }
- else gridLogic[i][j] = 0;
- }
- }
- //Подсчёт мин вокруг каждой клетки
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- int n = 0;
- if (gridLogic[i][j] == 9) continue;
- if (gridLogic[i + 1][j] == 9) n++;
- if (gridLogic[i][j + 1] == 9) n++;
- if (gridLogic[i - 1][j] == 9) n++;
- if (gridLogic[i][j - 1] == 9) n++;
- if (gridLogic[i + 1][j + 1] == 9) n++;
- if (gridLogic[i - 1][j - 1] == 9) n++;
- if (gridLogic[i + 1][j - 1] == 9) n++;
- if (gridLogic[i - 1][j + 1] == 9) n++;
- gridLogic[i][j] = n;
- }
- }
- //Задаёт стандартное отображение по началу игры
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- gridView[i][j] = 10;
- }
- }
- while (app.isOpen())
- {
- Vector2i pos = Mouse::getPosition(app);
- int x = pos.x / width;
- int y = pos.y / width;
- Event e;
- while (app.pollEvent(e))
- {
- if (e.type == Event::Closed) app.close();
- if (e.type == Event::MouseButtonPressed) {
- if (e.key.code == Mouse::Left) {
- gridView[x][y] = gridLogic[x][y];
- selected = true; //Указываем, что игрок выбрал какое-то поле
- }
- else if (e.key.code == Mouse::Right && gridView[x][y] != 11) {
- gridView[x][y] = 11;
- if (gridLogic[x][y] == 9 && gridView[x][y] == 11)mines_found++; } //Тег-флаг + проверка на правильность метки
- else
- {
- gridView[x][y] = 10;
- if (gridLogic[x][y] == 9 && selected == false) mines_found--; //Если кликнуть на флаг правой кнопкой мыши, флаг будет снят (если при этом это был правильный флажок, количество обнаруженных мин тоже уменьшаем)
- }
- }
- }
- app.clear(Color::White);
- //Проверка на мину
- if (selected == true) {
- if (e.key.code == Mouse::Left && gridLogic[x][y] == 9) //Если игрок выбрал поле с миной, завершаем игру
- {
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++) {
- gridView[i][j] = gridLogic[i][j];
- sound.setBuffer(buffer); //Траурный звук взрыва бомбы
- sound.play();
- end_game = true; //Запускаем конец игры
- }
- }
- }
- //Если мины нет, открывает случайные поля рядом
- else {
- sound.setBuffer(buffer1); //Звук вскрытия выбранного поля
- sound.play();
- int random = 1 + rand() % 2; //Генерируем случайный диапазон (от 1го до 3х) выскрытия случайых полей
- for (int s = x - random; s <= x + random; s++) //Цикл для вскрытия случайных полей
- {
- for (int d = y - random; d <= y + random; d++)
- {
- int n = 1 + rand() % 4; //Вероятность вскрытия поля составляет 25%
- if (n == 1 && gridLogic[s][d] != 9) gridView[s][d] = gridLogic[s][d]; //Проверяем на бомбу. Если её нет, открываем поле
- n = 0;
- }
- }
- }
- }
- //Проверка на то, нашёл ли игрок все мины
- if (mines_found == mines)
- {
- end_game = true;
- }
- //Отрисовка
- for (int i = 0; i < 10; i++)
- {
- for (int j = 0; j < 10; j++)
- {
- s.setTextureRect(IntRect(gridView[i][j] * width, 0, width, width));
- s.setPosition(i * width, j * width);
- app.draw(s);
- }
- }
- selected = false;
- app.display();
- }
- //Окно Game Over!
- if (end_game == true)
- {
- RenderWindow end(VideoMode(360, 60), "Game Over!"); //Создаём новое окошко
- Font font; //Новый шрифт
- font.loadFromFile("C:\\Windows\\Fonts\\Calibrib.ttf"); //передаем нашему шрифту файл шрифта
- while (end.isOpen())
- {
- Text text("", font, 17); //Создаём два текста
- Text record("", font, 17);
- if(mines_found != mines){ text.setString("The game is over! You lost!"); } //Если нашли все мины, то победа. В противном случае поражение:)
- else text.setString("The game is over! You win!");
- record.setString("Bombs found " + std::to_string(mines_found) + " from " + std::to_string(mines) + "!"); //Записываем в текст, сколько мин из возможных было найдено
- text.setFillColor(Color::Black);
- text.setPosition(Vector2f(10, 5));
- record.setFillColor(Color::Black);
- record.setPosition(Vector2f(10, 25));
- end.draw(text);
- end.draw(record);
- Event a;
- while (end.pollEvent(a))
- {
- if (a.type == Event::Closed) end.close();
- }
- end.clear(Color::White);
- end.draw(text);
- end.draw(record);
- end.display();
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement