/// <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> /// 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; }