Algoritmo Minimax con Poda en Java: Implementación de Estados para el Juego de Othello
private static MiEstado maxValor(MiEstado e, int limite) {
nodosExplorados++;
if (limite == 0 || e.esFinal()) {
e.setMinMax(e.getUtilidad());
return e;
}
MiEstado r = null;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
MiEstado sucesor = (MiEstado) e.getSucesor(i, j, Jugador.MAX);
if (sucesor != null) {
MiEstado m = minValor(sucesor, limite - 1);
if (m != null && (r == null || r.getMinMax() < m.getMinMax())) {
r = sucesor;
r.setMinMax(m.getMinMax());
}
}
}
}
return r;
}
Constructor de copia de MiEstado
public MiEstado(Estado e) {
for (int x = 0; x < this.dimension; x++) {
for (int y = 0; y < this.dimension; y++) {
this.tablero[x][y] = e.getFicha(x, y);
}
}
}
Generación de sucesores
public Estado getSucesor(int i, int j, Jugador jugador) {
if (tablero[i][j] != null) {
return null;
}
Jugador contrario = jugador == Jugador.MAX ? Jugador.MIN : Jugador.MAX;
MiEstado sucesor = null;
int adi[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
int adj[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
for (int d = 0; d < adi.length; d++) {
int di = adi[d];
int dj = adj[d];
int idi = i + di;
int jdj = j + dj;
if (idi < 0 || jdj < 0 || idi > 7 || jdj > 7) {
continue;
}
if (tablero[idi][jdj] == contrario) {
for (int n = 2; n < dimension; n++) {
int ni = i + n * di;
int nj = j + n * dj;
if (ni < 0 || nj < 0 || ni > 7 || nj > 7 || tablero[ni][nj] == null) {
break;
}
if (tablero[ni][nj] == jugador) {
if (sucesor == null) {
sucesor = new MiEstado(this);
}
for (int v = 0; v < n; v++) {
sucesor.tablero[i + v * di][j + v * dj] = jugador;
}
break;
}
}
}
}
return sucesor;
}