2009-08-28 26 views
5

Me preguntaba, cuáles son los algoritmos más comúnmente utilizados para encontrar patrones en juegos de rompecabezas conformados por cuadrículas de celdas.Encontrando patrones en juegos de rompecabezas

Sé que depende de muchos factores, como el tipo de patrones que desea detectar, o las reglas del juego ... pero quería saber cuáles son los algoritmos más utilizados en ese tipo de problemas ..

Por ejemplo, juegos como columnas, enjoyados, incluso tetris.

También quiero saber si detectar patrones por "fuerza bruta" (como escanear toda la cuadrícula tratando de encontrar tres celdas adyacentes del mismo color) es significativamente peor que usar algoritmos particulares en cuadrículas muy pequeñas, como 4 X 4 por ejemplo (y de nuevo, sé que depende del tipo de juego y reglas ...)

¿Qué estructuras se usan comúnmente en este tipo de juegos?

Respuesta

5

Siempre depende del dominio. Pero también hay dos situaciones en las que harías este tipo de búsquedas. La situación de uno es después de un movimiento (un cambio en el campo de juego hecho por el jugador), y el otro sería si/cuando todo el tablero ha cambiado.

En Tetris, no necesitarás escanear toda la placa después de que se suelte una pieza. Tendría que buscar en las filas que toca la pieza.

En un juego de 3 juegos como Bejeweled, donde se intercambian dos piezas adyacentes a la vez, primero se ejecuta una búsqueda localizada en cada dirección alrededor de cada cuadrado que cambia, para ver si alguna pieza se ha activado. Luego, si lo han hecho, el juego arrojará algunas piezas nuevas y aleatorias en el tablero. Ahora bien, podría ejecutar la misma búsqueda localizada alrededor de cada cuadro que se modificó, pero eso podría implicar muchas declaraciones if y, de hecho, podría ser más lento que escanear todo el tablero desde la esquina superior izquierda a la inferior derecha. Depende de su implementación y requerirá un perfil.

Como dice Adrian, basta con una matriz 2D simple. A menudo, sin embargo, puede agregar un "borde" de píxeles alrededor de esta matriz, para simplificar el aspecto de búsqueda de patrones. Sin borde, tendrías que tener if enunciados a lo largo de los recuadros del borde que dicen "bueno, si estás en la fila superior, no busques (y salgas de la matriz)".Con un borde a su alrededor, puede buscar de manera segura todo: salvándose a sí mismo if declaraciones, ahorrándose ramificación, ahorrándose problemas con la tubería, buscando más rápido.

Para Jon: este tipo de cosas realmente importan en configuraciones de alto rendimiento, incluso en máquinas modernas, si está haciendo un algoritmo de búsqueda para jugar/resolver el juego. Si lo es, quiere que su simulación subyacente se ejecute lo más rápido posible para buscar lo más profundo posible en el menor número de ciclos.

2

En cuanto a los algoritmos: ciertamente depende del juego. Por ejemplo, para tetris, solo tendrías que escanear cada fila si tiene el mismo color. No puedo pensar en algo que no sea igual al enfoque de la fuerza bruta en este caso. Pero para la mayoría de los juegos casuales, la fuerza bruta debería estar perfectamente bien. El reconocimiento de patrones debe ser insignificante en comparación con los gráficos y el procesamiento de sonido.

En cuanto a las estructuras: una simple matriz 2D debería ser suficiente para representar la placa.

0

Teniendo en cuenta la velocidad promedio de la computadora en estos días, si es en tiempo real ya que el usuario está jugando el juego, probablemente no importe (EDITAR: para tableros de juego muy pequeños solamente). Ciertamente, dependerá de la complejidad de la lógica del juego, pero también de cuán rápido se ejecutará el código en la máquina objetivo (es decir, es un juego de páginas web JavaScript o una aplicación de Windows escrita en C++).

Si esto es para simular estrategias de juego, utiliza un algoritmo que sea más eficiente.

Una estrategia más eficiente podría implicar realizar un seguimiento de los cambios incrementales en el tablero de juego, en lugar de volver a analizar todo el tablero en todo momento.