Пример #1
0
    public int MaxValue(EstadoJuegoDamas estado, AlfaBeta ab)
    {
        int v = int.MinValue;

        if (EsTerminal(estado))
        {
            return(ComputarUtilidad(estado));
        }
        else
        {
            List <EstadoJuegoDamas> successorList = estado.CalcularSucesores();
            foreach (EstadoJuegoDamas successor in successorList)
            {
                int minimumValueOfSuccessor = MinValue(successor, ab.Copy());
                if (minimumValueOfSuccessor > v)
                {
                    v = minimumValueOfSuccessor;
                    estado.Siguiente = successor;
                }
                //Si α >= β retorne α... esta es una parte importante de la poda
                if (v >= ab.Beta)
                {
                    //Poda desde max;
                    return(v);
                }
                ab.Alfa = Math.Max(ab.Alfa, v);
            }
            return(v);
        }
    }
Пример #2
0
    public List <EstadoJuegoDamas> CalcularSucesores()
    {
        StreamWriter sw = new StreamWriter("estados.txt", true);

        sw.WriteLine("*/*/*/*//*//**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/");
        sw.WriteLine("Hijos de:");
        sw.Write(this.ToString());
        sw.WriteLine();

        int minivel = this.Nivel;
        List <EstadoJuegoDamas> rta   = new List <EstadoJuegoDamas>();
        EstadoJuegoDamas        copia = new EstadoJuegoDamas(this);

        //if((object)jugadas_legales == null || jugadas_legales.Count == 0)
        CalcularMovimientosLegales();
        foreach (Jugada j in jugadas_legales)
        {
            EstadoJuegoDamas sucesor = new EstadoJuegoDamas();
            sucesor = XirguGame.GetInstance().Juego.Mover(copia, j);
            if (sucesor != null)
            {
                sucesor.JugadaHecha = j;
                sucesor.Nivel       = minivel + 1;
                sw.Write(sucesor.ToString());
                rta.Add(sucesor);
            }
        }



        sw.Flush();
        sw.Close();
        return(rta);
    }
Пример #3
0
 public Juego()
 {
     estado_inicial = new EstadoJuegoDamas();
     estadoActual   = new EstadoJuegoDamas();
     InicializarEstado();
     nivel = 5;
 }
Пример #4
0
    public EstadoJuegoDamas(EstadoJuegoDamas old)
    {
        if ((object)old.jugadaHecha != null)
        {
            this.jugadaHecha = new Jugada(old.jugadaHecha);
        }
        this.Jugadas_legales = new List <Jugada>();
        Jugada nuevaj;

        foreach (Jugada j in old.Jugadas_legales)
        {
            nuevaj = new Jugada(j);
            this.Jugadas_legales.Add(nuevaj);
        }

        this.JugadorAMover = new Pieza.Jugadores();
        this.JugadorAMover = old.JugadorAMover;
        this.las_celdas    = new Escaque[32];

        for (int i = 0; i < old.las_celdas.Length; i++)
        {
            this.las_celdas[i] = new Escaque(old.las_celdas[i]);
        }
        this.Nivel = old.Nivel;
        if (siguiente != null)
        {
            this.siguiente = new EstadoJuegoDamas(old.siguiente);
        }
    }
Пример #5
0
    public List <Jugada> ObtenerJugadasLegales(EstadoJuegoDamas estado)
    {
        EstadoJuegoDamas e = new EstadoJuegoDamas();

        e = estado;
        e.CalcularMovimientosLegales();
        return(e.Jugadas_legales);
    }
