1с сапер создание игры
«Сапёр» (Minesweeper) — это простая игра с простыми правилами, однако некоторые её конфигурации создают любопытные трудности. В этой статье мы создадим солвер «Сапёра» с увеличивающейся сложностью, и поразмышляем над тем, как меняется динамика игры при постепенном повышении уровня помощи. В конце мы разработаем новый вариант игры с гораздо более интересным геймплеем.
Локальные рассуждения: ноль соседних мин
В оригинальной игре используется один автоматический механизм: когда игрок открывает клетку, рядом с которой нет мин, движок игры открывает все соседние клетки. Это ничем не угрожает игре, поэтому можно спокойно позволить компьютеру это сделать, а сама ситуация сразу же понятна игроку и никак не мешает геймплею.
Такое рассуждение совершенно локально: для принятия решения о следующем действии учитывается информация только одной клетки.
Сложно придумать ситуацию, в которой игра стала бы хуже без этой автоматической помощи. Попробуйте сыграть в такую игру, чтобы получить представление о том, как она проходит без автоматического открытия клеток [в оригинале статьи все примеры интерактивны] :
Локальные рассуждения с учётом окружения
Новому игроку несложно будет понять, что если количество соседних мин, то есть число, показанное в клетке, равно количеству неоткрытых соседних клеток, то все эти клетки должны быть минами, поэтому на них надо поставить флажки. Аналогично, когда количество соседних мин равно количеству соседних флагов, то оставшиеся неоткрытыми соседние клетки должны быть пусты.
В этих правилах учитывается одна клетка, а также состояние соседних (открыты/поставлен флажок).
Реализация этих правил вручную может быть увлекательной. Если добавить таймер, то игрок начинает учиться применять их быстро и точно. Это превращает «Сапёра» в игру на реакцию. Что произойдёт, если мы автоматизируем эти правила?
У подобной автоматизации есть интересный побочный эффект — установка флажка может мгновенно иметь фатальные последствия.
В остальном у нас могут возникнуть ситуации, которые можно разбить на три категории:
- Игры, полностью разрешаемые применением автоматических правил
- Сложные ситуации, требующие для рассуждений большего количества клеток
- Состояния игры, в которых нет логического пути вперёд — игроку остаётся только выбирать случайно, возможно с учётом вероятностей.
Очень привлекательной мне кажется ситуация 2. Мы больше сосредотачиваемся на решении логических условий, меньше тратя время на точное прицеливание и нажимание правильных кнопок. Это делает «Сапёра» больше похожим на активную головоломку.
Ситуация 3 полностью разрушает всю увлекательность. Впрочем, я слышал, что некоторым людям нравится играть в игры со случайностью.
Можно ли избавиться от ситуации 3?
Полное решение: глобальные рассуждения
Для алгоритмического обнаружения всех необходимых для состояния игры логических условий нам нужно выполнить исчерпывающий поиск всех состояний игры. Доказано, что Minesweeper — это NP-полная задача. Ниже показан небольшой, но интересный и наглядный пример состояния игры, имеющий всего одно логическое решение, но для его нахождения необходимо учитывать состояние игры целиком:
Возможно ли выполнить поиск по всему пространству состояний игры? Сколько всего существует вариантов состояний s?
w = ширина поля
h = высота поля
k = количество мин
Тогда количество возможных состояний s равно
Для стандартных уровней «Новичок», «Любитель» и «Профессионал» это даёт нам:
Мы понимаем, что наивный подход здесь совершенно не подходит. Давайте посмотрим, как бы мог выглядеть наивный алгоритм, и узнаем, можно ли его оптимизировать в нечто работающее.
Наивный алгоритм
Задача алгоритма — найти все необходимые для заданного состояния поля логические условия. Было бы сложно реализовать это тщательным продумыванием решений; компьютер гораздо лучше справляется с быстрым выполнением кучи глупых действий.
Что мы можем сделать «глупого»: сгенерировать все возможные перестановки позиций мин для всех оставшихся мин. Если такая перестановка соответствует всем открытым числам, то она будет правильным решением игры. Затем мы изучаем все возможные перестановки, находим все возможные решения, но по-прежнему не знаем, какое из них является верным.
Если во всех возможных решениях есть что-то общее, или среди открытых клеток, или среди клеток, помеченных как мины, то мы понимаем, что это общее должно быть частью верного решения для текущего поля. И в самом деле: невозможно создать верного решения, не имеющего таких совпадающих элементов, иначе бы мы их обнаружили.
Таким образом мы можем найти все необходимые для текущего состояния поля логические условия.
Клетки с ограничениями и без ограничений
У приведённого выше алгоритма есть очевидная проблема: количество состояний, которое ему нужно исследовать. Но не все клетки одинаковы. Неоткрытые клетки, находящиеся рядом с числом, очевидно ограничены этим числом. Мы назовём эти клетки ограниченными. Оставшиеся клетки мы назовём неограниченными.
Если мы реализуем приведённый выше алгоритм, но будем выполнять поиск только в пространстве состояний ограниченных клеток, и будем возвращаться назад, как только нарушим ограничение, то во многих играх сможем решить все логические условия за разумный промежуток времени:
В случае неограниченных клеток мы никак не можем узнать, где расположены мины, и логически сразу знаем об этом. Это означает, что можно исключить их из вычисления и рассматривать только расположение мин рядом с открытыми числами.
Однако мы знаем, что некое количество мин может попасть во множество неограниченных клеток; если есть 6 мин и 4 ограниченных клетки, то в ограниченных клетках может быть максимум 4 мины, то есть не менее 2 мин должно находиться в неограниченных клетках. По аналогичной логике мы иногда можем определить, что все неограниченные клетки должны быть пустыми или все содержать мины.
В показанном ниже случае мы знаем позиции всех мин, поэтому ИИ должен быть способен понять, что оставшиеся ячейки не заняты:
В следующем случае мы не знаем позиций всех мин, но можем понять, что оставшуюся мину нужно поместить в одну из двух клеток слева вверху. Это значит, что оставшаяся в правом нижнем углу клетка свободна:
Версия со случайностью
Если мы автоматически будем запускать глобальный солвер, то получим оптимизированную по случайности версию «Сапёра»:
Можно разделить игры в этой версии на три категории:
- Игры, в которых игрок делает произвольный выбор и выигрывает.
- Игры, в которых игрок делает произвольный выбор и проигрывает.
- Игры, в которых работа ИИ требует много времени, и игрок на самом деле может использовать рассуждения.
Но какая из игр со случайностями лучше? Похоже, что смысл других игр со случайностями заключается в существовании сложной связи между действиями игрока и победой/проигрышем. Для вытягивания номеров лотереи используются сложные машины, которые специально не торопятся в выборе номера и делают из показа этого номера целое шоу.
Возможно, большое поле, которое решается автоматически, является довольно хорошей игрой
со случайностями, учитывая то, что игрок наблюдает за постепенным открыванием всех клеток.
Можем ли мы придумать другой тип игры?
Детерминированная версия
Теперь у нас есть ИИ, способный определять все логичные шаги из заданного состояния игры. Иногда он не сможет находит логичных шагов. В таких ситуациях игроку приходится угадывать и он может проиграть, если ему не повезёт.
Что если мы добавим ещё одно правило? Когда у игры нет логичного пути вперёд, то мы можем попросить о помощи. Если ИИ соглашается, что игрок не может ничего поделать, то приходит ему на помощь. В противном случае игрок немедленно проигрывает. Это может быть интересным. Какой может быть такая помощь? Возможно, нужно открыть одну клетку, вне зависимости от наличия в ней мины:
Таким образом, мы полностью избавились от ситуаций, в которых можно было проиграть случайно.
Однако тут есть одно исключение: по-прежнему существует вероятность вырожденных ситуаций, в которых глобальный солвер не может закончить вычисления за разумный промежуток времени. К сожалению, это неизбежный результат того, что задача «Сапёра» NP-полная.
Как кнопка «Попросить помощи» влияет на игровой процесс? Она приводит тому, что игра больше сосредотачивается на логике; это самый «головоломный» вариант «Сапёра». Кто-то может подумать, что игра станет проще, но на самом деле она усложняется. Теперь ошибкам игрока нет оправданий, и кнопка накажет его, если он что-то упустил. Без кнопки легко прийти к выводу, что ты исчерпал все логичные возможности и единственный вариант развития событий — попытаться угадать случайным образом. Но из-за существования кнопки игрок обязан быть прав в этой оценке.
В заключение
Реализовав полный солвер «Сапёра», мы смогли создать разновидность игры, избавленной от её проклятья: теперь невозможно проиграть из-за того, что приходится выбирать случайно, когда уже почти решил всё поле. Эта версия отличается от оригинальной игры только в те моменты, когда нужно угадывать случайным образом, поэтому могу предположить, что она намного увлекательнее, чем оригинальная игра.
Кроме того, мы разработали вариант игры, автоматически решающий простые локальные правила. Стоит ли использовать такую помощь — зависит только от вас. Она смещает фокус игры с механического щёлканья к более головоломному игровому процессу. При этом необязательно пользоваться усовершенствованием геймплея, которое обеспечивает кнопка «Попросить помощи».
Игра "Жизнь" Джона Конуэя (Conway's Game of Life). Очередная реализация с нестандартными "фишечками".
1 стартмани
11.08.2021 1105 0 tired_coder 2
Майнкрафт и 1С
Создай свой мир через 1С.
4 стартмани
16.07.2021 1693 0 SerVer1C 0
"Уголки" на 1С
Игра "Уголки" на 1С - ностальгия детства .
1 стартмани
09.06.2021 3277 6 royaljon 5
Игра "Змейка" на управляемых формах (клиент)
Пишем игру с динамическим обновлением игрового поля и управлением с клавиатуры на управляемых формах, отправляем на github.
1 стартмани
07.06.2021 1891 0 alexey_kurdyukov 0
Самые красивые шахматы для 1С на управляемых формах
Здравствуйте, представляем Вашему вниманию классическую игру – Шахматы! Написана игра средствами 1С, на управляемых формах. Программный код представляет собой с аккуратностью составленную систему, содержащую лаконичные логические приемы и описательные имена переменных, объектов и функций. Программа полностью отлажена и многократно протестирована. Оригинальный авторский дизайн фигур, иконок и кнопок приятен глазу. Игра содержит большое количество функций, настроек и режимов игры, включая сетевую игру, тренировку с ботом или игру на двоих. Не упустите возможность найти ряд технических решений, применимых для реализации различных задач, а также поиграть в вечную игру с отличным оформлением! Желающие научиться программировать на управляемых формах могут многое почерпнуть в этой конфигурации.
5 стартмани
18.02.2021 5755 13 compmir 30
Прототип игры Морской бой
Решенное тестовое задание при приеме на работу в крупный франч. Всё сделано строго по ТЗ. Обработка включена в конфигурацию, и может запускаться как внутри, так и как внешняя. Для правильной работы потребуется опубликовать веб-сервис. Использованы механизмы веб-сервисов, XDTO, запросов, управляемых форм.
При нажатии мышкой на клетку, если там мина = Вы проиграли.
Если нет мины = открываются числа, которые показывают количество мин в соседних клетка (горизонталь, вертикаль, диагональ).
Флажки правой кнопкой (как в Win) = не реализовано.
Работаем одной кнопкой и сами держим в уме, где, по нашему мнению, мины.
Нужно всё разминировать.
Специальные предложения
Просмотры 10869
Загрузки 3
Рейтинг 4
Создание 02.10.15 11:59
Обновление 27.10.17 15:56
№ Публикации 403762
Рубрики Игры
Кому Для всех
Конфигурация Конфигурации 1cv8
Операционная система Windows
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
Разберем, в каких случаях выгоднее автоматизировать раздельный учет и как это сделать, не «ломая» механизмы типовой конфигурации. Вебинар "Автоматизация раздельного учета по 275-ФЗ в 1С:Бухгалтерии 3.0.". 26 ноября 19:00 мскСм. также
Каталог игр с приставок из моего детства Промо
Каталог игр Dendy, Sega, Nintendo из нашего детства.
1 стартмани
06.02.2018 18662 74 user621724_Dimav1979 37
Ханойские башни
Решение головоломки "Ханойская башня" с визуализацией в среде 1С.
5 стартмани
23.12.2019 6346 3 13vap 0
Блэк Джек
Блэк джек, написанный на платформе 1С 8.2 (обычные формы).
1 стартмани
07.10.2019 6537 1 Azamatex 2
Игра "Ван Хельсинг"
Игра "Ван Хельсинг". Интерфейс "Обычный". Аркада.
1 стартмани
03.07.2019 6049 1 Lion_LexXx 0
Сетевая игра "СловоБой" на управляемых формах Промо
СловоБой - это новый взгляд на ставшие уже классическими игры, где нужно составлять слова из букв, наподобие Балды и Эрудита. Играйте онлайн с друзьями! В игре СловоБой побеждает не тот, кто может придумать самое длинное слово, а тот, кто знаком с тактикой не понаслышке и способен использовать оптимальную стратегию.
1 стартмани
10.11.2016 21355 8 woldemarr 0
Игра "Логика"
Старая советская «Логика» для 1С УФ. Угадайте комбинацию цветов, загаданную компьютером.
1 стартмани
13.06.2019 7785 1 legenda-nsh 0
Игра в кости "1000" (сетевая)
Аналог игры в кости 1000 (классика). Работает на управляемом приложении, любой конфигурации и без неё. Тестировал на платформе 1С:Предприятие 8.3 (8.3.10.2667) и выше.
1 стартмани
07.05.2019 13006 2 APTEM_SLV 5
Игра "Арканоид" (Javascript фреймворк Phaser). HTML 5 Сanvas + WebGL. Управляемые формы (ТОНКИЙ, ТОЛСТЫЙ клиент), Обычные формы
Общеизвестная игра "Арканоид", доступная для запуска в 1с. Выполнена в виде обработки, запускаемой из папки, в которой расположены файлы проекта (html, js файла и картинки) Любые конфигурации на обычных формах, управляемых формах (Тонкий + Толстый клиент). УПП, БП 2.0, 3.0. После открытия обработки нажимаем мышью на область экрана игры, точнее, нажимаем на кнопку "СТАРТ" (области игры). Начинается игра. Управление мышью.
1 стартмани
04.05.2019 8385 5 pvlunegov 2
Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук Промо
Bejeweled -Самоцветы - красивая логическая игра, смысл которой заключается собрать три и более одинаковых самоцвета (в вертикальной или горизонтальной строке). Первый клик выбираете самоцвет, второй клик выбираете место куда его переместить, перемещать можно только из соседних строк и столбцов. Развивает внимательность и память. Найденные и выбранные группы самоцветов исчезают, а на их место опускаются новые.
20.10.2010 32576 276 Tatitutu 68
Игра Змейка с автопилотом
Игра Змейка с автопилотом реализована в парадигме автоматного программирования.
1 стартмани
23.04.2019 8367 1 RonX01 17
Логическая игра "Камушки"
1 стартмани
05.04.2019 7525 0 ranis888 5
Розыгрыш к 1 апреля (№2) [Расширение] УТ11
Меняем язык надписей на формах для пользователя с помощью сервиса яндекс-переводчик.
1 стартмани
26.03.2019 7499 5 noprogrammer 1
Игра: Лабиринт для 1С (теперь и для 8.0-8.2) Промо
Игра "Лабиринт в 1С для 8 ки" неограниченное количество уникальных полей лабиринтов произвольных размеров формируется динамически (очень красивое зрелище - завораживает) Смысл игры - выбраться из Лабиринта.
1 стартмани
24.09.2010 30733 453 Tatitutu 24
Розыгрыш к 1 апреля [Расширение]
Небольшой розыгрыш к 1 апреля.
1 стартмани
19.03.2019 7449 4 noprogrammer 13
Magic 8 ball (Магический шар 8)
1 стартмани
13.03.2019 8926 7 Смешной 1С 3
Конфигурация-игра "Сто к одному" (1С + html + js + css)
На текущий момент в обработке реализованы следующие игры:
Специальные предложения
(0) количество мин должно иметь разный цвет в зависимости от количества мин - соседей.
Тыкать пользователи привыкли в ячейки - клеточки, а не в невнятные точки.
Нужно немного доработать.
Спасибо за советы. Это проба пера ).Будут и цвета, и открывающиеся клетки, если нет мин рядом, а клетки вместо точек сделаю через выбор интерфейса. Версия 1.2.3:
числа разных цветов;
выбор рамки у ячеек игрового поля;
сохранение при выходе и загрузка при открытии настроек обработки. Версия 1.2.4:
интерфейс выбора операции сделал в виде кнопок с иконками. Версия 1.3.5:
при открытии пустой клетки открываются все соседние пустые клетки.
Просмотры 14303
Загрузки 4
Рейтинг 2
Создание 26.02.17 09:34
Обновление 22.09.19 12:08
№ Публикации 591781
Рубрики Игры
Кому Для всех
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
"Словом можно убить, словом можно спасти, словом можно полки за собой повести" Онлайн-тренажер "Боевая риторика. Ложь и давление в переговорах" с 29 ноября по 27 декабря.См. также
Каталог игр с приставок из моего детства Промо
Каталог игр Dendy, Sega, Nintendo из нашего детства.
1 стартмани
06.02.2018 18663 74 user621724_Dimav1979 37
Ханойские башни
Решение головоломки "Ханойская башня" с визуализацией в среде 1С.
5 стартмани
23.12.2019 6346 3 13vap 0
Блэк Джек
Блэк джек, написанный на платформе 1С 8.2 (обычные формы).
1 стартмани
07.10.2019 6537 1 Azamatex 2
Игра "Ван Хельсинг"
Игра "Ван Хельсинг". Интерфейс "Обычный". Аркада.
1 стартмани
03.07.2019 6049 1 Lion_LexXx 0
Сетевая игра "СловоБой" на управляемых формах Промо
СловоБой - это новый взгляд на ставшие уже классическими игры, где нужно составлять слова из букв, наподобие Балды и Эрудита. Играйте онлайн с друзьями! В игре СловоБой побеждает не тот, кто может придумать самое длинное слово, а тот, кто знаком с тактикой не понаслышке и способен использовать оптимальную стратегию.
1 стартмани
10.11.2016 21355 8 woldemarr 0
Игра "Логика"
Старая советская «Логика» для 1С УФ. Угадайте комбинацию цветов, загаданную компьютером.
1 стартмани
13.06.2019 7785 1 legenda-nsh 0
Игра в кости "1000" (сетевая)
Аналог игры в кости 1000 (классика). Работает на управляемом приложении, любой конфигурации и без неё. Тестировал на платформе 1С:Предприятие 8.3 (8.3.10.2667) и выше.
1 стартмани
07.05.2019 13006 2 APTEM_SLV 5
Игра "Арканоид" (Javascript фреймворк Phaser). HTML 5 Сanvas + WebGL. Управляемые формы (ТОНКИЙ, ТОЛСТЫЙ клиент), Обычные формы
Общеизвестная игра "Арканоид", доступная для запуска в 1с. Выполнена в виде обработки, запускаемой из папки, в которой расположены файлы проекта (html, js файла и картинки) Любые конфигурации на обычных формах, управляемых формах (Тонкий + Толстый клиент). УПП, БП 2.0, 3.0. После открытия обработки нажимаем мышью на область экрана игры, точнее, нажимаем на кнопку "СТАРТ" (области игры). Начинается игра. Управление мышью.
1 стартмани
04.05.2019 8385 5 pvlunegov 2
Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук Промо
Bejeweled -Самоцветы - красивая логическая игра, смысл которой заключается собрать три и более одинаковых самоцвета (в вертикальной или горизонтальной строке). Первый клик выбираете самоцвет, второй клик выбираете место куда его переместить, перемещать можно только из соседних строк и столбцов. Развивает внимательность и память. Найденные и выбранные группы самоцветов исчезают, а на их место опускаются новые.
20.10.2010 32576 276 Tatitutu 68
Игра Змейка с автопилотом
Игра Змейка с автопилотом реализована в парадигме автоматного программирования.
1 стартмани
23.04.2019 8367 1 RonX01 17
Логическая игра "Камушки"
1 стартмани
05.04.2019 7525 0 ranis888 5
Розыгрыш к 1 апреля (№2) [Расширение] УТ11
Меняем язык надписей на формах для пользователя с помощью сервиса яндекс-переводчик.
1 стартмани
26.03.2019 7499 5 noprogrammer 1
Игра: Лабиринт для 1С (теперь и для 8.0-8.2) Промо
Игра "Лабиринт в 1С для 8 ки" неограниченное количество уникальных полей лабиринтов произвольных размеров формируется динамически (очень красивое зрелище - завораживает) Смысл игры - выбраться из Лабиринта.
1 стартмани
24.09.2010 30733 453 Tatitutu 24
Розыгрыш к 1 апреля [Расширение]
Небольшой розыгрыш к 1 апреля.
1 стартмани
19.03.2019 7449 4 noprogrammer 13
Magic 8 ball (Магический шар 8)
1 стартмани
13.03.2019 8926 7 Смешной 1С 3
Конфигурация-игра "Сто к одному" (1С + html + js + css)
От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.
«Сапер» — веселая игра, многие из нас в нее играют. Может быть, вы хотите сделать «Сапера» сами?
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».
Уникальность игры в том, что она очень простая и при этом весьма увлекательная. В «Сапере» нет никакой хитрой геймплейной механики, вы просто нажимаете на квадратики, надеясь, что под ними нет мины.
Предлагаю попробовать написать «Сапера» на Processing. Это отличный инструмент, который позволяет создавать графические приложения на Java. Ссылка на него вот здесь.
Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.
Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.
Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.
Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:
Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.
В итоге мы имеем следующий алгоритм:
- Если позиция за пределами поля, end;
- Если позиция раскрыта, end;
- Раскрываем текущую позицию;
- Если у нас бомба рядом с текущей позицией, end;
- Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.
Если вы хотите узнать о визуализации, читайте дальше.
Визуализация
Здесь все должно быть понятно, но я объясню сложные части.
Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.
Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.
Затем мы возвращаем переменные в изначальное состояние.
Для инициализации поля:
И далее включаем реакцию на клики мышью.
И функция отображения, вызываем ее один раз для каждого кадра.
И все, вот и наш «Сапер».
Игра выглядит просто, но в целом она полностью функциональна. И помните: «Сапер» вызывает привыкание!
Читайте также: