// 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); }
// 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); }
// zjistuje prazdne pozice nebo preskocitelne(protihracova pozice) v danem smeru sirka, vyska: private List <Pozice> ZjistiPoziceVeSmeru(Deska deska, Pozice vychoziPozice, Pozice pomocnaPozice, int sirka, int vyska, bool jenPreskok, bool bezPreskoku) { // rekurzivne si pricitam nebo odecitam o jednicku (sirku a vysku Pozice) int novaVyska = vychoziPozice.GetVyska + vyska; int novaSirka = vychoziPozice.GetSirka + sirka; if (Pozice.OdpovidaRozsahu(novaSirka) && Pozice.OdpovidaRozsahu(novaVyska)) { pomocnaPozice.SetSirka(novaSirka); pomocnaPozice.SetVyska(novaVyska); // Jestlize je vedlejsi policko prazdne if (deska.JePolePrazdne(pomocnaPozice)) { // bool hodnota - kdyz chci zjistit jen ty pozice kdy neskacu pres protihrace: if (!jenPreskok) { List <Pozice> seznamPozic = new List <Pozice>(); //rekurzivne volam tutez funkci, dokud parametry novaVyska a novaSirka odpovidaji rozsahu desky: List <Pozice> vracenePozice = ZjistiPoziceVeSmeru(deska, pomocnaPozice, pomocnaPozice.Klonuj(), sirka, vyska, false, true); seznamPozic.Add(pomocnaPozice.Klonuj()); if (vracenePozice != null) { seznamPozic.AddRange(vracenePozice); } return(seznamPozic); } return(null); } // jestlize je vedleji policko obsazene: novaSirka = vychoziPozice.GetSirka + sirka * 2; novaVyska = vychoziPozice.GetVyska + vyska * 2; if (Pozice.OdpovidaRozsahu(novaSirka) && Pozice.OdpovidaRozsahu(novaVyska)) { pomocnaPozice.SetSirka(novaSirka); pomocnaPozice.SetVyska(novaVyska); // Jestlize se jedna o preskok kamene soupere: if (deska.JePosunPreskokemKameneProtihrace(vychoziPozice, pomocnaPozice)) { List <Pozice> seznamPozic = new List <Pozice>(); seznamPozic.Add(pomocnaPozice.Klonuj()); return(seznamPozic); } return(null); } return(null); } return(null); }