Example #1
0
        /// <summary>
        /// Vrací všechny platné tahy pro zadanou pozici a pro zadaného hráče.
        /// </summary>
        public static List<Tah> VratPlatneTahy(Pozice pole, Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            if(hraciDeska.Hrac(pole) == hrac)
                return VratPlatneTahy(pole.Radek, pole.Sloupec, hrac, hraciDeska);

            return new List<Tah>();
        }
Example #2
0
 /*public static Tah VratNejlepsiTah(HraciDeska hraciDeska, Manazer.StavPole hrac, int hloubka)
 {
     GenerujVsechnyTahy(hraciDeska, hrac, hloubka, true);
     return vyslednyTah;
 }*/
 public static void NejlepsiTah(HraciDeska hraciDeska, Manazer.StavPole hrac, int hloubka)
 {
     vlakno = new Thread(() => { GenerujVsechnyTahy(hraciDeska, hrac, hloubka, true);
     AkcePoNalezeniTahu(vyslednyTah);
     });
     vlakno.Start();
 }
Example #3
0
        public Form1()
        {
            Status = new StatusBar();
            Status.Parent = this;
            Status.Text = "Obrana pevnosti";

            InitializeComponent();
            ManazerHry = new Manazer();
            SeznamPolozekObtiznosti = new ToolStripMenuItem[] {
                this.snadnáToolStripMenuItem,
                this.normálníToolStripMenuItem,
                this.těžkáToolStripMenuItem };

            SeznamPolozekMoznosti = new ToolStripMenuItem[] {
                this.zpětToolStripMenuItem,
                this.vpředToolStripMenuItem,
                this.prohoďHráčeToolStripMenuItem,
                this.nejlepšíTahToolStripMenuItem,
                this.přehrátToolStripMenuItem
            };

            Utocnik = Image.FromFile("savle_maly.png");
            Obrance = Image.FromFile("stit_maly.png");

            Manazer.AktualizaceUI = AktualizujGUI;
            Manazer.AkcePoKonciHry = OznameniKonceHry;
            Manazer.AktualizaceHistorie = AktualizujPanelHistorie;
        }
Example #4
0
 /// <summary>
 /// Zjistíme, jestli je daný tah validní.
 /// </summary>
 public static bool ValidniTah(int radekKam, int sloupecKam, int radekOdkud, int sloupecOdkud,
     Manazer.StavPole hrac, HraciDeska hraciDeska)
 {
     return DoBoku(radekKam, sloupecKam, radekOdkud, sloupecOdkud) ||
         Dopredu(radekKam, sloupecKam, radekOdkud, sloupecOdkud, hrac) ||
         Diagonalne(radekKam, sloupecKam, radekOdkud, sloupecOdkud, hrac) ||
         Skok(radekKam, sloupecKam, radekOdkud, sloupecOdkud, hrac, hraciDeska);
 }
Example #5
0
 /// <summary>
 /// Uloží hru do binárního souboru.
 /// </summary>
 /// <param name="CilovySoubor">Soubor, do kterého bude hra ulžoena.</param>
 public static void UlozHru(string CilovySoubor, Manazer ManazerHry)
 {
     Schranka CelaHra = new Schranka(ManazerHry, Manazer.Deska);
     BinaryFormatter binFirmat = new BinaryFormatter();
     Stream fStrem = new FileStream(CilovySoubor, FileMode.Create,
         FileAccess.Write, FileShare.None);
     binFirmat.Serialize(fStrem, CelaHra);
     fStrem.Close();
 }
Example #6
0
        public AI(string jmeno, Manazer.StavPole barvaHrace, int Obtiznost)
            : base(jmeno)
        {
            // inicializace prvků
            this.BarvaHrace = barvaHrace;

            // nastavení umělého hráče
            this.UmelaInteligence = true;
            this.obtiznost = Obtiznost;
        }
Example #7
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;
        }
