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); } }