/// <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>(); }
/*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(); }
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; }
/// <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); }
/// <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(); }
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; }
/// <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; }
/// <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; }
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í"); } }
/// <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; }
/// <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"); } }
public Schranka(Manazer ManazerHry, HraciDeska AktualniHraciDeska) { this.AktualniHraciDeska = AktualniHraciDeska; this.ManazerHry = ManazerHry; }
/// <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; }
/// <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); }
/// <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; }
/// <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; }
/// <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; }
/// <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); }