Estoy tratando de entender cómo escribir juegos de estrategia usando Scala funcionalmente, pero desafortunadamente parezco estar pegado a lo básico. (Esto no es trabajo a domicilio, pero mis intentos de aprender algo nuevo, es decir, la programación funcional "pura".)Generación de movimientos de juego funcionalmente con Scala
Tomemos siguiente sencillo "juego": la (única) jugador tiene x piezas idénticas en una fila sin fin de cuadrados. Las piezas comienzan en el cuadrado 0 y cada turno puede mover una pieza hacia adelante un cuadrado.
Como la estructura de datos que va a utilizar un List[Int]
eran cada elemento es la posición (cuadrado) de una sola pieza.
para generar los movimientos posibles que se me ocurrió:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1)});
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
Lo que no me gusta es el uso del bucle índice (0 until start.length)
. No me parece muy "funcional". ¿Es esta la manera correcta de hacer esto o hay una mejor manera?
Ahora en mi ejemplo del juego todas las piezas son idénticas, por lo que en caso m1
los tres posibles movimientos también son idénticas y pueden/deben ser condensados en un solo movimiento. He modificado moves
para ordenar cada elemento de movimiento, por lo que podría conseguir una lista de elementos distintos:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1).sorted}).distinct;
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
Sin embargo, esto requiere que la estructura de datos para ser clasificable y en mi aplicación "real", es muy probable que no un List[Int]
, pero una Tuple o una clase de caso. Lo que supongo que necesitaría es un método distinct
, que toma una función que define la igualdad. ¿Cómo implementaría eso?
El listado del tipo de devolución de los movimientos del método lo hace más fácil de leer. Sí, podría tomarlo del comentario de m1, pero ya es demasiado tarde ... – ziggystar