Алгоритм решения минного тральщика [закрывается]

Существует инструмент, названный автобанка , который просканирует Ваш байт-код и скомпилирует .jar файл с классами, которые это находит, включая (импортированные) классы, на которые ссылаются.

не всегда работает с чем-то как Spring, тем не менее, где Вы определяете имена классов в конфигурации, и это загружается платформой.

19
задан BoltClock 27 March 2012 в 19:50
поделиться

5 ответов

Я определенно не эксперт по саперам, но вот алгоритм, который я использую, когда пытаюсь его решить:

Перебери все квадраты, которые являются границей обнаруженной области. Для каждого из этих квадратов посчитайте количество мин, которые вы обнаружили рядом с ним . вычтите число , написанное в квадрате (истинное количество мин, которые находятся вокруг него). Это количество нераскрытых мин, оставшихся вокруг этой площади . Разделите это на количество нераскрытых квадратов вокруг текущего квадрата . Это вероятность того, что каждый из соседних квадратов содержит мину . Если у любого квадрата вероятность 1, вы помечаете его как мину. Если любой квадрат имеет вероятность 0, вы отмечаете его как безопасный. Затем вы обновляете соответствующие числа.

Что делать, если ни у одного квадрата нет вероятности 0 или 1? Оптимальный алгоритм будет учитывать ограничения из нескольких квадратов. Но, как я писал вначале, я не специалист по тральщикам, поэтому я случайным образом выбираю из других квадратов вероятность, наиболее близкую к 0 или 1.

2
ответ дан 30 November 2019 в 02:05
поделиться

Комментарии заключаются в том, что вам не нужен алгоритм для создания игры. Я считаю, что вы имеете в виду алгоритм в смысле решения, и каждый может понимать его таким же образом.

Однако любое решение проблемы можно рассматривать как алгоритм.

Как и большинство математических задач, вы можете проанализировать весь алгоритм на более мелкие и менее сложные алгоритмы, пока вы не дойдете до чего-то достаточно малого для решения. Это даст вам первое правильное решение. Позже вы можете оптимизировать более мелкие алгоритмы в контексте всего алгоритма.

Игровое поле можно рассматривать как двумерный массив. У вас будет алгоритм, связанный с каждой операцией. Первой операцией, вероятно, будет случайно сгенерированный набор местоположений мин с координатами x, y с параметром количества мин и размером доски. У вас был бы другой алгоритм, связанный с открытием квадрата, который берет доску и местоположение и определяет, сколько мин находится рядом с ним. Последний алгоритм возьмет доску и проверит, остались ли открытыми какие-либо квадраты без мин.

Теперь вы можете взять каждый из этих алгоритмов и попытаться оптимизировать каждый из них для повышения производительности и сказать «как лучше всего подсчитать количество мин. квадраты с минами, смежные с текущим квадратом, заданные двумерным массивом с использованием координат x, y.

2
ответ дан 30 November 2019 в 02:05
поделиться

Вы видели эту реализацию игры на C # ? Исходный код можно загрузить, а объектная модель объяснена.

1
ответ дан 30 November 2019 в 02:05
поделиться

Я просто хочу добавить следующее, если вы попытаетесь написать решатель - Minesweeper завершен NP (ссылка на архив) . Это означает, что до тех пор, пока кто-то не докажет P = NP , возможно, вы не сможете сделать ничего лучше, чем выполнение поиска грубой силой в некоторых ситуациях (но, возможно, игра не является полной NP для небольших полей).

5
ответ дан 30 November 2019 в 02:05
поделиться

Создать сетку просто. Есть пара простых алгоритмов, которые вам понадобятся при выполнении хода игрока, чтобы определить, какие клетки открываются и проиграли ли они или выиграли.

Создание сетки

Самый простой алгоритм - разместить все мины случайным образом . (Убедитесь, что вы не перекрываете их!)

Проблема: Первый щелчок игрока может быть миной.

Улучшение: отложите создание сетки до тех пор, пока пользователь не щелкнет по первому квадрату, и наденьте Не ставьте мины в этот квадрат.

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

Улучшение: Не делайте этого. также генерировать любые мины в (до) восьми квадратах вокруг первого щелчка.

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

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

Другой, менее распространенный способ разрешения неоднозначности - это определить, когда игрок знает, что он выбирает между равновероятными вариантами, и "свернуть форму волны" в положение, которое он решил на. Я никогда не видел этого в действии, но это было бы забавно.

Игра в игру

Помимо отметки флажков, игрок может сделать два вида ходов, чтобы попытаться раскрыть квадраты:

  • Единственное предположение: Игрок нажимает на квадрат с неизвестным состоянием и без флага. Раскройте квадрат, посмотрите, не умер ли игрок, и введите в него число. Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.

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

Победа в игре

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

Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

    Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

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

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

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

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

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

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

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

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

    и потому, что он повторно используется в многократной проверке.

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

    и потому, что он повторно используется в многократной проверке.

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

  • Победа в игре

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

    Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.

    50
    ответ дан 30 November 2019 в 02:05
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: