Anda di halaman 1dari 12

Maestra en Informtica Aplicada

Departamento de Computacin Facultad de Informtica Universidad de Camagey

Trabajo Final Sistemas Informticos Inteligentes

Diseo e implementacin del juego TicTacToe aplicando Inteligencia Artificial

Integrantes:

Dainier Escalona Barles Armando Luis Aguilar Yanes Juan Rafael Npoles

Las Tunas Diciembre de 2009

INTRODUCCIN

El amplio y codiciado mundo de los juegos aumenta considerablemente con el da a da. Muchos de estos interactan inteligentemente con los usuarios aplicando tcnicas avanzadas de la informtica, siendo la inteligencia artificial una de ellas y que veremos ejemplificada, mediante el mtodo de bsqueda entre adversarios o heurstica, en el conocido juego TicTacToe o comnmente llamado 3 en raya.

1. ANLISIS

Definicin del Problema


1 2 3 Se desarrollar un software que trata de un popular juego: Tres en Raya, que ser capaz de interactuar con el usuario realizando la jugada ms optima. El juego ser capaz de permitir que inicie el juego la pc o el usuario y mostrar cuando hay ganador y cuando hay empate. Todo lo anterior presentado ser implementado utilizando las tcnicas de bsqueda entre adversarios de la inteligencia artificial.

Objetivos
Desarrollar el Software. Hacer que la mquina (o el software) piense las jugadas a realizar para impedir que el usuario gane.

Definicin del Prototipo


El Tres en Raya es un juego muy conocido, que en un espacio de forma de una matriz de 3 x 3, lo que se intenta es llegar hacer tres en raya as como lo del smbolo en las imgenes siguientes:

Entre otras formas, resultando el representante del smbolo: ganador. Este tipo de juegos, de un entorno competitivo, en donde los objetivos de cada uno estn en conflicto, da ocasin a problemas de Bsqueda entre Adversarios. El jugar a juegos fue una de las primeras tareas de la Inteligencia Artificial (IA),

comenzando en la definicin de un movimiento ptimo y un algoritmo para encontrarlo. En este caso se utiliz el algoritmo: MINIMAX, con funciones de evaluacin HEURSTICA. En un problema de bsqueda normal, la solucin ptima sera una secuencia de movimientos que conducen a un estado objetivo (un estado terminal que es ganador).Por otra parte, para un juego donde el camino a la solucin genera un rbol demasiado grande ser necesario aplicar tcnicas de IA como en este caso heurstica, donde MAX debe maximizarla y MIN minimizarla. Buscando siempre la jugada ms ptima posible.

Algoritmo MINIMAX
Este algoritmo de por s es un algoritmo que aplica bsqueda en profundidad. Nuestro algoritmo MINIMAX, desarrollado tiene adems, la particularidad de usar heurstica para cada posible movimiento. Se genera un rbol de profundidad 2 (definida por nosotros) para cada jugada. Se aplica la funcin heurstica para cada terminal. En forma recursiva se avanza hacia las hojas del rbol, y de acuerdo a lo que toca, bien se minimiza o bien se maximiza en los nodos hojas, y los valores escogidos pasan hacia sus nodos padres, y as sucesivamente hasta llegar al nodo raz. Al valor final que resulta llegando a la raz se lo conoce como minimax.

2. DESARROLLO

Implementacin La forma ms inteligente de crear las heursticas que evalan el peso de las jugadas posibles es basndose en la realidad. Existen tres momentos importantes a la hora de definir las heursticas:
1- Si entre las jugadas posibles puedo ganar, la ms ptima es ganar. 2-

Si entre las jugadas posibles no gano pero el contrario tiene dos en lnea la jugada ms ptima es tapar el gane del contrario.

3- Si no existen entre las jugadas posibles gane ni tape hay que calcular la

