Beispiel #1
0
 public Move()
 {
     Karte           = new List <Karta>();
     PrethodnoStanje = new ContextMakao();
     NarednoStanje   = new ContextMakao();
     //NovaBoja = Boja.Unknown; //15.1
 }
Beispiel #2
0
 public ContextMakao(ContextMakao makao)
 {
     NaPotezu       = makao.NaPotezu;
     Value          = makao.Value;
     stop           = makao.Stop;
     TrenutnoStanje = new Tabla(makao.TrenutnoStanje);
 }
Beispiel #3
0
 public Move(ContextMakao prethodnoSt, ContextMakao narednoSt)
 {
     Karte           = new List <Karta>();
     PrethodnoStanje = prethodnoSt;
     NarednoStanje   = narednoSt;
     //  NovaBoja = Boja.Unknown; 15.1
     Value = 0;
 }
Beispiel #4
0
        void IterativeDeepening()
        {
            int i = 1;

            while (true)
            {
                BestMove = ContextMakao.AlfaBeta(context, i, int.MinValue, int.MaxValue);
                i++;
            }
        }
Beispiel #5
0
        public Move(Move im)
        {
            Karte = new List <Karta>();
            Tip   = im.Tip;
            foreach (Karta k in im.Karte)
            {
                Karte.Add(k);
            }
            NovaBoja = im.NovaBoja;
            //PrethodnoStanje = new ContextMakao(new ContextMakao()); //15.1
            // NarednoStanje = new ContextMakao(new ContextMakao()); //15.1

            PrethodnoStanje = new ContextMakao(im.PrethodnoStanje);
            NarednoStanje   = new ContextMakao(im.NarednoStanje);
            Value           = im.Value;
        }
Beispiel #6
0
 public void BeginBestMove()
 {
     stani = false;
     //
     Task.Run(() =>
     {
         int i = 1;
         while (true)
         {
             if (stani)
             {
                 stani = false;
                 break;
             }
             BestMove = ContextMakao.AlfaBeta(context, i, int.MinValue, int.MaxValue);
             i++;
         }
     } //
              );
 }
Beispiel #7
0
        public object Clone()
        {
            ContextMakao a = (ContextMakao)this.MemberwiseClone();

            return(a);
        }
Beispiel #8
0
        public static Move AlfaBeta(ContextMakao stanje, int dubina, int alfa, int beta)
        {
            if (stop)
            {
                return(null);
            }
            if (stanje == null)
            {
                return(null);
            }
            List <Move> potezi = stanje.GetListaMogucihPoteza();


            if (TranspozicionaTabela.Sadrzi(stanje))
            {
                HashElement tmp = TranspozicionaTabela.VratiEl(stanje);
                if (tmp.Dubina >= dubina)
                {
                    return(tmp.Nabolji);
                }
                else
                {
                    potezi.Insert(0, tmp.Nabolji);
                }
            }

            if (TranspozicionaTabela.Sadrzi(stanje) && TranspozicionaTabela.VratiEl(stanje).Dubina < dubina)
            {
                Move najbolji = TranspozicionaTabela.VratiEl(stanje).Nabolji;
            }


            if (dubina == 0 || potezi.Count == 0)
            {
                Move pom = new Move();
                pom.Value         = stanje.Evaluate();
                pom.NarednoStanje = null;
                //Careful we still don't know what move is the best

                return(pom);
            }
            else if (stanje.NaPotezu == 1) //komp
            {
                Move temp = new Move();
                temp.Value = Int32.MinValue;
                int alfa1 = Int32.MinValue;
                foreach (var sledecciPotez in potezi)
                {
                    if (TranspozicionaTabela.Sadrzi(stanje))
                    {
                        alfa1 = TranspozicionaTabela.VratiEl(stanje).Alfa;
                    }


                    Move b = AlfaBeta(sledecciPotez.NarednoStanje, dubina - 1, alfa1, beta);
                    if (b.Value > temp.Value)
                    {
                        temp       = sledecciPotez;
                        temp.Value = b.Value;
                    }
                    if (alfa1 < temp.Value)
                    {
                        alfa1 = temp.Value;
                    }
                    if (beta <= alfa1)
                    {
                        break;
                    }
                }

                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement pom = TranspozicionaTabela.VratiEl(stanje);
                    if (pom.Dubina <= dubina)
                    {
                        pom.Alfa    = alfa1;
                        pom.Dubina  = dubina;
                        pom.Nabolji = temp;
                        pom.Beta    = beta;
                        pom.Flag    = 0;
                    }
                }
                else
                {
                    HashElement pom = new HashElement
                    {
                        Alfa    = alfa1,
                        Dubina  = dubina,
                        Nabolji = temp,
                        Beta    = beta,
                        Flag    = 0
                    };
                    TranspozicionaTabela.Add(stanje, pom);
                }
                return(temp);
            }
            else
            {
                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement el = TranspozicionaTabela.VratiEl(stanje);
                    if (el.Dubina >= dubina)
                    {
                        return(el.Nabolji);
                    }
                }
                Move temp = new Move();
                temp.Value = Int32.MaxValue;
                int beta1 = Int32.MaxValue;
                foreach (var sledeciPotez in potezi)
                {
                    if (TranspozicionaTabela.Sadrzi(stanje))
                    {
                        beta1 = TranspozicionaTabela.VratiEl(stanje).Beta;
                    }

                    Move b = AlfaBeta(sledeciPotez.NarednoStanje, dubina - 1, alfa, beta1);
                    if (b.Value < temp.Value)
                    {
                        temp       = sledeciPotez;
                        temp.Value = b.Value;
                    }
                    if (beta1 > temp.Value)
                    {
                        beta1 = temp.Value;
                    }
                    if (beta1 <= alfa)
                    {
                        break;
                    }
                }

                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement tmp = TranspozicionaTabela.VratiEl(stanje);
                    if (tmp.Dubina <= dubina)
                    {
                        tmp.Alfa    = alfa;
                        tmp.Beta    = dubina;
                        tmp.Nabolji = temp;
                        tmp.Beta    = beta1;
                        tmp.Flag    = 0;
                    }
                }
                else
                {
                    HashElement pom = new HashElement
                    {
                        Nabolji = temp,
                        Alfa    = alfa,
                        Beta    = beta1,
                        Flag    = 0,
                        Dubina  = dubina
                    };
                    TranspozicionaTabela.Add(stanje, pom);
                }
                return(temp);
            }
        }
Beispiel #9
0
 public Igra(ContextMakao km)
 {
     context  = new ContextMakao(km);
     stani    = false;
     BestMove = new Move();
 }
Beispiel #10
0
 public Igra(ContextMakao km, int i)
 {
     context  = km;
     stani    = false;
     BestMove = new Move();
 }
Beispiel #11
0
 public Igra()
 {
     this.context = new ContextMakao();
     stani        = false;
 }
Beispiel #12
0
 public void Reset()
 {
     this.context = new ContextMakao();
     stani        = false;
 }