Как сделать сапера на c
Перейти к содержимому

Как сделать сапера на c

  • автор:

Сапер

Всем, кто работает с операционной системой Windows, хорошо знакома игра «Сапер». В этом разделе рассматривается аналогичная программа.

Пример окна программы в конце игры (после того как игрок открыл клетку, в которой находится мина) приведен на рис. 11.7.

Рис. 11.7. Окно программы «Сапер»

Глава 11. Примеры программ

Правила и представление данных

Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока — найти все мины и пометить их флажками.

Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходит взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается. Если в клетке мины нет, то

в этой клетке появляется число, соответствующее количеству мин, находящихся

в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может обнаружить и пометить флажками все мины. Ограничений на количество клеток, помеченных флажками, нет. Однако для завершения игры (выигрыша) флажки должны быть установлены только в тех клетках, в которых есть мины. Ошибочно установленный флажок можно убрать, щелкнув правой кнопкой мыши в клетке, в которой он находится.

В программе игровое поле представлено массивом N + 2 на M + 2, где N M — размер игрового поля. Элементы массива с номерами строк от 1 до N и номерами столбцов от 1 до M соответствуют клеткам игрового поля (рис. 11.8), первые и последние столбцы и строки соответствуют границе игрового поля.

Рис. 11.8. Клетке игрового поля соответствует элемент массива

В начале игры каждый элемент массива, соответствующий клеткам игрового поля, может содержать число от 0 до 9. Ноль соответствует пустой клетке, рядом с которой нет мин. Клеткам, в которых нет мин, но рядом с которыми мины есть, соответствуют числа от 1 до 8. Элементы массива, соответствующие клеткам, в которых находятся мины, имеют значение 9.

Элементы массива, соответствующие границе поля, содержат –3.

Часть II. Практикум программирования

В качестве примера на рис. 11.9 изображен массив, соответствующий состоянию поля в начале игры.

Как это сделано: пишем «Сапера» за 4 минуты

image

От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.

«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Уникальность игры в том, что она очень простая и при этом весьма увлекательная. В «Сапере» нет никакой хитрой геймплейной механики, вы просто нажимаете на квадратики, надеясь, что под ними нет мины.

Предлагаю попробовать написать «Сапера» на Processing. Это отличный инструмент, который позволяет создавать графические приложения на Java. Ссылка на него вот здесь.

Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.

Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.

Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.

Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:

Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.

В итоге мы имеем следующий алгоритм:

  • Если позиция за пределами поля, end;
  • Если позиция раскрыта, end;
  • Раскрываем текущую позицию;
  • Если у нас бомба рядом с текущей позицией, end;
  • Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.

Если вы хотите узнать о визуализации, читайте дальше.

Визуализация

Здесь все должно быть понятно, но я объясню сложные части.

Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.

Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.

Затем мы возвращаем переменные в изначальное состояние.

Для инициализации поля:

И далее включаем реакцию на клики мышью.

И функция отображения, вызываем ее один раз для каждого кадра.

И все, вот и наш «Сапер».

Игра выглядит просто, но в целом она полностью функциональна. И помните: «Сапер» вызывает привыкание!

Name already in use

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Пример реализации стандартной игры «Сапер» (Minesweeper) на языке C#/WPF/MVVM

Статья с демонстрацией работы:

About

Resources

License

Stars

Watchers

Forks

Releases

Packages 0

Languages

Footer

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Создание игры «Сапер» на С++/SFML

Игра «Сапер» (англ. «Minesweeper») — это простая, но в то же время очень интересная игра-головоломка. В начале игры открывается поле, разделенное на ровные клетки, на котором спрятаны мины. Когда игрок кликает мышкой по произвольной клетке на поле, то в этой клетке появляется цифра, показывающая сколько мин спрятано по соседству. Анализируя эти цифры, можно понять, где спрятаны следующие мины. Затем на клетке (в которой игрок предполагает, что спрятана мина) ставится флажок для наглядного обозначения мины.

