// algoritmus alfa-beta private int Alfabeta(Deska deska, int hloubka, Hrac hracKteryHral, int alfa, int beta) { List <Tah> tahy = new List <Tah>(); Hrac hracNaTahu = dispecerHry.VratProtihrace(hracKteryHral); // zakladni podminky: if (dispecerHry.GetHra.HracProhral(hracNaTahu)) { return(-MAX); } if (dispecerHry.GetHra.HracVyhral(hracNaTahu)) { return(MAX); } if (dispecerHry.GetHra.JeRemiza()) { return(0); } if (hloubka == 0) { return(OhodnotPozici(deska, hracNaTahu)); } tahy = GenerujTahy(deska, hracNaTahu); for (int i = 0; i < tahy.Count(); ++i) { deska.ZahrajTah(tahy[i]); int cena = -Alfabeta(deska, hloubka - 1, hracNaTahu, Dal(-beta), Dal(-alfa)); cena = Bliz(cena); deska.vratTahZpet(tahy[i]); if (cena > alfa) { alfa = cena; if (cena >= beta) { return(beta); } } } return(alfa); }
// Zjisteni nejlepsiho tahu - sem vznasim dotaz z CodeBehind hlavniho okna public Tah GenerujNejlepsiTah(Deska deska, int hloubka, Hrac hracNaTahu) { // musim si nastavit instanci bw2 na instanci bw hlavniho okna, jen kvuli progress baru if (!MainWindow.GetDispecerHry().GetHracNaTahu.GetJePocitacovyHrac) { bw2 = MainWindow.bwNapoveda; } else { bw2 = MainWindow.bw; } List <Tah> tahy = new List <Tah>(); int indexNejlepsiho = 0; tahy = GenerujTahy(deska, hracNaTahu); int alfa = -MAX; jednoProcento = tahy.Count() / 100.0; // pro komunikaci s hlavnim oknem - mujProgressBar for (int i = 0; i < tahy.Count(); ++i) { pocetProcentTahu = i / jednoProcento; // doplneno k pocitani procent if (MainWindow.GetDispecerHry().GetZpomaleni) { switch (hloubka) // zpomaleni vypoctu tahu { case 1: System.Threading.Thread.Sleep(30); break; case 2: System.Threading.Thread.Sleep(27); break; case 3: System.Threading.Thread.Sleep(18); break; case 4: System.Threading.Thread.Sleep(18); break; default: break; } } // Tady vystupuju z cyklu, kdyz jsem stisknul Stop tlacitko: if (MainWindow.GetZrusVypocet) { MainWindow.bw.CancelAsync(); MainWindow.bwNapoveda.CancelAsync(); break; } bw2.ReportProgress((int)pocetProcentTahu); // komunikace s ovladacim prvkem mujProgressBar deska.ZahrajTah(tahy[i]); int cena = -Alfabeta(deska, hloubka - 1, hracNaTahu, -MAX, Dal(-alfa)); cena = Bliz(cena); deska.vratTahZpet(tahy[i]); if (cena > alfa) { alfa = cena; indexNejlepsiho = i; } } return(tahy[indexNejlepsiho]); }
// Metoda na redo public void ProvedPosunutiTahuVpred(Tah tah) { hra.PridejTah(tah); deska.ZahrajTah(tah); hra.AktualizujPocetTahuBezPreskoku(); }