Game.hs: Se modificó para mostrar un empate cuando se devuelve que el ganador es n = 2.
Makefile:
Se añadió lo necesario para compilar el juego TicTacToe.
-Piece.hs: Se añadió la función putMark que sigue el mismo método que movePiece pero con la restricción que las piezas solo pueden moverse desde fuera hacia dentro del tablero.
TicTacToe.hs: Aquí se define el funcionamiento del juego TicTacToe y su IA. Quise incluir algunas funciones que no logré hacer funcionar con el código para dar una idea de lo que quería lograr, pues el juego en si funciona bien pero tuve problemas para poder programar la IA de manera que esta fuera desafiante (definitivamente funcional no es lo mío ;(). A continuación describo algunas funciones que podrian no haber quedado claras.
instance Game TicTacToe: se modificaron las reglas generales de winner para adaptarse al juego TicTacToe.
instance Show TicTacToe: se modificó para que el player 0 mostrara las X y el player 1 las O.
pieceMoves: se definieron los movimientos posibles para una pieza y se le añadieron restricciones.
isEnemyPlayerWin: esta funcion es implementada por ticTacToeEval y busca que la CPU pueda reaccionar cuando el otro player esté a punto de ganar. (Noté que por alguna razón la CPU bloquea los sitios donde el otro player iba a ganar pero con 1 turno de retraso)
isCurrentPlayerWin: esta funcion es implementada por ticTacToeEval y busca que la CPU pueda darse cuenta cuando esté a punto de ganar y marcar la posición para esto. (Por alguna razon funciona a veces pero otras la CPU prefiere bloquear un sitio donde el enemigo iba a ganar en el turno anterior en vez de ganar).
ticTacToeEval: sigue una metodología parecida a FoxandHoundsEval pero utiliza las funciones isEnemyPlayerWin y isCurrentPlayerWin para decidir los movimientos, la idea aquí era implementar mas funciones que permitieran a la CPU actuar de acuerdo a distintas otras circunstancias, pero me costó mucho comprender el funcionamiento de ésta funcion en conjunción con cpuEval. Cabe destacar que se ocupa a cpuEval como la IA, ya que esta implementa a ticTacToeEval, pensé en crear una funcion de CPU aparte pero me ganó un poco la programación funcional.
ticTacToeIni: acá se inicializan las piezas necesarias para cada jugador (5 movimientos para cada uno) fuera del tablero, de modo que el player 0 tiene sus piezas en la columna (3,y) y el player 1 en la columna (4,y)
-Funciones prototipo no utilizadas:
cpuFirstMove: la idea de esta función era permitir a la IA reaccionar de acuerdo al primer movimiento del player enemigo, sin embargo no encontre la forma de que esta solo actuara en el primer movimiento de la IA. Otro intento de esto se ve en la función isEnemyFirstMove.
cpuWinMove y cpuDontLoseMove: estas funciones comprobarían a lo largo de todo el tablero si es que existía la posibilidad de que la CPU ganara con un movimiento o si perdiera con un movimiento enemigo, respectivamente, sin embargo no logré terminarla ya que debia comprobar el FirstMove antes. Despues este comportamiento fue traducido en otra metodología a las funciones isCurrentPlayerWin y isEnemyPlayerWin.
Nombre: Joaquín Tapia ROL: 201873016-5
Game.hs: Se modificó para mostrar un empate cuando se devuelve que el ganador es n = 2.
Makefile: Se añadió lo necesario para compilar el juego TicTacToe.
-Piece.hs: Se añadió la función putMark que sigue el mismo método que movePiece pero con la restricción que las piezas solo pueden moverse desde fuera hacia dentro del tablero.
TicTacToe.hs: Aquí se define el funcionamiento del juego TicTacToe y su IA. Quise incluir algunas funciones que no logré hacer funcionar con el código para dar una idea de lo que quería lograr, pues el juego en si funciona bien pero tuve problemas para poder programar la IA de manera que esta fuera desafiante (definitivamente funcional no es lo mío ;(). A continuación describo algunas funciones que podrian no haber quedado claras.
instance Game TicTacToe: se modificaron las reglas generales de winner para adaptarse al juego TicTacToe.
instance Show TicTacToe: se modificó para que el player 0 mostrara las X y el player 1 las O.
pieceMoves: se definieron los movimientos posibles para una pieza y se le añadieron restricciones.
isEnemyPlayerWin: esta funcion es implementada por ticTacToeEval y busca que la CPU pueda reaccionar cuando el otro player esté a punto de ganar. (Noté que por alguna razón la CPU bloquea los sitios donde el otro player iba a ganar pero con 1 turno de retraso)
isCurrentPlayerWin: esta funcion es implementada por ticTacToeEval y busca que la CPU pueda darse cuenta cuando esté a punto de ganar y marcar la posición para esto. (Por alguna razon funciona a veces pero otras la CPU prefiere bloquear un sitio donde el enemigo iba a ganar en el turno anterior en vez de ganar).
ticTacToeEval: sigue una metodología parecida a FoxandHoundsEval pero utiliza las funciones isEnemyPlayerWin y isCurrentPlayerWin para decidir los movimientos, la idea aquí era implementar mas funciones que permitieran a la CPU actuar de acuerdo a distintas otras circunstancias, pero me costó mucho comprender el funcionamiento de ésta funcion en conjunción con cpuEval. Cabe destacar que se ocupa a cpuEval como la IA, ya que esta implementa a ticTacToeEval, pensé en crear una funcion de CPU aparte pero me ganó un poco la programación funcional.
ticTacToeIni: acá se inicializan las piezas necesarias para cada jugador (5 movimientos para cada uno) fuera del tablero, de modo que el player 0 tiene sus piezas en la columna (3,y) y el player 1 en la columna (4,y)
-Funciones prototipo no utilizadas:
cpuFirstMove: la idea de esta función era permitir a la IA reaccionar de acuerdo al primer movimiento del player enemigo, sin embargo no encontre la forma de que esta solo actuara en el primer movimiento de la IA. Otro intento de esto se ve en la función isEnemyFirstMove.
cpuWinMove y cpuDontLoseMove: estas funciones comprobarían a lo largo de todo el tablero si es que existía la posibilidad de que la CPU ganara con un movimiento o si perdiera con un movimiento enemigo, respectivamente, sin embargo no logré terminarla ya que debia comprobar el FirstMove antes. Despues este comportamiento fue traducido en otra metodología a las funciones isCurrentPlayerWin y isEnemyPlayerWin.