Beispiel #1
0
        public Object Clone()
        {
            Tah NovyTah = new Tah();

            foreach(Pozice pozice in seznamTahu)
                NovyTah.seznamTahu.Add((Pozice) pozice.Clone());

            return NovyTah;
        }
Beispiel #2
0
        public bool stejne(Tah tah)
        {
            if(tah.seznamTahu.Count != seznamTahu.Count)
                return false;

            for(int i = 0; i < seznamTahu.Count; i++)
                if(!(seznamTahu[i].Equals(tah.seznamTahu[i])))
                    return false;

            return true;
        }
Beispiel #3
0
        /// <summary>
        /// Vrací všechny platné tahy pro zadanou pozici a pro zadaného hráče.
        /// </summary>
        public static List<Tah> VratPlatneTahy(int radekOdkud, int sloupecOdkud, 
            Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            List<Tah> platneTahy = new List<Tah>();

            if(hraciDeska.Hrac(radekOdkud, sloupecOdkud) == hrac)
            {
                for(int i = 0; i < hraciDeska.rozmer; i++)
                {
                    for(int j = 0; j < hraciDeska.rozmer; j++)
                    {
                        if(ValidniTah(i, j, radekOdkud, sloupecOdkud, hrac, hraciDeska) &&
                            hraciDeska.MuzemeTahnout(i, j))
                        {
                            Tah tah = new Tah(new Pozice(radekOdkud, sloupecOdkud), new Pozice(i, j));

                            platneTahy.Add(tah);
                        }
                    }
                }
            }

            return platneTahy;
        }
Beispiel #4
0
 private void zobrazNejTah(Tah NejTah)
 {
     MessageBox.Show(NejTah.ToString());
 }
Beispiel #5
0
        /// <summary>
        /// Provede tah
        /// </summary>
        private void ProvedTah()
        {
            Tah AktualniTah = new Tah(NactenePozice);
            ManazerHry.VratHraceNaTahu().AktualniTah = AktualniTah;

            try
            {
                ManazerHry.Tahni();
                Status.Text = NazevHry;
            }
            catch(NeplatnyTah NT)
            {
                Status.Text = NT.Message;
                NactenePozice.Clear();
            }
            catch(ObranceMusiSkakat OMS)
            {
                Status.Text = OMS.Message;
                MessageBox.Show(OMS.Message);
            }

            ZobrazHraceNaRade();
            NactenePozice.Clear();

            PresunKamene = false;
            AktivniPozice = null;
        }
Beispiel #6
0
        /// <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;
        }
Beispiel #7
0
        /// <summary>
        /// Serializuje (linearizuje) jednu větev stromu do seznamu (listu).
        /// </summary>
        private static Tah SerializaceSkoku(Skoky skok)
        {
            Tah tah = new Tah();
            Skoky pomoc = null;
            List<Skoky> uloziste = new List<Skoky>();

            if(skok.skoky == null || skok.skoky.Count == 0)
                throw new Exception("Konec cyklu");

            while(true)
            {
                pomoc = skok;
                //tah.kam = skok.odkud;
                tah.seznamTahu.Add(skok.odkud);
                uloziste.Add(skok);

                if(skok.skoky != null && skok.skoky.Count > 0)
                    skok = skok.skoky[0];
                else
                    break;
            }

            if(uloziste.Count > 1)
            {
                int index = uloziste.Count - 2;

                if(uloziste[index].skoky.Count == 0)
                    uloziste[index].skoky = null;
                else
                    uloziste[index].skoky.Remove(uloziste[index].skoky[0]);
            }

            /*if(pomoc.skoky != null)
                pomoc.skoky.Remove(pomoc.skoky[0]);
            else if(pomoc.skoky.Count == 0)
                pomoc.skoky = null;*/

            return tah;
        }
Beispiel #8
0
        private void TahPocitace(Tah tah)
        {
            Deska.Tahni(tah);
            Deska.OdstranPreskoceneKameny(tah);

            // Uložíme si aktuální tah do záznamu celé hry
            TahyZpet.Push((Tah) tah.Clone());

            // Vynulujeme zásobník s redo tahy
            TahyVpred.Clear();

            PrehodHraceNaTahu();

            if(PocetTahu >= LimitTahu)
            {
                KonecHry = true;
                Vitez = MoznostiVyher.remiza;
            }
            else
            {
                Vitez = Rozhodci.KdoVyhral(Deska);
                if(Vitez != MoznostiVyher.nikdo)
                {
                    KonecHry = true;
                }
            }
        }
Beispiel #9
0
        private void FinalniTah(Tah tah)
        {
            TahPocitace(tah);
            Minimax.vyslednyTah = null;

            AktualizaceUI();
            AktualizaceHistorie();

            if (!KonecHry && PocetTahu < LimitTahu)
            {
                TahPocitace();
            }
            else
            {
                AkcePoKonciHry();
            }
        }
