Inteligencia Artificial - AlgoritmoMinMax

 
Vista:

AlgoritmoMinMax

Publicado por alberto (1 intervención) el 25/06/2011 20:02:00
Hola amigos, estoy haciendo un programa en java para el juego fanorama utilizando el algoritmo minmax.
Mi problema es el siguiente: en el la funcion minMax utilizo un tablero auxiliar para realizar algunas operaciones. Tras terminar de trabajar con éste, mi tablero inicial toma los mismos valores que el tablero auxiliar, mientras no deberia ser así.
¿Sabeis por qué puede ser?
(Aunque hay muchas funciones, el problema creo que está en minMax)
Gracias.


Adjunto el código :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {

/**
* @param args
*/

public static void inicializar_tablero(char nTablero[][])
{
nTablero[0][0]='X';
nTablero[0][1]='X';
nTablero[0][2]='X';
nTablero[1][0]='X';
nTablero[1][1]=' ';
nTablero[1][2]='O';
nTablero[2][0]='O';
nTablero[2][1]='O';
nTablero[2][2]='O';
}
public static void imprimir_tablero(char nTablero[][])
{
System.out.println(" 0 1 2");
for(int i=0;i<3;i++)
{System.out.print(i);System.out.print(' ');
for(int j=0;j<3;j++)
{
System.out.print('|');
System.out.print(nTablero[i][j]);
}
System.out.print('|');
System.out.print('\n');
}
}

public static boolean movimientoValido(int origen_i, int origen_j,int destino_i,int destino_j, char nTablero[][],char jugador)
{
if( (origen_i<0 || origen_i>2) || (origen_j<0 || origen_j>2) || (destino_i<0 || destino_i>2) ||(destino_j<0 || destino_j>2) )
{
return false;
}
if(nTablero[origen_i][origen_j]==jugador)
{
if(nTablero[destino_i][destino_j]==' ')
{
//movimiento arriba-abajo
if(origen_j==destino_j)
{
if(origen_i-destino_i==1 || origen_i-destino_i==-1)
{
check_comer(origen_i,origen_j,destino_i,destino_j,jugador,nTablero);
return true;
}
}
//movimiento izq-dcha
if(origen_i==destino_i)
{
if(origen_j-destino_j==1 || origen_j-destino_j==-1)
{
check_comer(origen_i,origen_j,destino_i,destino_j,jugador,nTablero);
return true;
}
}
//movimiento diagonal izq-dcha arriba y abajo.
if( ((origen_i-destino_i==1) && (origen_j-destino_j==-1) )||((origen_i-destino_i==-1) && (origen_j-destino_j==1)))
{
if(destino_i==1 && (destino_j==0 || destino_j==2))
{
return false;
}
check_comer(origen_i,origen_j,destino_i,destino_j,jugador,nTablero);
return true;
}
if( ((origen_i-destino_i==1) && (origen_j-destino_j==1))|| ( (origen_i-destino_i==-1) && (origen_j-destino_j==-1)))
{
if(destino_i==1 && (destino_j==0 || destino_j==2))
{
return false;
}
check_comer(origen_i,origen_j,destino_i,destino_j,jugador,nTablero);
return true;
}

}

}

return false;
}

public static void check_comer(int origen_i, int origen_j, int destino_i, int destino_j, char jugador, char nTablero[][])
{
char oponente='X';
if (jugador=='X') oponente='O';

//movimiento en la misma fila
if(origen_i==destino_i)
{
//hacia la derecha
if(origen_j<destino_j && destino_j<2 && nTablero[destino_i][destino_j+1]==oponente)
{
nTablero[destino_i][destino_j+1]=' ';
}
//derecha,comer con alejamiento
if(origen_j<destino_j && destino_j==2 && nTablero[destino_i][0]==oponente)
{
nTablero[destino_i][0]=' ';
}
//hacia la izquierda
if(destino_j<origen_j && destino_j>0 && nTablero[destino_i][destino_j-1]==oponente)
{
nTablero[destino_i][destino_j-1]=' ';
}
if(destino_j<origen_j && destino_j==0 && nTablero[destino_i][2]==oponente)
{
nTablero[destino_i][2]=' ';
}
}
//movimiento en la misma columna
if(origen_j==destino_j)
{ //hacia abajo
if(origen_i<destino_i && destino_i<2 && nTablero[destino_i+1][destino_j]==oponente)
{
nTablero[destino_i+1][destino_j]=' ';
}
//hacia abajo con alejamiento
if(origen_i<destino_i && destino_i==2 && nTablero[0][destino_j]==oponente)
{
nTablero[0][destino_j]=' ';
}
//hacia arriba
if(destino_i<origen_i && destino_i>0 && nTablero[destino_i-1][destino_j]==oponente)
{
nTablero[destino_i-1][destino_j]=' ';
}
//hacia arriba con alejamiento
if(destino_i<origen_i && destino_i==0 && nTablero[2][destino_j]==oponente)
{
nTablero[2][destino_j]=' ';
}
}
//diagonales que bajan
if(origen_i<destino_i)
{ //hacia la derecha
if(origen_j<destino_j)
{
//si nos colocamos en el centro
if(destino_i==1 && destino_j==1 && nTablero[2][2]==oponente)
{
nTablero[2][2]=' ';
}

//si vamos del centro hacia la esquina (come por alejamiento)
if(destino_i==2 && destino_j==2 && nTablero[0][0]==oponente)
{
nTablero[0][0]=' ';
}
}
//hacia la izquierda
if(origen_j>destino_j)
{
//si nos colocamos en el centro
if(destino_i==1 && destino_j==1 && nTablero[2][0]==oponente)
{
nTablero[2][0]=' ';
}
//si vamos del centro hacia la esquina (come por alejamiento)
if(destino_i==2 && destino_j==0 && nTablero[0][2]==oponente)
{
nTablero[0][2]=' ';
}
}
}
//diagonales que suben
if(origen_i>destino_i)
{ //hacia la derecha
if(origen_j<destino_j)
{
//si nos colocamos en el centro
if(destino_i==1 && destino_j==1 && nTablero[0][2]==oponente)
{
nTablero[0][2]=' ';
}
//si nos colocamos en la esquina(alejamiento)
if(destino_i==0 && destino_j==2 && nTablero[2][0]==oponente)
{
nTablero[2][0]=' ';
}
}
//hacia la izquierda
if(origen_j>destino_j)
{
//si nos colocamos en el centro
if(destino_i==1 && destino_j==1 && nTablero[0][0]==oponente)
{
nTablero[0][0]=' ';
}
//si nos colocamos en la esquina
if(destino_i==0 && destino_j==0 &&nTablero[2][2]==oponente)
{
nTablero[2][2]=' ';
}
}
}
}
private static boolean mover_ficha_auto(char tablero[][],char jugador,int origen_i,int origen_j,int destino_i, int destino_j)
{
if(movimientoValido(origen_i, origen_j,destino_i,destino_j, tablero,jugador))
{ tablero[origen_i][origen_j]=' ';
tablero[destino_i][destino_j]=jugador;
return true;
}
else
{return false;}
}
public static boolean mover_ficha(char nTablero[][],char jugador) throws IOException
{
System.out.println("Player: "+jugador);
System.out.println("Choose the piece to move (insert coordinates x,y)");
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String str=in.readLine();
int origen_i=Integer.valueOf(str).intValue();
String str1=in.readLine();
int origen_j=Integer.valueOf(str1).intValue();

System.out.println("Choose the place to move");
str1=in.readLine();
int destino_i=Integer.valueOf(str1).intValue();
str1=in.readLine();
int destino_j=Integer.valueOf(str1).intValue();

if(movimientoValido(origen_i, origen_j,destino_i,destino_j, nTablero,jugador))
{ nTablero[origen_i][origen_j]=' ';
nTablero[destino_i][destino_j]=jugador;
return true;
}
else
{
System.out.println("Movement not valid");
imprimir_tablero(nTablero);
return false;

}
}
public static char cambiar_jugador(char jugador)
{
if(jugador=='X')
{
return 'O';
}
else
{
return 'X';
}
}
public static int[] minMax(char nTablero[][])
{

char tablero[][]=nTablero;
int posicioni=0;
int posicionj=0;
int posicion[] = null;
for(int i=0; i<3;i++)
{
for(int j=0;j<3;j++)
{

if(tablero[i][j]=='O')
{
System.out.println("Ficha O en: "+i+" "+j);
//mover en todas las posiciones posibles
int auxi,auxj;
for(auxi=i-1;auxi<i+2;auxi++)
{
for(auxj=j-1;auxj<j+2;auxj++)
{
if(mover_ficha_auto(tablero, 'O', i, j, auxi, auxj))
{
System.out.println("Entra; i:"+auxi+" j:"+auxj);
}
}
}

}
}
}
///*****
System.out.println("nuevo");
imprimir_tablero(tablero);
System.out.println("antiguo");
imprimir_tablero(nTablero);

return posicion;
}
public static boolean checkWin(char nTablero[][])
{
int A=0;
int B=0;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(nTablero[i][j]=='X')
{A++;}
if(nTablero[i][j]=='O')
{B++;}
}
}
if(A==0 || B==0)
{
return true;
}
return false;
}

public static void main(String[] args)
{
char turno='X';
char nTablero[][] = new char[3][3];
inicializar_tablero(nTablero);
imprimir_tablero(nTablero);
do
{
if (turno=='O')
{
minMax(nTablero);
}
try {
while(!mover_ficha(nTablero, turno));

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
imprimir_tablero(nTablero);

//cambiar de usuario
if(turno=='X'){turno='O';}
else{turno='X';}

}while (!checkWin(nTablero));
System.out.println("¡¡¡¡¡¡¡¡¡¡¡END OF THE GAME!!!!!!!");
}

}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder