He encontrado un problema interesante al programar un generador de nivel aleatorio para un juego basado en fichas. Implementé un solucionador de fuerza bruta para él, pero es exponencialmente lento y definitivamente no apto para mi caso de uso. No estoy buscando necesariamente una solución perfecta, estaré satisfecho con una solución "lo suficientemente buena" que funcione bien. DeclaraciónEl rompecabezas "relleno de patrón con mosaicos"
Problema:
Digamos que tiene todos o un subconjunto de los siguientes azulejos disponibles (esto es la combinación de todos los posibles patrones de 4 bits asignada a la derecha, arriba, izquierda y descendente):
alt text http://img189.imageshack.us/img189/3713/basetileset.png
se le proporciona una cuadrícula donde se marcan algunas células (verdadero) y otros no (falso). Esto podría ser generado por un algoritmo de ruido perlin, por ejemplo. El objetivo es llenar este espacio con mosaicos para que haya tantas fichas complejas como sea posible. Idealmente, todas las fichas deberían estar conectadas. Puede que no haya solución para algunos valores de entrada (mosaicos disponibles + patrón). Siempre hay al menos una solución si el mosaico no conectado superior izquierdo está disponible (es decir, todas las celdas de patrón se pueden llenar con ese mosaico).
Ejemplo:
Imágenes de izquierda a derecha: la disponibilidad de baldosas (azulejos verdes se pueden utilizar, rojo no puede), modelo para llenar y una solución
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
Lo que probé:
Mi implementación de fuerza bruta intenta todas las posibilidades ible azulejo en todas partes y realiza un seguimiento de las soluciones que se encontraron. Finalmente, elige la solución que maximiza el número total de conexiones salientes de cada una de las teselas. El tiempo que toma es exponencial con respecto al número de mosaicos en el patrón. Un patrón de 12 fichas tarda unos segundos en resolverse.
Notas:
Como ya he dicho, el rendimiento es más importante que la perfección. Sin embargo, la solución final debe estar correctamente conectada (no hay mosaico apuntando a una ficha que no apunte a la ficha original). Para dar una idea del alcance, me gustaría manejar un patrón de 100 fichas en menos de 2 segundos.
¿Qué son las baldosas con líneas rojas? – NullUserException
@NullUserException Esas son las fichas que no se pueden usar en este ejemplo en particular. El conjunto de fichas no siempre contiene todos los mosaicos posibles, ¡sería demasiado fácil! Lo aclararé. – Trillian
@Trillian Oh bummer. ¿Qué significa "complejidades de mosaicos de números"? – NullUserException