Example #8
0
        /// <summary>
        /// Zablokovali jsme na hrací desce daného hráče?
        /// </summary>
        private static bool ZablokovanyHrac(Manazer.StavPole barvaHrace, HraciDeska hraciDeska)
        {
            List<Pozice> hraci;

            hraci = hraciDeska.VratPoziceHrace(barvaHrace);

            foreach(Pozice pole in hraci)
                if((VratPlatneTahy(pole, barvaHrace, hraciDeska)).Count > 0)
                    return false;

            return true;
        }
Example #9
0
        private void nahrátHruToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog Nacti = new OpenFileDialog();
            Nacti.ShowDialog();

            try
            {
                if (Nacti.FileName != String.Empty)
                {
                    NastavPocatecniInformace();
                    Schranka CelaHra = Partie.NahrajHru(Nacti.FileName);
                    ManazerHry = CelaHra.ManazerHry;
                    Manazer.Deska = CelaHra.AktualniHraciDeska;
                    AktualizujGUI();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Neplatný vstupní soubor.", "Chyba při nahrávání");
            }
        }
Example #10
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;
        }
Example #11
0
 /// <summary>
 /// Bez kontroly nastaví kámen na desku.
 /// </summary>
 /// <param name="radek">Souřadnice řádku</param>
 /// <param name="sloupec">Souřadnice sloupce</param>
 /// <param name="hrac">Barva hráče, který táhne</param>
 private void NastavKamen(int radek, int sloupec, Manazer.StavPole hrac)
 {
     if(NaDesce(radek, sloupec) && !Rohova(radek, sloupec))
     {
         deska[radek, sloupec] = hrac;
     }
     else
     {
         throw new Exception("Nejsme na hrací desce");
     }
 }
Example #12
0
 public Schranka(Manazer ManazerHry, HraciDeska AktualniHraciDeska)
 {
     this.AktualniHraciDeska = AktualniHraciDeska;
     this.ManazerHry = ManazerHry;
 }
Example #13
0
        /// <summary>
        /// Vrací všechny platné tahy daného hráče v tomto kole
        /// </summary>
        public static List<List<Tah>> VratVsechnyPlatneTahy(Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            List<List<Tah>> vsechnyPlatneTahy = new List<List<Tah>>();

            for(int i = 0; i < hraciDeska.rozmer; i++)
                for(int j = 0; j < hraciDeska.rozmer; j++)
                {
                    // Zjistíme všechny platné tahy z dané pozice...
                    List<Tah> tahy = VratPlatneTahy(i, j, hrac, hraciDeska);

                    // ...a pokud z této pozice můžeme alespoň někam táhnout, uložíme si tah
                    if(tahy.Count > 0)
                        vsechnyPlatneTahy.Add(tahy);
                }

            // Pokud obránce může skákat, zahodíme obyčejné tahy a zjistíme,
            // jestli nemůže obránce skákat ještě dál (vícenásobný skok).
            if(MuzeObranceSkakat(vsechnyPlatneTahy))
            {
                List<Pozice> poziceObrancu = hraciDeska.VratPoziceObrancu();

                vsechnyPlatneTahy = OdstranObycejneTahy(vsechnyPlatneTahy);

                // Skoky prvního obránce
                Skoky skoky = VsechnySkoky(poziceObrancu[0], hraciDeska);

                // Skoky druhého obránce
                Skoky skoky2 = VsechnySkoky(poziceObrancu[1], hraciDeska);

                vsechnyPlatneTahy.Clear();

                // serializujeme skoky do listů
                List<Tah> platneTahy1 = Serializace(skoky);
                List<Tah> platneTahy2 = Serializace(skoky2);

                // Pokud může obránce alespoň jednou skočit, uložíme si skok
                if(platneTahy1.Count != 0)
                    vsechnyPlatneTahy.Add(platneTahy1);

                if(platneTahy2.Count != 0)
                    vsechnyPlatneTahy.Add(platneTahy2);
            }

            return vsechnyPlatneTahy;
        }
Example #14
0
 /// <summary>
 /// Bez kontroly nastaví kámen na desku.
 /// </summary>
 /// <param name="pole">Souřadnice, kam chceme kámen položit</param>
 /// <param name="hrac">Barva hráče, který táhne</param>
 private void NastavKamen(Pozice pole, Manazer.StavPole hrac)
 {
     NastavKamen(pole.Radek, pole.Sloupec, hrac);
 }