Таким образом, задача игрока — найти все мины, спрятанные на игровом поле, и при этом постараться не подорваться на них. А наша задача — разработать игру «Сапер» средствами графической библиотеки SFML и языка программирования С++.

Модель игрового поля

Начнем с графики. Для обозначения элементов игрового поля нам потребуются картинки закрытой клетки, открытой пустой клетки, флажка, мины и цифр от 1 до 8. Т.к. отдельными изображениями пользоваться не очень удобно, то будет лучше, если мы соединим их все в единую текстуру, а уже из нее по мере необходимости вырежем нужный элемент:

Размеры одного квадратного элемента текстуры составляют 32×32 пикселя. Размеры игрового поля — 10×10 квадратов.

Теперь перейдем непосредственно к написанию кода. Как вы уже наверняка знаете, минимальный каркас SFML-приложения имеет примерно следующий вид:

int gridLogic[12][12] — представляет логическую часть игрового поля;

int gridView[12][12] — отображает графическую составляющую игрового поля.

В коде это выглядит следующим образом:

Далее нужно создать спрайт из заготовленной текстуры и сформировать первоначальный вид игрового поля. Для этого, мы всем элементам массива gridView[i][j] присваиваем значение ( 10 ) соответствующего порядкового номера квадратика текстуры:

Добавим функцию отрисовки игрового поля:

И в результате получим вот такую заготовку:

Примечание: Если у вас ничего не отображается, то попробуйте прописать полный путь до файла текстуры. Например, вместо:

При этом у вас на компьютере должна быть папка C:\images , в которой должен находиться файл tiles.jpg .

Расстановка и подсчет мин

Для расстановки мин на игровом поле воспользуемся генератором случайных чисел с заданным диапазоном значений от 0 до 4 . Если выпадает ноль, то ставим мину ( 9 ), в противном случае — пустая клетка ( 0 ). Индексы 9 и 0 совпадают с порядковыми номерами соответствующих изображений в текстуре:

Дальше реализуем подсчет мин, окружающих каждую клетку. Для этого в двойном цикле for поочередно пройдемся по каждой клетке. Если в текущей клетке уже стоит мина, то просто переходим к новому шагу итерации. Если же в текущей клетке мины нет, то с помощью девяти условий if поочередно проверяем все примыкающие к ней клетки. Если там есть мины, то на каждом сработавшем if увеличиваем счетчик количества мин на 1 :

Посмотрим, что у нас получилось. Для этого добавим строку gridView[i][j] = gridLogic[i][j] , тем самым отобразив всё поле на экране:

Результат выполнения программы:

Примечание: Учитывайте, что расстановка мин генерируется случайным образом. Поэтому ваш результат запуска программы наверняка будет отличаться от того, что изображено на вышеприведенной картинке.

Обработка нажатий кнопок мыши

Теперь добавим функции обработки нажатия левой клавиши мыши (далее — ЛКМ) и установки флажка по щелчку правой клавиши мыши (далее — ПКМ). Если по нажатию ЛКМ мы открыли клетку, а там находится мина, то следом открываем всё поле — игра окончена:

Настало время запустить приложение «Сапер» и посмотреть на готовый игровой процесс:

Заключение

Вот такое небольшое и довольно-таки простое приложение можно написать, используя C++ и SFML. Конечно, наша игра далека от идеала и не лишена недостатков. Например, алгоритм игры не исключает ситуации, когда игрок может проиграть уже на первом ходу. Также отсутствуют такие элементы игрового процесса, как: таймер обратного отсчета, кнопки перезапуска и паузы игры, подсчет уже отмеченных игроком мин и т.д. Возможно, мы рассмотрим реализацию подобных механизмов в следующих статьях, но ничего не мешает и вам самим попробовать добавить данный функционал. Как говорится, дорога в тысячу миль начинается с первого шага. Этот первый шаг мы сделали вместе, а дальше — дело за вами.

Примечание: Статья написана по мотивам одноименного видеоролика за авторством FamTrinli.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *