4 en raya (*.pdf) - Wiphala.net
4 en raya (*.pdf) - Wiphala.net
4 en raya (*.pdf) - Wiphala.net
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Diseño del juego de N <strong>en</strong> <strong>raya</strong><br />
– Implem<strong>en</strong>tación del 4 <strong>en</strong> <strong>raya</strong> –<br />
Universidad Nacional de Ing<strong>en</strong>iería<br />
Joseph Ramos Valdivia Aldo Mallma Granados Edith Santos Lor<strong>en</strong>zo<br />
Resum<strong>en</strong><br />
Nuestro trabajo consiste <strong>en</strong> repres<strong>en</strong>tar el juego de n <strong>en</strong><br />
<strong>raya</strong> y considerar heurísticas, que permitan a un ag<strong>en</strong>te hacer<br />
el papel del competidor.<br />
También implem<strong>en</strong>tamos <strong>en</strong> Lisp un caso particular del<br />
n <strong>en</strong> <strong>raya</strong>, el 4 <strong>en</strong> <strong>raya</strong>; que cu<strong>en</strong>ta con un esquema un poco<br />
difer<strong>en</strong>te al esquema considerado para el n <strong>en</strong> <strong>raya</strong>; aún<br />
así nuestro ag<strong>en</strong>te es efectivo. En el programa la persona<br />
debe ingresar la columna donde desea jugar a difer<strong>en</strong>cia<br />
del juego real.<br />
I. Introducción<br />
Al <strong>en</strong>tret<strong>en</strong>ernos con un juego, seguimos sus reglas y<br />
nuestra habilidad de responder ante situaciones que nos<br />
llevan a adquirir, cada vez más, experi<strong>en</strong>cia y destreza <strong>en</strong><br />
el modo de juego.<br />
Sin embargo, podemos repres<strong>en</strong>tar esa destreza <strong>en</strong> un<br />
programa y aprovechar los recursos que ti<strong>en</strong>e, para <strong>en</strong>contrar<br />
diversas soluciones a un problema de juego o darle<br />
cierta intelig<strong>en</strong>cia, para que sea capaz de competir con humanos<br />
y hacer más interesante el juego.<br />
II.<br />
Objetivos<br />
Proporcionar un esquema g<strong>en</strong>eral para la solución del<br />
juego de n <strong>en</strong> <strong>raya</strong>, considerando aspectos de diseño que<br />
proporcion<strong>en</strong> una bu<strong>en</strong>a base para su posterior implem<strong>en</strong>tación.<br />
Implem<strong>en</strong>tar el juego 1 para el caso del 4 <strong>en</strong> <strong>raya</strong>, considerando<br />
una heurística efectiva que permita al ag<strong>en</strong>te<br />
máquina un desempeño aceptable.<br />
III.<br />
Problema<br />
Al <strong>en</strong>tret<strong>en</strong>ernos con un juego, seguimos sus reglas y<br />
nuestra habilidad de responder ante situaciones que casi a<br />
m<strong>en</strong>udo, nos llevan a adquirir cada vez más, experi<strong>en</strong>cia<br />
1 Esta implem<strong>en</strong>tación <strong>en</strong> Lisp, no considera todo el análisis g<strong>en</strong>eral<br />
considerado <strong>en</strong> el n <strong>en</strong> <strong>raya</strong>, mas muestra un aspecto interesante de la<br />
utilización de heurísticas.<br />
y destreza <strong>en</strong> el modo de juego. El juego de n <strong>en</strong> <strong>raya</strong> 2 y<br />
todos sus derivados como 4 <strong>en</strong> <strong>raya</strong>.<br />
IV.<br />
IA y Lisp<br />
Marco teórico<br />
La intelig<strong>en</strong>cia artificial es un conjunto de métodos y<br />
filosofía, y por lo tanto no está atada a un l<strong>en</strong>guaje <strong>en</strong> particular.<br />
Los problemas de IA requier<strong>en</strong> que los programas<br />
manipul<strong>en</strong> conocimi<strong>en</strong>to <strong>en</strong> lugar de números. Los investigadores<br />
desarrollaron nuevos l<strong>en</strong>guajes para atacar estos<br />
problemas.<br />
Lisp, de List Processing, fue creado por McCarthy<br />
(MIT) <strong>en</strong> los 60. Es un l<strong>en</strong>guaje de propósito g<strong>en</strong>eral, procedural,<br />
basado <strong>en</strong> aritmética y manipulación de símbolos.<br />
IA y juegos<br />
Hay una gran cantidad de juegos como el ajedrez, Go;<br />
así como problemas como el de la n reynas que han sido<br />
resueltos con métodos de intelig<strong>en</strong>cia artificial, los que <strong>en</strong><br />
un inicio se basaban <strong>en</strong> algoritmos de búsqueda que no<br />
empleaban heurísticas para una solución efici<strong>en</strong>te de las<br />
búsquedas.<br />
Juego n <strong>en</strong> <strong>raya</strong><br />
Este juego consiste <strong>en</strong> un tablero que es un arreglo de m<br />
x m, donde participan dos jugadores, los que pon<strong>en</strong> sobre<br />
el tablero una marca determinada X u O 3 respectivam<strong>en</strong>te<br />
hasta formar n secu<strong>en</strong>cias con sus respectivas marcas,<br />
<strong>en</strong> forma continua, <strong>en</strong> las sigui<strong>en</strong>tes direcciones: horizontal,<br />
vertical o diagonal. El primero que forme la secu<strong>en</strong>cia<br />
seguida de n marcas (según el juego) ganará el juego.<br />
Los jugadores colocan sus marcas sobre el tablero, no<br />
permitiéndose quitarlas una vez jugadas.<br />
2 Casi siempre el más jugado<br />
3 Las marcas X u O son las más comunes de ver <strong>en</strong> un juego de n <strong>en</strong><br />
<strong>raya</strong>, sin embargo no se obliga a que deban considerase <strong>en</strong> todos lo juego,<br />
pudi<strong>en</strong>do ser otras marcas que sean difer<strong>en</strong>tes una a otra.<br />
1
Intelig<strong>en</strong>cia Artificial 2<br />
V. Metodología<br />
Para empezar definiremos el espacio <strong>en</strong> el cual se desarrollará<br />
el juego, luego las posibles jugadas para que por<br />
ultimo se defina la posición de la jugada.<br />
Para poder implem<strong>en</strong>tar el juego es necesario que se respet<strong>en</strong><br />
determinadas reglas, pero a su vez es necesario también<br />
definir una Heurística adecuada mediante la cual el<br />
jugador maquina pueda decidir donde jugar a fin de que le<br />
de mayor opción a ganar.<br />
Ahora definiremos a nuestro caso ejemplo repres<strong>en</strong>tado<br />
<strong>en</strong> el cuatro <strong>en</strong> <strong>raya</strong> <strong>en</strong> dos dim<strong>en</strong>siones.<br />
Para iniciar el juego el programa iniciara el juego para<br />
ello debe de buscar una posición adecuada donde jugar de<br />
acuerdo a la heurística planteada.<br />
Sin embargo exist<strong>en</strong> dos variables muy importantes <strong>en</strong><br />
nuestro juego, las cuales nos definirán el espacio del juego,<br />
para hacerlo mas s<strong>en</strong>cillo y que el usuario pueda jugar con<br />
tranquilidad el ingresará al programa el valor de la posición,<br />
el programa cogerá el valor y lo trasformara a un par<br />
ord<strong>en</strong>ado (i , j) el cual nos indicará <strong>en</strong> que posición esta<br />
jugando el usuario, para luego asignarle la marca correspondi<strong>en</strong>te<br />
a su juego.<br />
Para la evaluación de la posición donde la máquina efectuará<br />
la jugada se t<strong>en</strong>drá una función basada <strong>en</strong> el algoritmo<br />
MINIMAX con PODA.<br />
Basándonos <strong>en</strong> este algoritmo primero se evalúa la función<br />
para la máquina, cuyo algoritmo es como se describe<br />
a continuación:<br />
Para com<strong>en</strong>zar pres<strong>en</strong>tamos al estado inicial:<br />
A continuación, de manera análoga, evaluamos la función<br />
para las posibilidades de éxito del adversario:<br />
Una vez que se ti<strong>en</strong>e el punto de la matriz donde se efectuará<br />
la jugada, se procede a registrarlo, asignarle el valor<br />
correspondi<strong>en</strong>te para las jugadas de la máquina (1) y a imprimir<br />
la posición ordinal de la jugada para que sea visualizada<br />
por el adversario.
Intelig<strong>en</strong>cia Artificial 3<br />
Se ubica la posición <strong>en</strong> la matriz convirti<strong>en</strong>do el valor<br />
ordinal <strong>en</strong> las coord<strong>en</strong>adas cartesianas:<br />
Se asigna el valor correspondi<strong>en</strong>te <strong>en</strong> la posición de la<br />
matriz para las jugadas del adversario:<br />
Después de efectuada la jugada compararemos el estado<br />
actual con los estados meta:<br />
Nuevam<strong>en</strong>te se evalúa si se ha alcanzado alguno de los<br />
estados meta:<br />
Se evalúa si el juego ha concluido:<br />
Si no se ha alcanzado el estado meta se repite el bucle<br />
desde que juega la máquina:<br />
Caso contrario el juego habría llegado a su fin:<br />
En caso contrario se habilita al adversario para que<br />
efectúe su jugada:<br />
Se captura la posición (siempre ordinal) de su jugada:<br />
Implem<strong>en</strong>tación <strong>en</strong> Lisp del juego de cuatro<br />
<strong>en</strong> <strong>raya</strong><br />
Hemos realizado una implem<strong>en</strong>tación <strong>en</strong> Lisp para el<br />
caso del cuatro <strong>en</strong> <strong>raya</strong>. La lógica varía un poco de la descrita<br />
anteriorm<strong>en</strong>te, por ejemplo <strong>en</strong> la forma como se repres<strong>en</strong>ta<br />
la celda del tablero. En este caso se considera al
Intelig<strong>en</strong>cia Artificial 4<br />
tablero como un arreglo de 6 x 6 (figura 1) y <strong>en</strong> vez que el<br />
jugador o ag<strong>en</strong>te humano ingrese la marca respectiva a una<br />
celda definida por él mismo, sólo t<strong>en</strong>drá opción a indicar<br />
la columna donde desea colocar su respectiva marca (X) y<br />
será el programa, el que la ubique <strong>en</strong> un respectivo lugar<br />
de la columna, <strong>en</strong> el ord<strong>en</strong> de abajo hacia arriba.<br />
De haber una marca del ag<strong>en</strong>te máquina <strong>en</strong> la columna<br />
indicada por el jugador, su marca se colocará <strong>en</strong> la posición<br />
superior sigui<strong>en</strong>te a la del ag<strong>en</strong>te máquina, siempre y<br />
cuando el lugar que ocupe el ag<strong>en</strong>te máquina, interfiera el<br />
ord<strong>en</strong> dispuesto por el programa para la asignación de las<br />
marcas del humano.<br />
3. EsColumnaValida(columna)<br />
4. AveriguarPosicion(columna)<br />
5. MostrarTablero()<br />
6. LimpiarTablero()<br />
7. JuegaJugador(jugador)<br />
8. DeshacerJugada(columna)<br />
9. HacerJugada(columna jugador)<br />
10. EjecutarJugada(columna jugador)<br />
11. InmediatoMayor()<br />
12. MayorContrincante()<br />
13. GanaInmediato()<br />
14. JuegaPC()<br />
15. JuegaUsuario()<br />
16. QuedanCasillasLibres()<br />
17. Hay4EndiagonalAsc<strong>en</strong>d<strong>en</strong>te (fila colum jug)<br />
18. Hay4EndiagonalDesc<strong>en</strong>d<strong>en</strong>te (fila colum jug)<br />
Figura 1: Tablero como un arreglo de 6x6<br />
Con la función m<strong>en</strong>cionada a continuación buscamos<br />
que el PC int<strong>en</strong>te ganar el c<strong>en</strong>tro e impedir la creación de<br />
4 <strong>en</strong> <strong>raya</strong> verticales.<br />
La función devuelve 100 si la situación actual del tablero<br />
del juego es una victoria (indep<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te del jugador<br />
ganador); devuelve 1 si es un estado de tablas definitivas;<br />
<strong>en</strong> cualquier otro caso, devuelve un valor que estará<br />
compr<strong>en</strong>dido <strong>en</strong>tre 2 y 99 que será:<br />
ValorHeurístico = (16 * A0 * 0’05) + (16 * A1 * 0’15)<br />
+(16 * A2 * 0’30) +(16 * A3 *0’30) +(16 * A4 * 0’15)<br />
+(16 * A5 * 0’05)<br />
Donde A0,...,A5 son las alturas actuales de las columnas<br />
0, 1, 2, 3, 4 y 5. De este modo, ti<strong>en</strong>e más peso aquel tablero<br />
cuyas columnas sean más altas y estén más al c<strong>en</strong>tro, <strong>en</strong><br />
vez de aquellos cuyas columnas sean más bajas o estén<br />
más <strong>en</strong> los extremos. Se busca de este modo que el PC<br />
int<strong>en</strong>te ganar el c<strong>en</strong>tro e impedir la creación de 4 <strong>en</strong> <strong>raya</strong><br />
verticales.<br />
A continuación mostramos las funciones utilizadas para<br />
esta implem<strong>en</strong>tación 4 :<br />
19. Hay4EnDiagonal(jugador)<br />
20. Hay4HorizontalEnLaFila (fila jugador)<br />
21. Hay4VerticalEnLaColumna (columna jug)<br />
22. Hay4Vertical(jugador)<br />
23. Hay4Horizontal(jugador)<br />
24. HayVictoria()<br />
25. EvaluarEstado()<br />
26. M<strong>en</strong>sajeFinal(jugador estado)<br />
27. MostrarM<strong>en</strong>sajeInicial()<br />
28. Jugar()<br />
La función jugar() es la función principal que llama a<br />
las demás funciones y la que permite el juego.<br />
1. PedirQui<strong>en</strong>Juega()<br />
2. PedirTirada()<br />
4 En el código fu<strong>en</strong>te del programa se describe más detalladam<strong>en</strong>te las<br />
funciones m<strong>en</strong>cionadas.
Intelig<strong>en</strong>cia Artificial 5<br />
La PC preguntará por quién comi<strong>en</strong>za primero el juego,<br />
<strong>en</strong>tonces el jugador pondrá 1 si comi<strong>en</strong>za él o 0 <strong>en</strong> caso<br />
contrario. El jugador solo puede seleccionar la columna<br />
donde desea jugar mas no la posición exacta, la Pc lo hace<br />
por él, de abajo hacia arriba.<br />
Refer<strong>en</strong>cias<br />
[1] Russell S y Norvig P. ”Intelig<strong>en</strong>cia Artificial un <strong>en</strong>foque<br />
moderno”<br />
Pretince may Hispanoamericana SA, seguda versión.<br />
[2] Ansóstegui C y Manyá F. ”Una introducción a los<br />
algoritmos de satisfactibilidad”<br />
Departam<strong>en</strong>to de Informatica e Ing<strong>en</strong>iería Industrial<br />
Universidad de Lleida. 2003<br />
[3] Burzyn P. ”Complejidad Computacional <strong>en</strong> Problemas<br />
de Modificación de Aristas <strong>en</strong> Grafos”<br />
Facultad de Ci<strong>en</strong>cias Exactas y Naturales.<br />
Universidad de Bu<strong>en</strong>os Aires.<br />
En caso la máquina consiga los cuatro <strong>en</strong> línea aparecerá<br />
un m<strong>en</strong>saje indicando el ganador, al igual que <strong>en</strong> el<br />
caso si el jugador ganara. De haber empate aparecerá <strong>en</strong> la<br />
pantalla nil.<br />
VI.<br />
Conclusión<br />
El esquema de diseño del juego de n <strong>en</strong> <strong>raya</strong> resulta<br />
más eficaz de lograrse implem<strong>en</strong>tar; puesto que se basa<br />
<strong>en</strong> búsquedas de movimi<strong>en</strong>tos que conllev<strong>en</strong> a alcanzar un<br />
estado más v<strong>en</strong>tajoso para el ag<strong>en</strong>te máquina.<br />
Sin embargo, dado algunos contratiempos 5 de los integrantes<br />
del grupo, no se ha podido implem<strong>en</strong>tar <strong>en</strong> Lisp el<br />
primer diseño.<br />
La implem<strong>en</strong>tación del cuatro <strong>en</strong> <strong>raya</strong> pres<strong>en</strong>tada, no<br />
contempla un análisis exhaustivo como el anterior, ni considera<br />
un tipo de búsqueda <strong>en</strong> especial estudiado <strong>en</strong> clase,<br />
razón por la cual resulta s<strong>en</strong>cillo la posibilidad de ganarle<br />
a la máquina; además que no cumple con la funcionalidad<br />
completa del juego.<br />
Esperamos que este humilde aporte, <strong>en</strong> la implem<strong>en</strong>tación<br />
del juego de cuatro <strong>en</strong> <strong>raya</strong> y el análisis g<strong>en</strong>eral para<br />
un juego de n <strong>en</strong> <strong>raya</strong>, contribuya al apr<strong>en</strong>dizaje a los futuros<br />
alumnos que v<strong>en</strong>drán <strong>en</strong> el curso; así como <strong>en</strong> la mejora<br />
y perfección del esquema, diseño e implem<strong>en</strong>tación de<br />
este juego.<br />
5 La razón principal de los inconv<strong>en</strong>i<strong>en</strong>tes del grupo, para la implem<strong>en</strong>tación<br />
del juego de 4 <strong>en</strong> <strong>raya</strong>, se debió al <strong>en</strong>foque o análisis considerado,<br />
también a la dificultad <strong>en</strong> el apr<strong>en</strong>dizaje de la programación <strong>en</strong><br />
Lisp, pues la versión con la que trabajamos no cu<strong>en</strong>ta con un corrector de<br />
errores como <strong>en</strong> otros programas.