Я столкнулся с интересной проблемой при программировании генератора случайного уровня для игры на основе плитки. Я реализовал для нее решатель грубой силы, но он экспоненциально медленный и определенно непригоден для моего использования. Я не обязательно ищу идеальное решение, я буду удовлетворен «хорошим» решением, которое хорошо работает.Пазл «узор-наполнение плитки»
Постановка задачи:
Скажем, у вас есть все или подмножество доступных следующих плитки (это комбинация всех возможных моделей 4-битных сопоставляются вправо, вверх, влево и вниз):
alt text http://img189.imageshack.us/img189/3713/basetileset.png
Вам предоставляется сетку, где отмечены некоторые клетки (истина), а другие нет (ложные). Например, это может быть вызвано алгоритмом perlin noise. Цель состоит в том, чтобы заполнить это пространство плиточками, чтобы было возможно как можно больше сложной плитки. В идеале все плитки должны быть подключены. Не может быть решения для некоторых входных значений (доступные плитки + узор). Всегда существует хотя бы одно решение, если доступна верхняя левая, несвязанная плитка (т. Е. Все ячейки шаблонов могут быть заполнены этой плиткой).
Пример:
Изображения слева направо: Наличие плитки (зеленые плитки могут быть использованы, красный не может), шаблон для заполнения и раствор
alt text http://img806.imageshack.us/img806/2391/sampletileset.png + alt text http://img841.imageshack.us/img841/7/samplepattern.png = alt text http://img690.imageshack.us/img690/2585/samplesolution.png
То, что я пробовал:
Моя попытка перебора всех попыток и отслеживать найденные решения. Наконец, он выбирает решение, которое максимизирует общее количество соединений, исходящих от каждого из плит. Время, которое требуется, является экспоненциальным в отношении количества плиток в шаблоне. Образец из 12 плиток занимает несколько секунд, чтобы решить.
Примечания:
Как я уже говорил, производительность является более важным, чем совершенство. Однако окончательное решение должно быть правильно подключено (нет плитки, указывающей на плитку, которая не указывает на исходную плитку). Чтобы дать представление о сфере охвата, я бы хотел обработать шаблон из 100 фрагментов менее чем за 2 секунды.
Каковы плитки с красными линиями? – NullUserException
@NullUserException Это плитки, которые нельзя использовать в этом конкретном примере. Набор тайлов не всегда содержит все возможные плитки, это было бы слишком легко! Я сделаю это более ясным. – Trillian
@Trillian О bummer. Что означает «количество чередующихся сложностей»? – NullUserException