Пример #6
0
    public EstadoJuegoDamas Mover(EstadoJuegoDamas estado, Jugada j)
    {
        EstadoJuegoDamas estAuxiliar = new EstadoJuegoDamas(estado);
        int posfinal = 0;

        foreach (Movimiento m in j.Los_movs)
        {
            if (estAuxiliar.EsLegalCaza(m))
            {
                int pac = m.PosACazar();
                estAuxiliar.Las_celdas[pac - 1].la_pieza = null;
            }
            estAuxiliar.Las_celdas[m.Destino - 1].la_pieza = estAuxiliar.Las_celdas[m.Origen - 1].la_pieza;
            estAuxiliar.Las_celdas[m.Origen - 1].la_pieza  = null;
            posfinal = m.Destino;
        }
        estAuxiliar.JugadaHecha = j;
        //Convertir en reina

        Pieza.Jugadores color;
        if (estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner == Pieza.Jugadores.blanco &&
            FilaDe(posfinal) == 8 &&
            estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Tipo == Pieza.TiposPiezas.peon
            )
        {
            color = estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner;
            estAuxiliar.Las_celdas[posfinal - 1].la_pieza       = Pieza.HacerPieza(Pieza.TiposPiezas.Reina);
            estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner = color;
        }
        else
        {
            if (estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner == Pieza.Jugadores.negro &&
                FilaDe(posfinal) == 1 &&
                estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Tipo == Pieza.TiposPiezas.peon
                )
            {
                color = estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner;
                estAuxiliar.Las_celdas[posfinal - 1].la_pieza       = Pieza.HacerPieza(Pieza.TiposPiezas.Reina);
                estAuxiliar.Las_celdas[posfinal - 1].la_pieza.Owner = color;
            }
        }



        if (estAuxiliar.JugadorAMover == Pieza.Jugadores.blanco)
        {
            estAuxiliar.JugadorAMover = Pieza.Jugadores.negro;
        }
        else
        {
            estAuxiliar.JugadorAMover = Pieza.Jugadores.blanco;
        }

        return(estAuxiliar);
    }
Пример #7
0
    public void HacerMovAlfaBeta()
    {
        File.Delete("estados.txt");
        getAlfaBetaValue(estadoActual);
        EstadoJuegoDamas nextState = estadoActual.Siguiente;

        if (nextState == null)
        {
            throw new  Exception("Movimiento Alfa-Beta Fallido!!");
        }
        Mover(nextState.JugadaHecha);
    }
Пример #8
0
 public void InicializarEstado()
 {
     estado_inicial.Nivel         = 0;
     estado_inicial.JugadorAMover = Pieza.Jugadores.blanco;
     for (int i = 0; i < 12; i++)
     {
         estado_inicial.Las_celdas[i].la_pieza       = Pieza.HacerPieza(Pieza.TiposPiezas.peon);
         estado_inicial.Las_celdas[i].la_pieza.Owner = Pieza.Jugadores.blanco;
     }
     for (int i = 20; i < 32; i++)
     {
         estado_inicial.Las_celdas[i].la_pieza       = Pieza.HacerPieza(Pieza.TiposPiezas.peon);
         estado_inicial.Las_celdas[i].la_pieza.Owner = Pieza.Jugadores.negro;
     }
     estadoActual = estado_inicial;
 }
Пример #9
0
    public void ActualizarTablero()
    {
        EstadoJuegoDamas estado = new EstadoJuegoDamas();

        estado = XirguGame.GetInstance().Juego.EstadoActual;
        Pieza.Jugadores   o = new Pieza.Jugadores();
        Pieza.TiposPiezas t = new Pieza.TiposPiezas();
        for (int i = 0; i < 32; i++)
        {
            if (!estado.Las_celdas[i].EsVacia())
            {
                o = estado.Las_celdas[i].la_pieza.Owner;
                t = estado.Las_celdas[i].la_pieza.Tipo;
                if (o == Pieza.Jugadores.blanco && t == Pieza.TiposPiezas.peon)
                {
                    tablero[i] = 'b';
                }
                if (o == Pieza.Jugadores.negro && t == Pieza.TiposPiezas.peon)
                {
                    tablero[i] = 'n';
                }

                if (o == Pieza.Jugadores.blanco && t == Pieza.TiposPiezas.Reina)
                {
                    tablero[i] = 'B';
                }
                if (o == Pieza.Jugadores.negro && t == Pieza.TiposPiezas.Reina)
                {
                    tablero[i] = 'N';
                }
            }
            else
            {
                tablero[i] = '█';
            }
        }
    }
Пример #10
0
 public bool EsTerminal(EstadoJuegoDamas estado)
 {
     return(HaTerminado() || estado.Nivel == nivel);
 }
Пример #11
0
 public int ComputarUtilidad(EstadoJuegoDamas estado)
 {
     return(estado.CalcularUtilidad());
 }
Пример #12
0
 public int getAlfaBetaValue(EstadoJuegoDamas estado)
 {
     return(MaxValue(estado, new AlfaBeta()));
 }