Существует инструмент, названный автобанка , который просканирует Ваш байт-код и скомпилирует .jar файл с классами, которые это находит, включая (импортированные) классы, на которые ссылаются.
не всегда работает с чем-то как Spring, тем не менее, где Вы определяете имена классов в конфигурации, и это загружается платформой.
Я определенно не эксперт по саперам, но вот алгоритм, который я использую, когда пытаюсь его решить:
Перебери все квадраты, которые являются границей обнаруженной области. Для каждого из этих квадратов посчитайте количество мин, которые вы обнаружили рядом с ним . вычтите число , написанное в квадрате (истинное количество мин, которые находятся вокруг него). Это количество нераскрытых мин, оставшихся вокруг этой площади . Разделите это на количество нераскрытых квадратов вокруг текущего квадрата . Это вероятность того, что каждый из соседних квадратов содержит мину . Если у любого квадрата вероятность 1, вы помечаете его как мину. Если любой квадрат имеет вероятность 0, вы отмечаете его как безопасный. Затем вы обновляете соответствующие числа.
Что делать, если ни у одного квадрата нет вероятности 0 или 1? Оптимальный алгоритм будет учитывать ограничения из нескольких квадратов. Но, как я писал вначале, я не специалист по тральщикам, поэтому я случайным образом выбираю из других квадратов вероятность, наиболее близкую к 0 или 1.
Комментарии заключаются в том, что вам не нужен алгоритм для создания игры. Я считаю, что вы имеете в виду алгоритм в смысле решения, и каждый может понимать его таким же образом.
Однако любое решение проблемы можно рассматривать как алгоритм.
Как и большинство математических задач, вы можете проанализировать весь алгоритм на более мелкие и менее сложные алгоритмы, пока вы не дойдете до чего-то достаточно малого для решения. Это даст вам первое правильное решение. Позже вы можете оптимизировать более мелкие алгоритмы в контексте всего алгоритма.
Игровое поле можно рассматривать как двумерный массив. У вас будет алгоритм, связанный с каждой операцией. Первой операцией, вероятно, будет случайно сгенерированный набор местоположений мин с координатами x, y с параметром количества мин и размером доски. У вас был бы другой алгоритм, связанный с открытием квадрата, который берет доску и местоположение и определяет, сколько мин находится рядом с ним. Последний алгоритм возьмет доску и проверит, остались ли открытыми какие-либо квадраты без мин.
Теперь вы можете взять каждый из этих алгоритмов и попытаться оптимизировать каждый из них для повышения производительности и сказать «как лучше всего подсчитать количество мин. квадраты с минами, смежные с текущим квадратом, заданные двумерным массивом с использованием координат x, y.
Вы видели эту реализацию игры на C # ? Исходный код можно загрузить, а объектная модель объяснена.
Я просто хочу добавить следующее, если вы попытаетесь написать решатель - Minesweeper завершен NP (ссылка на архив) . Это означает, что до тех пор, пока кто-то не докажет P = NP , возможно, вы не сможете сделать ничего лучше, чем выполнение поиска грубой силой в некоторых ситуациях (но, возможно, игра не является полной NP для небольших полей).
Создать сетку просто. Есть пара простых алгоритмов, которые вам понадобятся при выполнении хода игрока, чтобы определить, какие клетки открываются и проиграли ли они или выиграли.
Самый простой алгоритм - разместить все мины случайным образом . (Убедитесь, что вы не перекрываете их!)
Проблема: Первый щелчок игрока может быть миной.
Улучшение: отложите создание сетки до тех пор, пока пользователь не щелкнет по первому квадрату, и наденьте Не ставьте мины в этот квадрат.
Проблема: Первый щелчок игрока может показать ненулевое число, и он будет вынужден щелкать случайным образом, пока что-то не откроется.
Улучшение: Не делайте этого. также генерировать любые мины в (до) восьми квадратах вокруг первого щелчка.
Проблема: Игрок может быть вынужден в какой-то момент догадаться, что делает это печальным предлогом для логической головоломки.
Улучшение: Запустите решатель рядом с генератором, убедившись, что головоломка имеет уникальное решение. Это требует некоторой сообразительности и не выполняется в большинстве вариантов.
Другой, менее распространенный способ разрешения неоднозначности - это определить, когда игрок знает, что он выбирает между равновероятными вариантами, и "свернуть форму волны" в положение, которое он решил на. Я никогда не видел этого в действии, но это было бы забавно.
Помимо отметки флажков, игрок может сделать два вида ходов, чтобы попытаться раскрыть квадраты:
Единственное предположение: Игрок нажимает на квадрат с неизвестным состоянием и без флага. Раскройте квадрат, посмотрите, не умер ли игрок, и введите в него число. Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.
Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
Если квадрат содержит 0, повторите это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
повторить это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
повторить это рекурсивно для всех окружающих квадратов. Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
Это должно быть в специальной функции, чтобы отделить его от обработчика событий графического интерфейса, чтобы упростить рекурсию, а также потому, что он повторно используется в множественном поиске.Множественный поиск: Игрок нажимает на квадрат, который открыт и известен чтобы быть в безопасности. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
и потому, что он повторно используется в многократной проверке.Многопользовательская проверка: Игрок нажимает на квадрат, который открыт и считается безопасным. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.
и потому, что он повторно используется в многократной проверке.Многопользовательская проверка: Игрок нажимает на квадрат, который открыт и считается безопасным. Если количество окружающих флагов равно количеству в этом квадрате, мы открываем неотмеченные квадраты, используя ту же процедуру, что и выше.
Если количество закрытых квадратов такое же, как и количество мин, то игрок выиграл, даже если он не поставил флажок на каждой клетке.
Когда игрок проигрывает, принято отмечать любые неправильные предположения, которые он сделал, оставшиеся мины и шахту, которая они наступили.