Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        // 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]);
        }
Esempio n. 3
0
 // Metoda na redo
 public void ProvedPosunutiTahuVpred(Tah tah)
 {
     hra.PridejTah(tah);
     deska.ZahrajTah(tah);
     hra.AktualizujPocetTahuBezPreskoku();
 }