private int max(Estado estado, Equipo equipo, ref List<Jugada> listaJugadas, int alfa, int beta, int profundidad) { // Retornar si es un nodo hoja if (profundidad == 0 || estado.esGol()) { return estado.valorar(); } // Generar sucesores int valor = -infinito; List<Jugada> jugadas = new List<Jugada>(); // Ficha for (int j = 0; j < estado.cantidadFichas; j++) { // Distancia for (int dj = 1; dj <= 2; dj++) { // Direccion Jugador for (int jx = -1; jx <= 1; jx++) { for (int jy = -1; jy <= 1; jy++) { if (jx == 0 && jy == 0) { continue; } int djx = estado.jugadores[j].x + jx * dj; int djy = estado.jugadores[j].y + jy * dj; // Validar el movimiento if (!validarMovimiento(estado.jugadores[j].x, estado.jugadores[j].y, djx, djy, false)) { continue; } // Mover al jugador Jugada jugadaJugador = new Jugada(estado.jugadores[j].x, estado.jugadores[j].y, djx, djy); jugadas.Add(jugadaJugador); estado.mover(equipo, jugadaJugador, false); // En caso de ser un pase de pelota, iterar en base a esta if (estado.pelota.tieneInfluencia(equipo, true)) { bool terminar; int m = iterarPelotaMax(estado, equipo, ref listaJugadas, ref jugadas, ref valor, ref alfa, ref beta, profundidad, out terminar); if (terminar) { estado.mover(equipo, jugadaJugador, true); jugadas.Remove(jugadaJugador); return m; } } // Si no se hizo un pase, bajar un nivel else { int m = min(estado, proximoEquipo(equipo), alfa, beta, profundidad - 1); if (m > valor) { valor = m; // Si se esta buscando la lista de jugadas, hacer una copia de las jugadas en su estado actual if (listaJugadas != null) { listaJugadas = new List<Jugada>(jugadas); } } if (valor >= beta) { estado.mover(equipo, jugadaJugador, true); jugadas.Remove(jugadaJugador); return valor; } else if (valor > alfa) { alfa = valor; } } // Retornar el jugador estado.mover(equipo, jugadaJugador, true); jugadas.Remove(jugadaJugador); } } } } return valor; }
private int iterarPelotaMax(Estado estado, Equipo equipo, ref List<Jugada> listaJugadas, ref List<Jugada> jugadas, ref int valor, ref int alfa, ref int beta, int profundidad, out bool terminar) { terminar = false; for (int dp = 1; dp <= 4; dp++) { // Direccion Pelota for (int px = -1; px <= 1; px++) { for (int py = -1; py <= 1; py++) { if (px == 0 && py == 0) { continue; } int dpx = estado.pelota.x + px * dp; int dpy = estado.pelota.y + py * dp; // Validar el movimiento if (!validarMovimiento(estado.pelota.x, estado.pelota.y, dpx, dpy, false)) { continue; } // Mover la pelota pases += 1; Jugada jugadaPelota = new Jugada(estado.pelota.x, estado.pelota.y, dpx, dpy); jugadas.Add(jugadaPelota); estado.mover(equipo, jugadaPelota, false); // En caso de no poder seguir jugando, bajar un nivel if (!estado.pelota.tieneInfluencia(equipo, true) || jugadas.Count >= 5) { int m = min(estado, proximoEquipo(equipo), alfa, beta, profundidad - 1); if (m > valor) { valor = m; // Si se esta buscando la lista de jugadas, hacer una copia de las jugadas en su estado actual if (listaJugadas != null) { listaJugadas = new List<Jugada>(jugadas); } } if (valor >= beta) { terminar = true; pases -= 1; estado.mover(equipo, jugadaPelota, true); jugadas.Remove(jugadaPelota); return valor; } else if (valor > alfa) { alfa = valor; } } // Sino seguir jugando else { int m = iterarPelotaMax(estado, equipo, ref listaJugadas, ref jugadas, ref valor, ref alfa, ref beta, profundidad, out terminar); } // Retornar la pelota pases -= 1; estado.mover(equipo, jugadaPelota, true); jugadas.Remove(jugadaPelota); } } } return valor; }