GENERADOR DE LABERINTOS HEXAGONALES EN VISUAL C# 2008

 

Siguiendo con los generadores de laberintos, esta vez toca el laberinto hexagonal, o más bien, el laberinto generado a partir de celdas hexagonales. 

 

Para este laberinto, las filas y las columnas de la grilla de celdas hexagonales las consideré de la siguiente forma:

 

Las filas están representadas por las flechas rojas y los números en azul. Las columnas están representadas por los números celestes y van en línea recta de arriba a abajo. Los lados de cada celda están definidos como sigue:

 

Dependiendo de su posición, las celdas vecinas pueden estar o no una fila más arriba o abajo. Éstas se van dibujando desde arriba y desde la izquierda. El código para generar el laberinto hexagonal puede descargarse de aquí, el cual no es más que una adaptación del generador de laberintos rectangulares y triangulares.

¿Así que por qué no meterle un poco de programación funcional?

Dado que son seis lados por celda, el código se vuelve muy repetitivo al evaluar si las celdas vecinas tienen todas sus paredes intactas tal y como se ve en este trozo del código:

La idea era reemplazar las expresiones condicionales con una función o expresión lambda (una función está compuesta por más de una expresión y usa llaves { } ). Debido a que una lambda (expresión o función) sólo puede recibir cuatro parámetros y se necesitan seis, se deberá aplicar Curry. Para este código, se declaran las lambdas así:

Y luego se les asignan las expresiones:

 

En este caso el código no se hace más corto, es sólo para demostrar cómo se puede usar una expresión lambda con Curry.  Al final el valor devuelto es el que devuelve la expresión "Curry": un valor del tipo int. Si se cumplen todas las condiciones, la variable "masdeunaCelda" incrementará su valor.

 

Un mejor ejemplo está en la función cogerCelda:

La lambda CogerLados está conformada por una sola expresión que realiza una operación booleana, por ello retorna automáticamente un valor booleano (verdadero o falso). La forma de usarla es:

El código puede descargarse de aquí.

 

Una pequeña modificación a la lambda puede hacer el código aún más corto:

 

La forma de usar esta nueva expresión lambda es:

 

El código con esta pequeña modificación se puede bajar de aquí.

Todos los ejemplos han sido dejados con la variable "primeraVez" igual a falso, así el laberinto se volverá a dibujar al minimizar y maximizar la ventana.

Y por último, un pantallazo de cómo queda el laberinto: