예제 #1
0
    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;
    }
예제 #2
0
    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;
    }