2011-04-22 15 views
9

En primer lugar, soy un novato. También soy un conserje que nunca ha hecho un código de escritura de moneda de diez centavos. Esto es solo algo que me encanta hacer. Es por diversión :) Dicho esto, escribí este juego de tres en raya que tiene suficiente para no perder todos los juegos. (Creo que ai es lo que debería llamarse). Tiene algo así como 70 if/else si las declaraciones de las computadoras giran. Utilicé 3 matrices en int como esta:If(), else if() alternative in C++ (Is this AI?)

int L[2], M[2], R[2]; 

0 = blanco; 1 = X; 2 = O;
El tablero entonces 'Parece' como
L [0] | M [0] | R [0]
L [1] | M [1] | R [1]
L [2] | M [2] | R [2]

Así que, básicamente, escribió todos los escenarios posibles que podía pensar algo como:

if(M[0]==1 & M[1]==1 & M[2]==0){M[2] = 2;}//here the computer prevents a win 
else if(L[0] ==2&M[1]==2&R[2]==0){R[2]=2;}//here the computer wins 
//and so on....68 more times! 

Creo que mi pregunta (s) es (son):
¿Hay una mejor manera?
¿Hay alguna forma de lograr el mismo resultado con menos líneas de código?
¿Esto se considera inteligencia artificial?

+0

Una implementación interesante de un algoritmo de tres en raya, posiblemente como una macro ImageJ, leería la imagen PNG en http://xkcd.com/832/ (es decir, wget http: //imgs.xkcd. com/comics/tic_tac_toe_large.png) y extraer su respuesta de ella ... ¿cualquier tomador? –

+1

¡Sigan divirtiéndose! Claramente, en base a las respuestas, hay muchas cosas para que aprendas. La belleza de esto es que aprender una de las palabras de moda de lujo a continuación abre aún más cosas con las que jugar. Haga una búsqueda en "tic-tac-toe ai" para encontrar algunos enfoques para el problema. Y para que lo sepas, la respuesta correcta a "¿Hay alguna forma mejor de programar esto?" es "Sí. A mi manera". :) – gregg

+2

El estudio de las computadoras que juegan juegos para ganar es parte del campo de la inteligencia artificial. De hecho, los juegos fueron los primeros estudios de casos abordados en inteligencia artificial. Dicho esto, proporcionar una respuesta enlatada para cada movimiento posible no es realmente AI. :-) Tú eres el que proporciona la inteligencia; la computadora no está "descifrándolo" por sí misma. Casi cualquier libro de texto introductorio de AI discutirá el algoritmo Minimax descrito en la respuesta de Colin a continuación. –

Respuesta

5

El algoritmo estándar para esto se llama Minimax. Básicamente construye un árbol, donde el comienzo del juego es la raíz, y luego los niños representan cada movimiento posible que X puede hacer en el primer turno, luego los niños de cada uno de esos nodos son todos los movimientos que O puede hacer en respuesta. etc.Una vez que todo el árbol está lleno (lo cual es posible para Tic-Tac-Toe, pero para juegos como las computadoras de ajedrez todavía no tienen suficiente memoria), trabajas hacia arriba, suponiendo que ambos jugadores son lo suficientemente inteligentes como para hacer el mejor movimiento , y llegar a la jugada óptima. Aquí está another explanation de Minimax específicamente usando Tic Tac Toe como ejemplo.

1

Sí, hay mejores formas.

Lo más obvio sería considerar cómo las diferentes vistas de espejo del tablero simplificarían el número de casos.

Además, considere pre-almacenar patrones "interesantes" en matrices y luego comparar el estado del juego con los datos. Por ejemplo, una serie de patrones serían todas las formas en que un jugador puede ganar en el próximo movimiento.

Además, tenga en cuenta que con la declaración int L[2], sólo hay dos entradas en serie L, a saber L[0] y L[1]. Las referencias que tiene al L[2], M[2], etc. son errores que deberían haber sido detectados por el compilador. Considere subir el nivel de advertencia. Cómo se hace esto depende del compilador. Para gcc es -Wall.

Esto cuenta como una forma de inteligencia artificial. La serie de declaraciones if es conocimiento acumulado: cómo reconocer una situación y la mejor reacción apropiada a la misma.

+0

Eso es lo que pensaba. Parecía que una red neuronal sería apropiada para algo con muchos más resultados posibles. Eso me hace sentir mejor. También declare las matrices como L [5] en el código. No sé si eso es una buena práctica o no, pero me gustaría tener un par adicional por alguna razón. (?) –

+0

El espacio extra generalmente es una buena práctica, especialmente si hay una explicación (en un comentario al lado de la declaración) como "no usado por ahora". En este caso, los elementos adicionales se suman a una mano llena de bytes no utilizados. Eso es lo próximo a "libre" que puede ser. – wallyk

2

La página de Wikipedia sobre Tic-Tac-Toe tiene un muy buen esquema algoritmo para ganar (o atar) cada juego: http://en.wikipedia.org/wiki/Tic-tac-toe que es lo que solía hacer un juego de Tic-Tac-Toe hace varios años.

Después de comprender el algoritmo, una de las formas más inteligentes de implementar un jugador de computadora Tic-Tac-Toe es con un cuadrado mágico. El método se discute here. En cuanto al tamaño, he visto esto implementado en aproximadamente 50 líneas de código, publicaré el código si lo encuentro :)

Esto no es técnicamente inteligencia artificial, ya que generalmente AI se refiere a neuronas artificiales , capas de neuronas, descenso de gradiente, máquinas de vectores de soporte, resolución de polinomios complejos y similares. Solución de Tic-Tac-Toe

0

Lo más parecido a la IA real para resolver un juego de este tipo sería codificar una red artificial y entrenarla con todas las combinaciones del juego tictactoe.

En ese caso, el código no sería tan útil para resolver el problema sino que resolvería el problema tomando la decisión más razonable que resuelva el problema de un patrón formado en él.

Pero la codificación de una red neuronal no es una cosa trivial :)

+0

No necesita una red neuronal: puede hacerlo todo con un montón de cajas de fósforos y algunas cuentas. Intente buscar en Google "matchbox tic tac toe" –

+0

Un algoritmo mini-max o alpha-beta también se considera parte de todo el campo AI y sería mucho más simple y eficaz para ese tipo de problema – Voo

0

Cuando en la necesidad de codificar un sistema basado en reglas (como la IA se está construyendo), se puede utilizar un motor de reglas, como por ejemplo, clips (que es una herramienta desarrollada en la NASA para crear sistemas expertos escritos en C).

http://en.wikipedia.org/wiki/CLIPS

Tal vez sea una exageración para jugar tres en raya, pero si usted está en el estado de ánimo para el aprendizaje de la materia fresca AI, los sistemas expertos es una zona muy interesante, pero diferente (y tal vez menos complicado) que Neural Redes.

¡Diviértete!