// pomoci deskaCopy zkousim pozdeji legalnost mych tahu: public Deska ZkusZahratTah(Tah tah) { List <Pozice> seznamPozic = tah.GetSeznamPozic; Pozice odkud = null; Deska deskaCopy = cloneDJ(); if (seznamPozic.Count() == 2) { Pozice kam; odkud = seznamPozic[0]; if (deskaCopy.ProvedPosunKamene(odkud, kam = seznamPozic[1], tah)) { return(deskaCopy); } return(null); } foreach (Pozice kam in seznamPozic) { if (odkud != null && !deskaCopy.JePosunPreskokemKameneProtihrace(odkud, kam)) { return(null); } if (odkud != null) { deskaCopy.ProvedPosunKamene(odkud, kam, tah); } odkud = kam; } return(deskaCopy); }
// Generuje vsechny mozne tahy: private List <Tah> GenerujTahy(Deska deska, Hrac hracNaTahu) { List <Tah> vygenerovaneTahy = new List <Tah>(); List <Pozice> kamenyHrace = hracNaTahu.VratKameny(); List <Tah> vygenerovaneTahySPreskokem = new List <Tah>(); foreach (Pozice odkud in kamenyHrace) { foreach (Pozice kam in VratPoziceKamJdeSkocit(deska, odkud, false)) { List <Pozice> poziceProTah = new List <Pozice>(); poziceProTah.Add(odkud); poziceProTah.Add(kam); if (deska.JePosunPreskokemKameneProtihrace(odkud, kam)) { List <Tah> seznamVygenerovanychTahu = new List <Tah>(); deska.ProvedPosunKamene(odkud, kam, null); GenerujTahyPreskoku(kam, deska, poziceProTah, seznamVygenerovanychTahu); // tady se mi stradaji tahy, ktere jsou preskokem: vygenerovaneTahySPreskokem.AddRange(seznamVygenerovanychTahu); deska.VratZpetPosunKamene(kam, odkud, deska.VratPoziciMeziPosunem(kam, odkud)); continue; } vygenerovaneTahy.Add(MainWindow.VytvorTah(poziceProTah)); } } // Zamicham vypocitane tahy bez preskoku Zamichej(vygenerovaneTahy); // A pro ucinnejsi orezavani v alfa-beta alg. pridam na zacatek seznamu nejsilnejsi tahy, zrychluje to vypocet pomerne hodne vygenerovaneTahy.InsertRange(0, vygenerovaneTahySPreskokem); return(vygenerovaneTahy); }
// Generuje tahy - Pouze Preskoku: public void GenerujTahyPreskoku(Pozice odkud, Deska deska, List <Pozice> seznamPozicPreskoku, List <Tah> seznamVygenerovanychTahu) { List <Pozice> seznamPreskoku = new List <Pozice>(seznamPozicPreskoku); List <Pozice> poziceProPreskok = VratPoziceKamJdeSkocit(deska, odkud, true); // negace true je false - budu zjistovat preskoky if (poziceProPreskok.Count() == 0) { seznamVygenerovanychTahu.Add(MainWindow.VytvorTah(new List <Pozice>(seznamPreskoku))); return; } foreach (Pozice kam in poziceProPreskok) { seznamPreskoku.Add(kam); deska.ProvedPosunKamene(odkud, kam, null); GenerujTahyPreskoku(kam, deska, seznamPreskoku, seznamVygenerovanychTahu); int index = seznamPreskoku.Count() - 1; seznamPreskoku.RemoveAt(index); deska.VratZpetPosunKamene(kam, odkud, deska.VratPoziciMeziPosunem(kam, odkud)); } }