private int min(Estado estado, Equipo equipo, int alfa, int beta, int profundidad)
 {
     return estado.valorar();
 }
    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;
    }