Se agregó la opción de elegir el equipo (Hounds o Hare), así como el paso del nombre de la persona que está jugando mediante la consola
Se crearon las funciones diagonalRestriction, chooseTeam, isInList y leftSide para poder abordar la creación del juego.
Las condiciones de victoria son: Hare llega a la posición (1,1) (primera casilla del extremo izquierdo), Hare llega a una posición que está a la izquierda de todos los Hounds (ya que éstos no pueden retroceder) o Hounds logran acorralar a Hare, dejándolo sin movimientos
Se utilizó el CPUEval de Fox And Hounds
Se modificó la creación del tablero, y se simuló el grafo usando los carácteres ( "-", "/", "\") en las casillas en donde al menos un número de la coordenada es impar, mientras que si ambos números son pares, entonces es una casilla, un Hound o Hare (esto debido a que Hare y Hounds solo pueden moverse una cantidad par (+2 ó -2)
Función que toma como parámetro una tupla con las coordenadas finales (xf,yf) de la pieza y una lista de pares (x,y). Se utiliza para restringir los movimientos posibles, ya que las coordenadas ([0,0), (0,4), (8,0), (8,4)] son las únicas coordenadas a las que se puede llegar a través de un movimiento y a la vez no son válidas (ya que son espacios vacíos), por lo que comprobamos si (xf,yf) pertenece a esa lista, si pertenece retorna False, de lo contrario retorna True.
Función que toma como parámetros dos tuplas, una con la posición inicial y otra con la posición final. Siguiendo las restricciones de movimiento del juego, nos aseguramos que al menos una de las posiciones dadas no esté en la lista de coordenadas: [(2,2),(4,0),(6,2),(4,4)]. Esto debido a que no es posible moverse desde una posición que pertenece a la lista hacia otra posición que también pertenece a la lista
Función que toma como parámetros dos Strings (Equipo escogido y nombre del jugador) y retorna una lista de Players, dependiendo del equipo escogido. Se utilizó Pattern Matching para retornar la lista indicada para cada caso, si el jugador escoge "Hounds", entonces retorna [human name, cpuEval "CPU" hareAndHoundsEval], si escoge "Hare", retorna [cpuEval "CPU" hareAndHoundsEval, human name], de lo contrario mostrará un error por consola, indicando que no se ha seleccionado una opción válida.
4.- leftSide :: Int -> [Piece] -> Bool
Función que toma como parámetro la coordenada x de Hare y una lista con todas las piezas, mediante recursión se comprueba si Hare está a una posición <= de todos los Hounds (evaluando solamente con la coordenada x), de ser así, retorna True y Hare ganaría, ya que los Hounds no pueden retroceder.
Nombre: Yi cong Zhou Zhou - Rol: 201873024-6
Aclaraciones:
Se agregó la opción de elegir el equipo (Hounds o Hare), así como el paso del nombre de la persona que está jugando mediante la consola
Se crearon las funciones diagonalRestriction, chooseTeam, isInList y leftSide para poder abordar la creación del juego.
Las condiciones de victoria son: Hare llega a la posición (1,1) (primera casilla del extremo izquierdo), Hare llega a una posición que está a la izquierda de todos los Hounds (ya que éstos no pueden retroceder) o Hounds logran acorralar a Hare, dejándolo sin movimientos
Se utilizó el CPUEval de Fox And Hounds
Se modificó la creación del tablero, y se simuló el grafo usando los carácteres ( "-", "/", "\") en las casillas en donde al menos un número de la coordenada es impar, mientras que si ambos números son pares, entonces es una casilla, un Hound o Hare (esto debido a que Hare y Hounds solo pueden moverse una cantidad par (+2 ó -2)
Funciones
1.- isInList :: (Eq a) => (a,a) -> [(a,a)] -> Bool
Función que toma como parámetro una tupla con las coordenadas finales (xf,yf) de la pieza y una lista de pares (x,y). Se utiliza para restringir los movimientos posibles, ya que las coordenadas ([0,0), (0,4), (8,0), (8,4)] son las únicas coordenadas a las que se puede llegar a través de un movimiento y a la vez no son válidas (ya que son espacios vacíos), por lo que comprobamos si (xf,yf) pertenece a esa lista, si pertenece retorna False, de lo contrario retorna True.
2.- diagonalRestriction :: (Integral a,Eq a) => (a,a) -> (a,a) -> Bool
Función que toma como parámetros dos tuplas, una con la posición inicial y otra con la posición final. Siguiendo las restricciones de movimiento del juego, nos aseguramos que al menos una de las posiciones dadas no esté en la lista de coordenadas: [(2,2),(4,0),(6,2),(4,4)]. Esto debido a que no es posible moverse desde una posición que pertenece a la lista hacia otra posición que también pertenece a la lista
3.- chooseTeam :: String -> String -> [Player HareAndHounds]
Función que toma como parámetros dos Strings (Equipo escogido y nombre del jugador) y retorna una lista de Players, dependiendo del equipo escogido. Se utilizó Pattern Matching para retornar la lista indicada para cada caso, si el jugador escoge "Hounds", entonces retorna [human name, cpuEval "CPU" hareAndHoundsEval], si escoge "Hare", retorna [cpuEval "CPU" hareAndHoundsEval, human name], de lo contrario mostrará un error por consola, indicando que no se ha seleccionado una opción válida.
4.- leftSide :: Int -> [Piece] -> Bool
Función que toma como parámetro la coordenada x de Hare y una lista con todas las piezas, mediante recursión se comprueba si Hare está a una posición <= de todos los Hounds (evaluando solamente con la coordenada x), de ser así, retorna True y Hare ganaría, ya que los Hounds no pueden retroceder.