Beispiel #10
0
        /// <summary>
        /// Funkce si od rozhodčího vyžádá všechny platné tahy z dané pozici 
        /// a pokud se jeden z nich shoduje s předaných tahem, provede tah na desku.
        /// </summary>
        /// <param name="hracuvTah">Objekt Tah, který obsahuje odkud a kam táhnout.</param>
        public void Tahni(Tah hracuvTah)
        {
            List<List<Tah>> platneTahy;

            platneTahy = Rozhodci.VratVsechnyPlatneTahy(hracNaTahu, Deska);

            foreach(List<Tah> tahy in platneTahy)
            {
                foreach(Tah tah in tahy)
                {
                    if(tah.stejne(hracuvTah))
                    {
                        Deska.Tahni(hracuvTah);
                        Deska.OdstranPreskoceneKameny(hracuvTah);

                        // Uložíme si aktuální tah do záznamu celé hry
                        TahyZpet.Push((Tah)hracuvTah.Clone());

                        // Vynulujeme zásobník s redo tahy
                        TahyVpred.Clear();

                        // Přehodíme hráče na tahu
                        PrehodHraceNaTahu();

                        // Zjistíme jestli někdo nevyhrál
                        ZjistiViteze();

                        try
                        {
                            AktualizaceUI();
                            AktualizaceHistorie();
                        }
                        catch(Exception)
                        { }

                        if (VitezNeboLimit())
                            AkcePoKonciHry();

                        return;
                    }
                }
            }

            if(platneTahy[0][0].SkakaloSe())
                throw new ObranceMusiSkakat("Obránce musí skákat");

            throw new NeplatnyTah("Neplatný tah!");
        }
Beispiel #11
0
        /// <summary>
        /// Nastaví obránce na hrací desku.
        /// </summary>
        /// <param name="s1">První obránce</param>
        /// <param name="s2">Druhý obránce</param>
        /*public void NastavObrance(string s1, string s2)
        {
            NastavObrance(Prikazy.StringNaSouradnice(s1));
            NastavObrance(Prikazy.StringNaSouradnice(s2));
        }*/
        /// <summary>
        /// Nastaví obránce po jednom.
        /// </summary>
        /// <param name="Souradnice">Stringové souřadnice</param>
        public void NastavObrance(Pozice Souradnice)
        {
            if(!NastaveniObranci)
            {
                Deska.NastavObrance(Souradnice);
                Tah tah = new Tah(Souradnice);
                TahyZpet.Push(tah);
            }

            if (Deska.PocetObrancu == 2)
            {
                NastaveniObranci = true;
                hracNaTahu = Manazer.StavPole.utok;
            }
        }
Beispiel #12
0
        /// <summary>
        /// Provede tah naopak, tj. vrátí uvedený tah zpátky
        /// </summary>
        public void VratZpatkyTah(Tah hracuvTah)
        {
            if(hracuvTah.PocetTahu() == 1)
            {
                PocetObrancu--;
                NastavKamen(hracuvTah.seznamTahu[0], Manazer.StavPole.volne);
                return;
            }

            int i;

            hracuvTah.seznamTahu.Reverse();

            for(i = 1; i < hracuvTah.PocetTahu(); i++)
            {
                Tahni(hracuvTah.seznamTahu[i - 1], hracuvTah.seznamTahu[i]);
            }

            aktualniTah = hracuvTah.seznamTahu[i - 1];
        }
Beispiel #13
0
        /// <summary>
        /// Provede tah na desce.
        /// </summary>
        /// <param name="hracuvTah">Instance třídy Tah</param>
        public void Tahni(Tah hracuvTah)
        {
            int i;

            for(i = 1; i < hracuvTah.PocetTahu(); i++)
            {
                Tahni(hracuvTah.seznamTahu[i - 1], hracuvTah.seznamTahu[i]);
            }

            aktualniTah = hracuvTah.seznamTahu[i - 1];
        }
Beispiel #14
0
 /// <summary>
 /// Vrátí zpět kameny, které byly původně přeskočené
 /// </summary>
 /// <param name="tah"></param>
 public void PridejPreskoceneKameny(Tah tah)
 {
     for(int i = 1; i < tah.PocetTahu(); i++)
     {
         if((Math.Abs(tah.seznamTahu[i - 1].Radek - tah.seznamTahu[i].Radek) == 2) ||
             (Math.Abs(tah.seznamTahu[i - 1].Sloupec - tah.seznamTahu[i].Sloupec) == 2))
         {
             NastavKamen(Pozice.Stred(tah.seznamTahu[i - 1], tah.seznamTahu[i]),
                 Manazer.StavPole.utok);
         }
     }
 }
Beispiel #15
0
 /// <summary>
 /// Odstraní přeskočené kameny.
 /// </summary>
 /// <param name="tah">Validní tah.</param>
 public void OdstranPreskoceneKameny(Tah tah)
 {
     for(int i = 1; i < tah.PocetTahu(); i++)
     {
         if((Math.Abs(tah.seznamTahu[i - 1].Radek - tah.seznamTahu[i].Radek) == 2) ||
             (Math.Abs(tah.seznamTahu[i - 1].Sloupec - tah.seznamTahu[i].Sloupec) == 2))
         {
             OdeberKamen(Pozice.Stred(tah.seznamTahu[i - 1], tah.seznamTahu[i]));
         }
     }
 }