Example #15
0
        /// <summary>
        /// Vrací všechny pozice daného hráče na hrací desce.
        /// </summary>
        /// <param name="barvaHrace"></param>
        /// <returns></returns>
        public List<Pozice> VratPoziceHrace(Manazer.StavPole barvaHrace)
        {
            List<Pozice> hraci = new List<Pozice>();

            for(int i = 0; i < rozmer; i++)
                for(int j = 0; j < rozmer; j++)
                    if(deska[i, j] == barvaHrace)
                        hraci.Add(new Pozice(i, j));

            return hraci;
        }
Example #16
0
        /// <summary>
        /// Jde kámen diagonálně?
        /// </summary>
        private static bool Diagonalne(int radekKam, int sloupecKam, int radekOdkud, int sloupecOdkud, Manazer.StavPole hrac)
        {
            if(hrac == Manazer.StavPole.obrana)
            {
                if((ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 1, 2, 2, 1)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 2, 1, 1, 2)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 1, 4, 2, 5)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 2, 5, 1, 4)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 5, 4, 4, 5)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 4, 5, 5, 4)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 5, 2, 4, 1)) ||
                    (ZakazanyPohyb(radekKam, sloupecKam, radekOdkud, sloupecOdkud, 4, 1, 5, 2)))
                    return false;

                int rozdilRadku = Math.Abs(radekKam - radekOdkud);
                int rozdilSloupcu = Math.Abs(sloupecKam - sloupecOdkud);

                return rozdilRadku == rozdilSloupcu && rozdilSloupcu == 1;
            }

            return false;
        }
Example #17
0
        /// <summary>
        /// Skáče obránce horizontálně nebo vertikálně nebo diagonálně?
        /// </summary>
        private static bool Skok(int radekKam, int sloupecKam, int radekOdkud, int sloupecOdkud,
            Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            if(hrac == Manazer.StavPole.obrana)
            {
                Manazer.StavPole hracNaPozici;
                int rozdilRadku = Math.Abs(radekKam - radekOdkud);
                int rozdilSloupcu = Math.Abs(sloupecKam - sloupecOdkud);

                // Obecný skok
                if((sloupecKam == sloupecOdkud && rozdilRadku == 2) ||
                    (radekKam == radekOdkud && rozdilSloupcu == 2) ||
                    (rozdilRadku == rozdilSloupcu && rozdilSloupcu == 2))
                {
                    int preskokRadek = (radekOdkud + radekKam) / 2;
                    int preskokSloupec = (sloupecKam + sloupecOdkud) / 2;

                    // Skáče obránce přes roh hrací desky?
                    if((rozdilRadku == rozdilSloupcu && rozdilSloupcu == 2) &&
                        (((preskokRadek == 2) && (preskokSloupec == 1 || preskokSloupec == 5)) ||
                        ((preskokRadek == 4) && (preskokSloupec == 1 || preskokSloupec == 5)) ||
                        ((preskokRadek == 1) && (preskokSloupec == 2 || preskokSloupec == 4)) ||
                        ((preskokRadek == 5) && (preskokSloupec == 2 || preskokSloupec == 4))))
                        return false;

                    hracNaPozici = hraciDeska.Hrac(preskokRadek, preskokSloupec);

                    if(hracNaPozici == Manazer.StavPole.utok)
                    {
                        return true;
                    }
                }
            }

            return false;
        }
Example #18
0
        /// <summary>
        /// Jde kámen dopředu/dozadu?
        /// </summary>
        private static bool Dopredu(int radekKam, int sloupecKam, int radekOdkud, int sloupecOdkud, Manazer.StavPole hrac)
        {
            int rozdil = radekKam - radekOdkud;

            if (hrac == Manazer.StavPole.obrana)
                rozdil = Math.Abs(rozdil);
            else
                rozdil *= -1;

            return (sloupecKam == sloupecOdkud) && (rozdil == 1);
        }