Реализация алгоритма Сапера
Наткнулся в интернете на реализацию сапера, но сразу понял, что работает он немного не так, как нужно. (А точнее открывает с одного клика почти все поле) Пытался сам исправить, но все тщетно. Вот сам код реализации открытие полей. . Вот так реализуется раставление мин
#define FIELD_X 19 #define FIELD_Y 19 int field[FIELD_X][FIELD_Y]; void putMines() //Рандомно раскладываем мины < for(int z=0;z>
Вот так реализуется прорисовка клеток
app.clear(sf::Color(255,255,255)); for(int yqwe = 1; yqwe case 2: case 3: case 4: case 5: case 6: case 9: case 0: case 10: > > else //Иначе рисуем флажок sprite.setPosition((zqwe-1)*30,(yqwe-1)*30); app.draw(sprite); > > app.draw(exit.button); app.draw(exit.text); app.draw(newGame.button); app.draw(newGame.text); app.draw(settings.button); app.draw(settings.text); if (settingsWindow) < app.draw(setWin.title); app.draw(setWin.leftBorder); app.draw(setWin.rightBorder); app.draw(setWin.botBorder); app.draw(setWin.body); >if (lose) < app.draw(loseWin.title); app.draw(loseWin.leftBorder); app.draw(loseWin.rightBorder); app.draw(loseWin.botBorder); app.draw(loseWin.body); >app.display();
Сапер на С++
Здравствуйте, я начал делать сапера на С++, простого, без функций итд, просто в мейне. Пока я только на этапе прощета количества бомб, но он у меня не получается. Очень прошу о помощи, если есть какие либо вопросы, пишите.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
#include #include #include #include #include #include using namespace std; int main() { srand(time(NULL)); int count = 0; int arr[7][7]{}; for (int i = 0; i 7; i++) { for (int j = 0; j 7; j++) { arr[i][j] = 0; } } for (int i = 0; i 6; i++) { for (int j = 0; j 6; j++) { if (count 7) { arr[i][j] = rand() % 2; if (arr[i][j] == 1) { count++; } } } } int bombs = 0; for (int i = 0; i 5; i++) { for (int j = 0; j 5; j++) { bombs = 0;; if (arr[i][j] == 0) { for (int k = -1; k 1; k++) { for (int n = -1; n 1; n++) { if (k != i&&j != n) { if (arr[i+k][j+n] == 1) { bombs++; } } } } arr[i][j] = bombs; } } } for (int i = 0; i 5; i++) { for (int j = 0; j 5; j++) { cout [ i][j]; } cout ; } }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Сапер
Доброго времени суток! Хотел узнать, может у кого завалялись исходники игры "сапер" на Java?
Сапер
Сделать игру сапера: 1) нарисовать доску функция с 2 параметрами(доска и количество.
C# сапёр
в общем написал сапёра но логика на главной форме , а препод заставил убрать абсолютно всю логику с.
Сапер на С++
помогите пожалуйста переделать игру сапер, программа работает, осталось оформить ее с классом.
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
Сообщение от Prrrya
Очень прошу о помощи, если есть какие либо вопросы, пишите.
Так нам вам помочь надо или вопросы задавать?
Регистрация: 10.04.2019
Сообщений: 10
Помочь, но если возникают вопросы, то пишите
Я уже исправил, но не до конца. У меня в коде, если вводить х и 5, то Выводятся одинаковые число(Не рандомятся), кроме того есть мусор.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
#include #include using namespace std; int main() { setlocale(LC_ALL, "Russian"); srand(time(NULL)); const int width = 5; const int height = 5; const int bombs = 10; int field[height][width] = {}; int numOfBombs = 0; int ax; int ay; //расстановка бомб for (int i = 0; i bombs; i++) { field[(rand() % height)+1 ][(rand() % width) +1] = 9; } //расстановка цифр на поле for (int i = 0; i height; i++) else { if (field[k][l] == 9) { numOfBombs++; } } } } field[i][j] = numOfBombs; numOfBombs = 0; } } } //вывод поля for (int i = 0; i height; i++) { for (int j = 0; j width; j++) { cout <"*" <" "; } cout ; } while (true) { cout <"Please, enter x\n"; cin >> ax; if (ax > 0 && ax width)break; } while (true) { cout <"Please, enter y\n"; cin >> ay; if (ay > 0 && ay height)break; } while (field[ay][ax] != 9) { system("cls"); for (int i = 1; i height; i++) { for (int j = 1; j width; j++) { if (ax == j && ay == i) { cout [ i][j] <" "; } else { cout <"*" <" "; } } cout ; } while (true) { cout <"Please, enter x\n"; cin >> ax; if (ax > 0 && ax width)break; } while (true) { cout <"Please, enter y\n"; cin >> ay; if (ay > 0 && ay height)break; } } }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Сапер
Кто подскажет как сделать в сапере чтобы он выводил в конце игры время за которое ты прошел, и.
сапер
подскажите,как из этой программы сделать сапер uses crt,graphABC; var i,j,d,w,h:integer; .
Сапер на С++
Помогите написать программу. Вводим размерность поля,задаем координаты мин и соответственно их.
Сапер на C++
Народ хочу попробовать написать игру сапер. Не могу понять как мне расставить программно 100 кнопок.
Сапер
Добрый День. Пишу сапера и столкнулся с проблемами. Компилируется удачно и запускается тоже,но вот.
Сапёр
Недавно написал сапёра, всё было здорово, пока не дал поиграть другу. Он нашёл баг) В общем.
Или воспользуйтесь поиском по форуму:
Как решить «Сапёра» (и сделать его лучше)
«Сапёр» (Minesweeper) — это простая игра с простыми правилами, однако некоторые её конфигурации создают любопытные трудности. В этой статье мы создадим солвер «Сапёра» с увеличивающейся сложностью, и поразмышляем над тем, как меняется динамика игры при постепенном повышении уровня помощи. В конце мы разработаем новый вариант игры с гораздо более интересным геймплеем.
Локальные рассуждения: ноль соседних мин
В оригинальной игре используется один автоматический механизм: когда игрок открывает клетку, рядом с которой нет мин, движок игры открывает все соседние клетки. Это ничем не угрожает игре, поэтому можно спокойно позволить компьютеру это сделать, а сама ситуация сразу же понятна игроку и никак не мешает геймплею.
Такое рассуждение совершенно локально: для принятия решения о следующем действии учитывается информация только одной клетки.
Сложно придумать ситуацию, в которой игра стала бы хуже без этой автоматической помощи. Попробуйте сыграть в такую игру, чтобы получить представление о том, как она проходит без автоматического открытия клеток [в оригинале статьи все примеры интерактивны] :
Локальные рассуждения с учётом окружения
Новому игроку несложно будет понять, что если количество соседних мин, то есть число, показанное в клетке, равно количеству неоткрытых соседних клеток, то все эти клетки должны быть минами, поэтому на них надо поставить флажки. Аналогично, когда количество соседних мин равно количеству соседних флагов, то оставшиеся неоткрытыми соседние клетки должны быть пусты.
В этих правилах учитывается одна клетка, а также состояние соседних (открыты/поставлен флажок).
Реализация этих правил вручную может быть увлекательной. Если добавить таймер, то игрок начинает учиться применять их быстро и точно. Это превращает «Сапёра» в игру на реакцию. Что произойдёт, если мы автоматизируем эти правила?
У подобной автоматизации есть интересный побочный эффект — установка флажка может мгновенно иметь фатальные последствия.
В остальном у нас могут возникнуть ситуации, которые можно разбить на три категории:
- Игры, полностью разрешаемые применением автоматических правил
- Сложные ситуации, требующие для рассуждений большего количества клеток
- Состояния игры, в которых нет логического пути вперёд — игроку остаётся только выбирать случайно, возможно с учётом вероятностей.
Очень привлекательной мне кажется ситуация 2. Мы больше сосредотачиваемся на решении логических условий, меньше тратя время на точное прицеливание и нажимание правильных кнопок. Это делает «Сапёра» больше похожим на активную головоломку.
Ситуация 3 полностью разрушает всю увлекательность. Впрочем, я слышал, что некоторым людям нравится играть в игры со случайностью.
Можно ли избавиться от ситуации 3?
Полное решение: глобальные рассуждения
Для алгоритмического обнаружения всех необходимых для состояния игры логических условий нам нужно выполнить исчерпывающий поиск всех состояний игры. Доказано, что Minesweeper — это NP-полная задача. Ниже показан небольшой, но интересный и наглядный пример состояния игры, имеющий всего одно логическое решение, но для его нахождения необходимо учитывать состояние игры целиком:
Возможно ли выполнить поиск по всему пространству состояний игры? Сколько всего существует вариантов состояний s?
w = ширина поля
h = высота поля
k = количество мин
Тогда количество возможных состояний s равно
Для стандартных уровней «Новичок», «Любитель» и «Профессионал» это даёт нам:
Мы понимаем, что наивный подход здесь совершенно не подходит. Давайте посмотрим, как бы мог выглядеть наивный алгоритм, и узнаем, можно ли его оптимизировать в нечто работающее.
Наивный алгоритм
Задача алгоритма — найти все необходимые для заданного состояния поля логические условия. Было бы сложно реализовать это тщательным продумыванием решений; компьютер гораздо лучше справляется с быстрым выполнением кучи глупых действий.
Что мы можем сделать «глупого»: сгенерировать все возможные перестановки позиций мин для всех оставшихся мин. Если такая перестановка соответствует всем открытым числам, то она будет правильным решением игры. Затем мы изучаем все возможные перестановки, находим все возможные решения, но по-прежнему не знаем, какое из них является верным.
Если во всех возможных решениях есть что-то общее, или среди открытых клеток, или среди клеток, помеченных как мины, то мы понимаем, что это общее должно быть частью верного решения для текущего поля. И в самом деле: невозможно создать верного решения, не имеющего таких совпадающих элементов, иначе бы мы их обнаружили.
Таким образом мы можем найти все необходимые для текущего состояния поля логические условия.
Клетки с ограничениями и без ограничений
У приведённого выше алгоритма есть очевидная проблема: количество состояний, которое ему нужно исследовать. Но не все клетки одинаковы. Неоткрытые клетки, находящиеся рядом с числом, очевидно ограничены этим числом. Мы назовём эти клетки ограниченными. Оставшиеся клетки мы назовём неограниченными.
Если мы реализуем приведённый выше алгоритм, но будем выполнять поиск только в пространстве состояний ограниченных клеток, и будем возвращаться назад, как только нарушим ограничение, то во многих играх сможем решить все логические условия за разумный промежуток времени:
В случае неограниченных клеток мы никак не можем узнать, где расположены мины, и логически сразу знаем об этом. Это означает, что можно исключить их из вычисления и рассматривать только расположение мин рядом с открытыми числами.
Однако мы знаем, что некое количество мин может попасть во множество неограниченных клеток; если есть 6 мин и 4 ограниченных клетки, то в ограниченных клетках может быть максимум 4 мины, то есть не менее 2 мин должно находиться в неограниченных клетках. По аналогичной логике мы иногда можем определить, что все неограниченные клетки должны быть пустыми или все содержать мины.
В показанном ниже случае мы знаем позиции всех мин, поэтому ИИ должен быть способен понять, что оставшиеся ячейки не заняты:
В следующем случае мы не знаем позиций всех мин, но можем понять, что оставшуюся мину нужно поместить в одну из двух клеток слева вверху. Это значит, что оставшаяся в правом нижнем углу клетка свободна:
Версия со случайностью
Если мы автоматически будем запускать глобальный солвер, то получим оптимизированную по случайности версию «Сапёра»:
Можно разделить игры в этой версии на три категории:
- Игры, в которых игрок делает произвольный выбор и выигрывает.
- Игры, в которых игрок делает произвольный выбор и проигрывает.
- Игры, в которых работа ИИ требует много времени, и игрок на самом деле может использовать рассуждения.
Но какая из игр со случайностями лучше? Похоже, что смысл других игр со случайностями заключается в существовании сложной связи между действиями игрока и победой/проигрышем. Для вытягивания номеров лотереи используются сложные машины, которые специально не торопятся в выборе номера и делают из показа этого номера целое шоу.
Возможно, большое поле, которое решается автоматически, является довольно хорошей игрой
со случайностями, учитывая то, что игрок наблюдает за постепенным открыванием всех клеток.
Можем ли мы придумать другой тип игры?
Детерминированная версия
Теперь у нас есть ИИ, способный определять все логичные шаги из заданного состояния игры. Иногда он не сможет находит логичных шагов. В таких ситуациях игроку приходится угадывать и он может проиграть, если ему не повезёт.
Что если мы добавим ещё одно правило? Когда у игры нет логичного пути вперёд, то мы можем попросить о помощи. Если ИИ соглашается, что игрок не может ничего поделать, то приходит ему на помощь. В противном случае игрок немедленно проигрывает. Это может быть интересным. Какой может быть такая помощь? Возможно, нужно открыть одну клетку, вне зависимости от наличия в ней мины:
Таким образом, мы полностью избавились от ситуаций, в которых можно было проиграть случайно.
Однако тут есть одно исключение: по-прежнему существует вероятность вырожденных ситуаций, в которых глобальный солвер не может закончить вычисления за разумный промежуток времени. К сожалению, это неизбежный результат того, что задача «Сапёра» NP-полная.
Как кнопка «Попросить помощи» влияет на игровой процесс? Она приводит тому, что игра больше сосредотачивается на логике; это самый «головоломный» вариант «Сапёра». Кто-то может подумать, что игра станет проще, но на самом деле она усложняется. Теперь ошибкам игрока нет оправданий, и кнопка накажет его, если он что-то упустил. Без кнопки легко прийти к выводу, что ты исчерпал все логичные возможности и единственный вариант развития событий — попытаться угадать случайным образом. Но из-за существования кнопки игрок обязан быть прав в этой оценке.
В заключение
Реализовав полный солвер «Сапёра», мы смогли создать разновидность игры, избавленной от её проклятья: теперь невозможно проиграть из-за того, что приходится выбирать случайно, когда уже почти решил всё поле. Эта версия отличается от оригинальной игры только в те моменты, когда нужно угадывать случайным образом, поэтому могу предположить, что она намного увлекательнее, чем оригинальная игра.
Кроме того, мы разработали вариант игры, автоматически решающий простые локальные правила. Стоит ли использовать такую помощь — зависит только от вас. Она смещает фокус игры с механического щёлканья к более головоломному игровому процессу. При этом необязательно пользоваться усовершенствованием геймплея, которое обеспечивает кнопка «Попросить помощи».
- сапер
- minesweeper
- логические игры
- геймплейная логика
- Разработка игр
- Алгоритмы
- Логические игры
Как сделать сапера на C: Подробная инструкция
Сапер — одна из самых популярных игр в мире. Эта простая и увлекательная игра требует от игрока логического мышления и умения прогнозировать возможные ходы. Но что если вы хотите создать собственную версию игры сапер? С этим руководством для начинающих вы сможете написать игру сапер на языке программирования C.
Процесс создания игры сапер включает несколько шагов. В первую очередь, вы должны разработать игровое поле, на котором будут располагаться мины. Затем вам понадобится добавить функционал для открытия ячеек на поле, проверки наличия мин и расчета количества мин вокруг каждой открытой ячейки. Наконец, вам нужно будет добавить условия победы и поражения.
При создании игры сапер вам потребуются некоторые базовые знания языка программирования C, такие как работа с массивами, циклы и условные операторы. Однако, даже если вы только начинаете изучать язык C, это руководство поможет вам освоить основы программирования и создать свою собственную игру сапер.
Ввод в программирование игр: руководство для начинающих
Программирование игр — увлекательное и интересное занятие, которое позволяет воплотить в жизнь свои творческие идеи. Если вы только начинаете свой путь в программировании игр, то этот руководство поможет вам разобраться с основными понятиями и принципами разработки игровых проектов.
1. Выбор языка программирования
Первым шагом на пути к созданию игры является выбор языка программирования. Существует множество языков, которые подходят для разработки игр, включая C++, C#, Java, Python и другие. Выбор языка зависит от ваших предпочтений и ожидаемой целевой платформы.
2. Изучение основ программирования
Перед тем, как приступить к созданию игры, необходимо изучить основы программирования. Это включает в себя понимание переменных, операторов, циклов, условных выражений и других базовых концепций. Рекомендуется начать с изучения языка программирования, выбранного вами на первом шаге.
3. Изучение игровых движков
Для упрощения создания игры рекомендуется изучить игровые движки. Игровой движок — это программное обеспечение, которое предоставляет набор инструментов и функций для разработки игровых проектов. Некоторые популярные игровые движки включают Unity, Unreal Engine, Godot и другие.
4. Создание прототипа игры
Перед воплощением своей идеи в полноценную игру рекомендуется создать прототип. Прототип — это предварительная версия игры, которая содержит основные функции и механики. Создание прототипа позволяет проверить идею и внести необходимые изменения до начала полноценной разработки.
5. Разработка игры
После создания прототипа можно приступить к разработке игры. Этот процесс включает в себя написание кода, создание графики, анимации, звуков и других элементов игры. Рекомендуется разбить разработку на этапы и постепенно добавлять новые функции и улучшения.
6. Тестирование и отладка
После завершения разработки игры следует протестировать ее на различных устройствах и операционных системах. В процессе тестирования обнаруживаются возможные ошибки и недочеты, которые следует исправить. После обнаружения и исправления всех ошибок игра готова к выпуску.
7. Выпуск игры
После успешного тестирования и отладки игры можно выпустить ее для публики. Это может быть платная или бесплатная версия игры, которая доступна для скачивания или игры в браузере. Рекомендуется продвигать игру через социальные сети, игровые платформы и другие рекламные каналы.
В заключение, программирование игр — это увлекательное и творческое дело, которое позволяет создавать уникальные игровые проекты. Начав с выбора языка программирования и изучения основ, можно поэтапно разрабатывать игру, от прототипа до выпуска. Будьте терпеливы и наслаждайтесь процессом разработки своей собственной игры!
Как начать кодировать игру сапер на Си
В этом руководстве мы рассмотрим шаги, необходимые для создания игры сапер на языке программирования Си. Сапер — это классическая игра, в которой игрок должен открывать ячейки на игровом поле, избегая взрывов мин. Вот как начать кодирование игры сапер:
- Определите структуру данных для хранения информации о ячейках игрового поля. Каждая ячейка может быть открытой, закрытой или иметь мину. Вы можете использовать многомерный массив или связанный список для представления игрового поля.
- Разработайте функцию для инициализации игрового поля. Эта функция должна устанавливать ячейки игрового поля в начальное состояние, генерировать случайным образом мины и вычислять количество мин вокруг каждой ячейки.
- Напишите функцию для вывода игрового поля на консоль. Используйте символы для представления открытых, закрытых и заминированных ячеек.
- Разработайте функцию для обработки хода игрока. Эта функция должна открывать выбранную ячейку и проверять, была ли ячейка заминирована. Если ячейка была заминирована, игра должна завершиться.
- Реализуйте функцию для проверки, была ли игра выиграна. Эта функция должна проверять, остались ли неоткрытые ячейки без мин на поле. Если все ячейки без мин открыты, игрок выигрывает.
Игра сапер может быть довольно сложной для начинающих программистов, но практика и опыт помогут вам мастерить это. Начните с маленьких шагов, постепенно расширяя и улучшая функциональность вашей игры. Удачи в кодировании!
Основные принципы написания кода сапера на Си
Написание игры сапер на Си может быть интересным и познавательным опытом для начинающих программистов. Для создания игры следует придерживаться нескольких основных принципов:
- Планирование и проектирование игры: Прежде чем приступить к написанию кода, необходимо определиться с логикой игры и ее функциональными возможностями. Затем следует разработать план действий и схему игры.
- Использование подходящих структур данных: Для реализации игры сапер на Си, необходимо использовать подходящую структуру данных для хранения информации о состоянии игрового поля, бомбах и открытых клетках. Например, можно использовать двумерный массив или связанный список.
- Работа с памятью: Важным аспектом при написании игры сапер на Си является управление памятью. Необходимо правильно выделять и освобождать память для хранения данных.
- Логика игры: Правила игры сапер включают в себя размещение бомб на игровом поле, подсчет количества бомб вокруг каждой клетки и обработку действий пользователя. Важно правильно реализовать логику игры, чтобы она была интересной и согласованной.
- Графический интерфейс: Хотя игра сапер в основном сосредоточена на логике и алгоритмах, графический интерфейс игры также играет важную роль. Необходимо создать простой и интуитивно понятный интерфейс, который позволит игроку взаимодействовать с игрой.
- Отладка и тестирование: Как и в любом программном проекте, важно проводить отладку и тестирование кода сапера на Си. Необходимо проверить работу игры на разных сценариях и убедиться, что она работает корректно и без ошибок.
Важным моментом при написании игры сапер на Си является разделение кода на небольшие функции, что облегчит его чтение и понимание программы. Также следует комментировать код, чтобы другие программисты могли легко понять, что делает каждая часть программы.
Используя эти основные принципы, каждый начинающий программист на Си может успешно написать игру сапер и получить полезный опыт разработки программного обеспечения.
Вопрос-ответ
Какие базовые знания по программированию нужны для написания игры сапер на C?
Для написания игры сапер на C необходимы базовые знания по языку программирования C, а также понимание основных концепций таких как условные операторы, циклы и массивы.
Какие библиотеки нужно использовать для написания игры сапер на C?
Для написания игры сапер на C можно использовать библиотеку ncurses, которая предоставляет функции для работы с символьным интерфейсом и многое другое. Также можно использовать стандартную библиотеку C для работы с массивами и строками.
Какой алгоритм следует использовать для генерации мин на игровом поле в игре сапер?
Для генерации мин на игровом поле в игре сапер можно использовать алгоритм случайной генерации. Этот алгоритм заключается в том, что каждая клетка игрового поля имеет определенный шанс быть миной, и с помощью случайной генерации определяется, будет ли она миной или нет.
Какие особенности нужно учесть при разработке игры сапер на C?
При разработке игры сапер на C следует учесть несколько особенностей. Во-первых, необходимо разработать логику игры, включая проверку условий победы и поражения. Во-вторых, необходимо предусмотреть интерфейс игры, который позволяет пользователю взаимодействовать с игровым полем и осуществлять открытие и пометку клеток. В-третьих, рекомендуется использовать дополнительные функции и структуры данных для удобной работы с игровым полем и минами.