ms ptima. H1 (gane)= Buscar dos de mis fichas en lnea y jugar en la tercera. H2 (tape)= Buscar dos de las fichas del contrario en lnea y jugar en la tercera. H3 (MiniMax)= e=(f1 + c1 + d1) - (f2 + c2 + d2) donde f, c y d son las filas, columnas y diagonales completamente disponibles para Max(1) y para Min(2).

Function Dos_en_linea(propietario As Integer) As Integer 'H1 y H2 Heurstica 1 y 2 'Determina si existen dos fichas en linea para tapar o para ganar en dependencia del _ del jugador que se pase en propietario 'Se retorna las coordenadas del tape o el gane 'X -> jugador= Falso (Computadora) 1 'O -> jugador= Verdadero (Usuario) 0 'MsgBox ("hola jugador: " & jugador) Dim I, J, cont, cont2, jganadora As Integer 'buscar por filas cont = 0: cont2 = 0 For I = 1 To 3 For J = 1 To 3 If ficha(I, J).propietario = propietario Then 'para las fichas marcadas cont = cont + 1 ElseIf ficha(I, J).propietario = 2 Then 'para las casillas en blanco cont2 = cont2 + 1 jganadora = ficha(I, J).lugar End If Next J If (cont = 2) And (cont2 = 1) Then Dos_en_linea = jganadora Exit Function End If cont = 0: cont2 = 0 Next I 'buscar por columnas cont = 0: cont2 = 0 For J = 1 To 3 For I = 1 To 3 If ficha(I, J).propietario = propietario Then 'para las fichas marcadas cont = cont + 1 ElseIf ficha(I, J).propietario = 2 Then 'para las casillas en blanco cont2 = cont2 + 1 jganadora = ficha(I, J).lugar End If Next I If (cont = 2) And (cont2 = 1) Then Dos_en_linea = jganadora Exit Function End If cont = 0: cont2 = 0 Next J 'buscar por diagonal 1 cont = 0: cont2 = 0 For I = 1 To 3 If ficha(I, I).propietario = propietario Then 'para las fichas marcadas cont = cont + 1 ElseIf ficha(I, I).propietario = 2 Then 'para las casillas en blanco cont2 = cont2 + 1 jganadora = ficha(I, I).lugar End If Next I

If (cont = 2) And (cont2 = 1) Then Dos_en_linea = jganadora Exit Function End If cont = 0: cont2 = 0 'buscar por diagonal inverza For I = 1 To 3 For J = 1 To 3 If (I = 1 And J = 3) Or (I = 2 And J = 2) Or (I = 3 And J = 1) Then If ficha(I, J).propietario = propietario Then 'para las fichas marcadas cont = cont + 1 ElseIf ficha(I, J).propietario = 2 Then 'para las casillas en blanco cont2 = cont2 + 1 jganadora = ficha(I, J).lugar End If End If Next J Next I If (cont = 2) And (cont2 = 1) Then Dos_en_linea = jganadora Exit Function End If Dos_en_linea = 10 End Function Function Mini_Max() As Integer 'Calcular el peso de cada jugada (casilla disponible) y aplicar MiniMax segn corresponda 'e=(f1+c1+d1)-(f2+c2+d2) donde f,c,d son las filas, columnas y diagonales completas disponibles _ para el jugador en cuestin (en este caso la computadora) 'Max(e) maximiza e el primero en salir 'Min(e) minimiza e el segundo en salir Dim joptima, may, men, I, indexmen, indexmay As Integer 'Determinar quien es Mini y quien es Max If (iniciopc = False) Then 'MsgBox ("la pc es Mini") pc = "Mini" Min = CInt(0) Max = CInt(1) Else 'MsgBox ("la pc es Max") pc = "Max" Min = CInt(1) Max = CInt(0) End If 'Calcular los pesos Calcular_Pesos 'Determinar jugada optima segn pc may = -100: men = 100

