コード例 #1
0
        // Generuje vsechny mozne tahy:
        private List <Tah> GenerujTahy(Deska deska, Hrac hracNaTahu)
        {
            List <Tah>    vygenerovaneTahy           = new List <Tah>();
            List <Pozice> kamenyHrace                = hracNaTahu.VratKameny();
            List <Tah>    vygenerovaneTahySPreskokem = new List <Tah>();

            foreach (Pozice odkud in kamenyHrace)
            {
                foreach (Pozice kam in VratPoziceKamJdeSkocit(deska, odkud, false))
                {
                    List <Pozice> poziceProTah = new List <Pozice>();
                    poziceProTah.Add(odkud);
                    poziceProTah.Add(kam);
                    if (deska.JePosunPreskokemKameneProtihrace(odkud, kam))
                    {
                        List <Tah> seznamVygenerovanychTahu = new List <Tah>();
                        deska.ProvedPosunKamene(odkud, kam, null);
                        GenerujTahyPreskoku(kam, deska, poziceProTah, seznamVygenerovanychTahu);
                        // tady se mi stradaji tahy, ktere jsou preskokem:
                        vygenerovaneTahySPreskokem.AddRange(seznamVygenerovanychTahu);
                        deska.VratZpetPosunKamene(kam, odkud, deska.VratPoziciMeziPosunem(kam, odkud));
                        continue;
                    }
                    vygenerovaneTahy.Add(MainWindow.VytvorTah(poziceProTah));
                }
            }

            // Zamicham vypocitane tahy bez preskoku
            Zamichej(vygenerovaneTahy);
            // A pro ucinnejsi orezavani v alfa-beta alg. pridam na zacatek seznamu nejsilnejsi tahy, zrychluje to vypocet pomerne hodne
            vygenerovaneTahy.InsertRange(0, vygenerovaneTahySPreskokem);
            return(vygenerovaneTahy);
        }
コード例 #2
0
ファイル: Deska.cs プロジェクト: salviadivinorum/BUNNYWAR
        // pomoci deskaCopy zkousim pozdeji legalnost mych tahu:
        public Deska ZkusZahratTah(Tah tah)
        {
            List <Pozice> seznamPozic = tah.GetSeznamPozic;
            Pozice        odkud       = null;
            Deska         deskaCopy   = cloneDJ();

            if (seznamPozic.Count() == 2)
            {
                Pozice kam;
                odkud = seznamPozic[0];
                if (deskaCopy.ProvedPosunKamene(odkud, kam = seznamPozic[1], tah))
                {
                    return(deskaCopy);
                }
                return(null);
            }

            foreach (Pozice kam in seznamPozic)
            {
                if (odkud != null && !deskaCopy.JePosunPreskokemKameneProtihrace(odkud, kam))
                {
                    return(null);
                }
                if (odkud != null)
                {
                    deskaCopy.ProvedPosunKamene(odkud, kam, tah);
                }
                odkud = kam;
            }
            return(deskaCopy);
        }
コード例 #3
0
        // zjistuje prazdne pozice nebo preskocitelne(protihracova pozice) v danem smeru sirka, vyska:
        private List <Pozice> ZjistiPoziceVeSmeru(Deska deska, Pozice vychoziPozice, Pozice pomocnaPozice, int sirka, int vyska, bool jenPreskok, bool bezPreskoku)
        {
            // rekurzivne si pricitam nebo odecitam o jednicku (sirku a vysku Pozice)
            int novaVyska = vychoziPozice.GetVyska + vyska;
            int novaSirka = vychoziPozice.GetSirka + sirka;

            if (Pozice.OdpovidaRozsahu(novaSirka) && Pozice.OdpovidaRozsahu(novaVyska))
            {
                pomocnaPozice.SetSirka(novaSirka);
                pomocnaPozice.SetVyska(novaVyska);

                // Jestlize je vedlejsi policko prazdne
                if (deska.JePolePrazdne(pomocnaPozice))
                {
                    // bool hodnota - kdyz chci zjistit jen ty pozice kdy neskacu pres protihrace:
                    if (!jenPreskok)
                    {
                        List <Pozice> seznamPozic = new List <Pozice>();
                        //rekurzivne volam tutez funkci, dokud parametry novaVyska a novaSirka odpovidaji rozsahu desky:
                        List <Pozice> vracenePozice = ZjistiPoziceVeSmeru(deska, pomocnaPozice, pomocnaPozice.Klonuj(), sirka, vyska, false, true);
                        seznamPozic.Add(pomocnaPozice.Klonuj());
                        if (vracenePozice != null)
                        {
                            seznamPozic.AddRange(vracenePozice);
                        }
                        return(seznamPozic);
                    }
                    return(null);
                }

                // jestlize je vedleji policko obsazene:
                novaSirka = vychoziPozice.GetSirka + sirka * 2;
                novaVyska = vychoziPozice.GetVyska + vyska * 2;

                if (Pozice.OdpovidaRozsahu(novaSirka) && Pozice.OdpovidaRozsahu(novaVyska))
                {
                    pomocnaPozice.SetSirka(novaSirka);
                    pomocnaPozice.SetVyska(novaVyska);

                    // Jestlize se jedna o preskok kamene soupere:
                    if (deska.JePosunPreskokemKameneProtihrace(vychoziPozice, pomocnaPozice))
                    {
                        List <Pozice> seznamPozic = new List <Pozice>();
                        seznamPozic.Add(pomocnaPozice.Klonuj());
                        return(seznamPozic);
                    }
                    return(null);
                }
                return(null);
            }
            return(null);
        }