Сапер, или как открыть несколько пустых смежных клеток
Всем доброго дня\вечера\утра.
Озадачился написать игру «Сапер» (аналог того, что есть у большинства людей на компутерах).
В итоге, у меня есть почти рабочий код (кроме нек-ых недоделанных моментов, но это не столь важно). И вот уже ближе к концу я столкнулся с проблемой, которую мой мозг не способен разрешить — если мы тыкаем на клеточку, где 0 мин рядом, как открыть все клеточки рядом с ней? Делаю через элемент Button, к-ый играет роль клеточки поля. К-во баттонов создается столько, сколько мы пожелаем сами. Пытался сделать массив баттонов, но не получилось.
Есть одна мысль, к-ую никак не могу реализовать. В коде у меня создаются метки (сделаны для цветных цЫфЫрок), к-ые ставятся поверх нажатой кнопки. Но метку не видно, ибо похоже, что кнопка «поверх всего». Свойство я не нашел. Если можно как-то заставить быть метку поверх других объектов, может быть, все было бы замечательно.
Ну или другой какой вариант.
Непосредственно коды:
Хэдер основной формы:
Открытие пустых клеток в игре «сапёр»
Помогите пожалуйста, никак не получается правильно открыть пустые клетки областями до цифр, как в.
Проверка смежных клеток, максимум из всех возможных вариантов
Задана некоторая плоскость NxM. Каждой клетке поля соответствует некоторое число. Фишка, начиная.
Сапер. Открытие клеток без мин
Конечно есть много тем по этому поводу, но из них мне ни как не удалось извлечь решение моего.
Игра сапёр (рекурсивное открытие клеток)
procedure Openk(i1,j1:integer); begin if (mas=0)and(i1 =0) and (j1 =0).
Создание игры «Сапер» на С++/SFML
Обновл. 22 Фев 2021 |
Игра «Сапер» (англ. «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.
Поделиться в социальных сетях:
Часть №3: Создание игры «Тетрис» на С++/SFML
Комментариев: 3
Спасибо, в детстве все мечтали сами переписать эти игры самому — мечта сбылась!
У меня есть вопрос: вот эта конструкция, которая гоняет главный игровой цикл приложения
вешает проц на 100%. Ну, 1 ядро, но будь ей доступны оба, повесила бы оба. Наверняка в реальных играх устроено иначе. Очень хотелось бы узнать как.
P.S. Немножко не получилось у меня, буду искать причину 🙂 вот так вышло https://skr.sh/s5wvsyM3KIH
По поводу загрузки уже примерно нашел:
Вторая ссылка вроде четче. Кратко: тоже используется while (true), но код большую часть времени «спит» и просыпается только тогда, когда возникает событие. Именно так работает стандартный Сапёр из Windows: загрузка проца держится на 0 и изредка подпрыгивает до 1%.
Используя эти идеи, сумел заварганить! Теперь проца кушает ровно 0 – event-driven подход в действии!
Кратко – просто заменил функцию pollEvent() на waitEvent() и немного переставил часть кода. Ф-я waitEvent() блокирует поток и ждет события — то, что нам в данном случае нужно. Также добавил: при взрыве все игровое поле открывается.
Жаль только, что при проверке, есть ли рядом мина, мы выходим за границы массива. Это не есть хорошо.
Игра «Сапер»
Игра «сапер» с использованием многомерных массивов
Создать игру «сапер» с использованием многомерных массивов
Игра «Змейка», ошибка «Globals.Close не объявлен», неправильная логика игры
Нашёл в интернете код игры «змейка» и саму скомпилированную игру. Но есть загвоздка. А точнее две.
Известны сорта роз, выращиваемых тремя цветоводами: «Анжелика», «Виктория», «Гагарин», «Ave Maria», «Катарина», «Юбилейн
Известны сорта роз, выращиваемых тремя цветоводами: «Анжелика», «Виктория», «Гагарин», «Ave.
Дан массив строк: «red», «green», «black», «white», «blue». Запишите в файл элементы массива построчно (в новой строке)
пишу так но не помогает: static void Main(string args) < string.
лучше всего для этого делать массив кнопок.
Тут можно использовать полиморфизм (абстрактный класс и несколько наследников).
По хорошему счету — все тоже самое, что в консоли, только добавляется графика.
В общем пока наваял 2 класса:
Ячейка минного поля
Минное поле наследуется от мины? Оставлю этот коммент на вашей совести.
Идея хорошая, и MyButton как раз должен содержать всю те свойства / метода, что есть в Cell
тоже об этом думаю, но как только делаю protected, то сразу теряю доступ в минном поле(. ). Думаю тут ошибка более глобальная , нужно все переписать под MyButton.
Посмотрите примеры реализаций игр «2048» и «15» по ссылке в подписи моего поста.
Добавлено через 18 минут
m054, если вам нужно именно WPF, то предлагаемые выше коды для Форм вряд ли подойдут.
В WPF не используется Code Behind.
Все данные в Окно поступают через Контекст Данных.
Типовым для WPF является реализация паттерна MVVM.
В нём в Контекст Данных передаётся ViewModel.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Напишите программу, отображающую игровое поле для игры «Сапер»
Здравствуйте, помогите решить данную задачу из университета: Сапер Входные данные: Даны числа N.
Написать программу, подобную игре «Сапер»
Игра сапер.задан массив 10х10 заполненый нулями.в этот массив задают в случайные координаты десять.
Открытие пустых клеток в игре «сапёр»
Помогите пожалуйста, никак не получается правильно открыть пустые клетки областями до цифр, как в.
Нюансы алгоритма игры «Сапер»
Опять про сапер. Когда играешь в виндовый сапер то при нажатии на пустую клеточку все рядом.
Описать класс «поезд», содержащий поля «пункт назначения», «номер поезда», «время отправления»
Помогите пожалуйста с классом Описать класс «поезд», содержащий следующие закрытые поля.
Построить иерархию классов «Студент», «преподаватель», «персона», «заведующий кафедрой»
Построить иерархию классов: Студент, преподаватель, персона, заведующий кафедрой 1) Разработать.
Как это сделано: пишем «Сапера» за 4 минуты
От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.
«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».
Уникальность игры в том, что она очень простая и при этом весьма увлекательная. В «Сапере» нет никакой хитрой геймплейной механики, вы просто нажимаете на квадратики, надеясь, что под ними нет мины.
Предлагаю попробовать написать «Сапера» на Processing. Это отличный инструмент, который позволяет создавать графические приложения на Java. Ссылка на него вот здесь.
Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.
Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.
Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.
Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:
Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.
В итоге мы имеем следующий алгоритм:
- Если позиция за пределами поля, end;
- Если позиция раскрыта, end;
- Раскрываем текущую позицию;
- Если у нас бомба рядом с текущей позицией, end;
- Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.
В принципе, вся остальная игра представляет собой то же самое. Полный код можно найти, перейдя по этой ссылке.
Если вы хотите узнать о визуализации, читайте дальше.
Здесь все должно быть понятно, но я объясню сложные части.
Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.
Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.
Затем мы возвращаем переменные в изначальное состояние.
Для инициализации поля:
И далее включаем реакцию на клики мышью.
И функция отображения, вызываем ее один раз для каждого кадра.
И все, вот и наш «Сапер».
Игра выглядит просто, но в целом она полностью функциональна. И помните: «Сапер» вызывает привыкание!
Datagridview игра сапер
помогите сделать так что можно было задавать сколько бом в поле и когда я получается нахожу бомбу игра не только показывал вы проиграли но и блокировала что нельзя было дальше играть
Добавлено через 2 минуты
Игра сапер
Делаю игру сапер. Есть такая проблема делаю в игре «уровень ложности» и программа то выдает то не.
Сапер с DataGridView
В задачи:у нас есть поле datagrid 10*10 и две кнопки, одна заполняет поле (которое состоит из 0 и.
Игра «Сапер»: MouseEnter и MouseLeave не генерируются при зажатой кнопке мыши
Здравствуйте, пытаюсь написать «Сапер» где в роли квадратиков я использую picturebox. Проблема.
Рисование поля в игре Сапер
Можете подсказать. пишу игру сапер, добавил выбор режима поля. Допустим когда я выбираю 5на5 поле.
Добавлено через 4 часа 0 минут
Немного перепилил свой вариант без грида:
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
игра сапер
Доброго времени суток, господа! У меня следующая проблема: есть код программы на C++ MFC — игра.
Игра Сапер
Надо написать игру Сапер. Дайте советы как правильно все организовать. Всю игру построить из.
Игра Сапер
Добрый день! Я начал писать игру Сапер на языке C# с использованием wpf, с которым я ранее не.
Игра Сапер
Срочно нужна игра Сапер на Visual C++?