For I = 0 To UBound(casillasvacias) - 1 If may < casillasvacias(I).peso Then may = casillasvacias(I).peso indexmay = casillasvacias(I).lugar End If If men > casillasvacias(I).peso Then men = casillasvacias(I).peso indexmen = casillasvacias(I).lugar End If Next I 'MsgBox "Mayor: " & may & " en: " & indexmay & vbCrLf _ & "Menor: " & men & " en: " & indexmen Dim tempindex As Integer If Abs(men) < Abs(may) Then tempindex = indexmen indexmen = indexmay indexmay = tempindex End If 'MsgBox "Mayor: " & may & " en: " & indexmay & vbCrLf _ & "Menor: " & men & " en: " & indexmen If (iniciopc = True) Then Mini_Max = indexmen Else Mini_Max = indexmay End If 'casillasvacias End Function Sub Calcular_Pesos() Dim I, J, peso, cont As Integer Dim pmini, pmax As Integer 'Calcular peso para casillas (jugadas) disponibles For I = 0 To UBound(casillasvacias) - 1 'Hacer un espejo del tablero real pmax = Calcula_PesoXUser(Max, casillasvacias(I).x, casillasvacias(I).y) pmini = Calcula_PesoXUser(Min, casillasvacias(I).x, casillasvacias(I).y) casillasvacias(I).peso = pmax - pmini 'MsgBox casillasvacias(I).peso Next I End Sub Function Calcula_PesoXUser(MiniMax, x As Integer, y As Integer) As Integer Dim I, J, cont As Integer Dim fil, col, diag1, diag2 As Integer fil = 0: col = 0: diag1 = 0: diag2 = 0

'Crear un tablero virtual para hacer los calculos Dim tvirtual(3, 3) As ListaFicha 'Hacer un espejo del tablero real For I = 1 To 3 For J = 1 To 3 tvirtual(I, J).lugar = ficha(I, J).lugar tvirtual(I, J).x = ficha(I, J).x tvirtual(I, J).y = ficha(I, J).y tvirtual(I, J).propietario = ficha(I, J).propietario Next J Next I 'Jugar virtualmente a la casilla disponible actual tvirtual(x, y).propietario = 1 'MiniMax 'Calcular las F C D 'Contar las filas completamente disponible For I = 1 To 3 cont = 0 For J = 1 To 3 If (tvirtual(I, J).propietario = MiniMax) Or (tvirtual(I, J).propietario = 2) Then cont = cont + 1 End If Next J If cont = 3 Then fil = fil + 1 End If Next I 'Contar las columnas completamente disponible cont = 0 For J = 1 To 3 cont = 0 For I = 1 To 3 If (tvirtual(I, J).propietario = MiniMax) Or (tvirtual(I, J).propietario = 2) Then cont = cont + 1 End If Next I If cont = 3 Then col = col + 1 End If Next J 'Contar la diagonal si est disponible completamente cont = 0 For I = 1 To 3 If (tvirtual(I, I).propietario = MiniMax) Or (tvirtual(I, I).propietario = 2) Then cont = cont + 1 End If Next I If cont = 3 Then diag1 = diag1 + 1 End If 'Contar la diagonal inversa si est disponible completamente cont = 0

For I = 1 To 3 For J = 1 To 3 If (I = 1 And J = 3) Or (I = 2 And J = 2) Or (I = 3 And J = 1) Then If (tvirtual(I, J).propietario = MiniMax) Or (tvirtual(I, J).propietario = 2) Then cont = cont + 1 End If End If Next J Next I If cont = 3 Then diag2 = diag2 + 1 End If Calcula_PesoXUser = fil + col + diag1 + diag2 End Function Function Resultado_Heuristica() As Integer Dim jganadora, joptima As Integer Casillas_Libres 'H1 Buscar gane jganadora = Dos_en_linea(1) 'Buscar gane If jganadora <> 10 Then Enviar_Jugada (jganadora) Exit Function End If 'H2 Buscar tape jganadora = Dos_en_linea(0) 'Buscar tape If jganadora <> 10 Then Enviar_Jugada (jganadora) Exit Function End If 'H3 joptima = Mini_Max Enviar_Jugada (joptima) End Function

Anda mungkin juga menyukai