/// <summary> /// Vrací všechny (i násobné) skoky jednoho obránce. /// </summary> private static Skoky VsechnySkoky(Pozice souradniceObrance, HraciDeska hraciDeska) { List<Tah> obrancovySkoky; Skoky skok = new Skoky(); skok.odkud = souradniceObrance; skok.skoky = null; obrancovySkoky = KamMuzeObranceSkocit(souradniceObrance, hraciDeska); if(obrancovySkoky.Count != 0) { skok.skoky = new List<Skoky>(); foreach(Tah tah in obrancovySkoky) { HraciDeska novaHraciDeska; novaHraciDeska = hraciDeska.Copy(); // novaHraciDeska = (HraciDeska) hraciDeska.Clone(); novaHraciDeska.Tahni(tah); novaHraciDeska.OdstranPreskoceneKameny(tah); Skoky novySkok = new Skoky(tah.seznamTahu[1], null); novySkok.deska = novaHraciDeska; skok.skoky.Add(novySkok); } HelpSkoky(skok); } return skok; }
/// <summary> /// Serializuje (linearizuje) strom skoků do seznamu (listu). /// </summary> private static List<Tah> Serializace(Skoky skok) { List<Tah> serializovaneSkoky = new List<Tah>(); while(true) { try { Tah t = SerializaceSkoku(skok); serializovaneSkoky.Add(t); } catch { break; } } return serializovaneSkoky; }
/// <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; }
/// <summary> /// Pomocná funkce pro výpočet všech skoků jednoho obránce. /// </summary> private static Skoky HelpSkoky(Skoky skok) { List<Tah> obrancovySkoky; if(skok.skoky != null) { foreach(Skoky s in skok.skoky) { obrancovySkoky = KamMuzeObranceSkocit(s.odkud, s.deska); if(obrancovySkoky.Count != 0) { s.skoky = new List<Skoky>(); foreach(Tah tah in obrancovySkoky) { HraciDeska novaHraciDeska; novaHraciDeska = s.deska.Copy(); // novaHraciDeska = (HraciDeska) s.deska.Clone(); novaHraciDeska.Tahni(tah); novaHraciDeska.OdstranPreskoceneKameny(tah); Skoky novySkok = new Skoky(tah.seznamTahu[1], null); novySkok.deska = novaHraciDeska; s.skoky.Add(novySkok); } } HelpSkoky(s); } } return skok; }