Ejemplo n.º 1
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);
            }
        }