コード例 #1
0
ファイル: Minimax.cs プロジェクト: havrlant/ObranaPevnosti
        /// <summary>
        /// Vygeneruje všechny možné situace hry do zadané hloubky a následně do
        /// slotu "vyslednyTah" uloží nejlepší pozici.
        /// </summary>
        private static int GenerujVsechnyTahy(HraciDeska hraciDeska, Manazer.StavPole hrac, 
            int hloubka, bool prvniFunkce)
        {
            if(hloubka == 0)
                return Ohodnoceni.Ohodnot(hraciDeska);

            List<List<Tah>> validniTahy = Rozhodci.VratVsechnyPlatneTahy(hrac, hraciDeska);
            List<int> ohodnoceni = new List<int>();
            Manazer.StavPole dalsiHrac;

            if(hrac == Manazer.StavPole.obrana)
                dalsiHrac = Manazer.StavPole.utok;
            else
                dalsiHrac = Manazer.StavPole.obrana;

            for(int i = 0; i < validniTahy.Count; i++)
            {
                for(int j = 0; j < validniTahy[i].Count; j++)
                {
                    HraciDeska novaDeska = hraciDeska.Copy();
                    // HraciDeska novaDeska = (HraciDeska) hraciDeska.Clone();
                    novaDeska.Tahni(validniTahy[i][j]);
                    novaDeska.OdstranPreskoceneKameny(validniTahy[i][j]);
                    ohodnoceni.Add(GenerujVsechnyTahy(novaDeska, dalsiHrac, hloubka - 1, false));
                }
            }

            int pomoc;

            if(hrac == Manazer.StavPole.utok)
            {
                pomoc = Int32.MinValue;
            }
            else
            {
                pomoc = Int32.MaxValue;
            }

            foreach(int cislo in ohodnoceni)
            {
                if(hrac == Manazer.StavPole.utok)
                {
                    if(cislo > pomoc)
                        pomoc = cislo;
                }
                else
                {
                    if(cislo < pomoc)
                        pomoc = cislo;
                }
            }

            if(prvniFunkce)
            {
                int index = ohodnoceni.IndexOf(pomoc);
                int i, j, citac;

                citac = 0;

                for(i = 0; i < validniTahy.Count; i++)
                {
                    for(j = 0; j < validniTahy[i].Count; j++)
                    {
                        if(citac++ == index)
                            vyslednyTah = validniTahy[i][j];
                    }
                }

                return 0;
            }

            return pomoc;
        }
コード例 #2
0
ファイル: Rozhodci.cs プロジェクト: havrlant/ObranaPevnosti
        /// <summary>
        /// Vrací všechny (i násobné) skoky jednoho obránce.
        /// </summary>
        private static Skoky VsechnySkoky(Pozice souradniceObrance, HraciDeska hraciDeska)
        {
            List<Tah> obrancovySkoky;

            Skoky skok = new Skoky();
            skok.odkud = souradniceObrance;
            skok.skoky = null;

            obrancovySkoky = KamMuzeObranceSkocit(souradniceObrance, hraciDeska);

            if(obrancovySkoky.Count != 0)
            {
                skok.skoky = new List<Skoky>();

                foreach(Tah tah in obrancovySkoky)
                {
                    HraciDeska novaHraciDeska;
                    novaHraciDeska = hraciDeska.Copy();
                    // novaHraciDeska = (HraciDeska) hraciDeska.Clone();
                    novaHraciDeska.Tahni(tah);
                    novaHraciDeska.OdstranPreskoceneKameny(tah);

                    Skoky novySkok = new Skoky(tah.seznamTahu[1], null);
                    novySkok.deska = novaHraciDeska;
                    skok.skoky.Add(novySkok);
                }

                HelpSkoky(skok);
            }

            return skok;
        }