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; }