public Object Clone() { Tah NovyTah = new Tah(); foreach(Pozice pozice in seznamTahu) NovyTah.seznamTahu.Add((Pozice) pozice.Clone()); return NovyTah; }
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; }
/// <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; }
private void zobrazNejTah(Tah NejTah) { MessageBox.Show(NejTah.ToString()); }
/// <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; }
/// <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> /// 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; }
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; } } }
private void FinalniTah(Tah tah) { TahPocitace(tah); Minimax.vyslednyTah = null; AktualizaceUI(); AktualizaceHistorie(); if (!KonecHry && PocetTahu < LimitTahu) { TahPocitace(); } else { AkcePoKonciHry(); } }
/// <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!"); }
/// <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; } }
/// <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]; }
/// <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]; }
/// <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); } } }
/// <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])); } } }