// 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); }
// Za zadanych [sirka,vyska] intů si vytvorim Pozici - objekt se sloty x,y: public Pozice VytvorPozici(int sirka, int vyska) { Pozice pozice = new Pozice(); pozice.SetVyska(vyska); pozice.SetSirka(sirka); return(pozice); }
// Pomocna metoda Klonuj() - vyrabim si novou identickou instanci objektu Pozice public Pozice Klonuj() { Pozice poz = new Pozice(); poz.SetVyska(vyska); poz.SetSirka(sirka); return(poz); }
// Zjisti seznam pozic kam vsude jde z vychozi pozice skocit. // Prakticky se jedna o zjisteni skoku do 8-mi smeru (existuje 8 okolnich policek, lisicich se x,y o jednicku) // bud jsou obsazene, nebo volne a mozna i jde skakat dal nez o jedno .... viz seznamPozic public List <Pozice> VratPoziceKamJdeSkocit(Deska deska, Pozice vychoziPozice, bool jenPreskok) { List <Pozice> seznamPozic = new List <Pozice>(); Pozice pomocnaPozice = new Pozice(); List <Pozice> generovanePozice = new List <Pozice>(); int sirka; int vyska; pomocnaPozice.SetSirka(vychoziPozice.GetSirka); pomocnaPozice.SetVyska(vychoziPozice.GetVyska); for (int i = 0; i < 8; ++i) { switch (i) { case 0: vyska = 1; sirka = 0; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 1: vyska = 1; sirka = 1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 2: vyska = 0; sirka = 1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 3: vyska = -1; sirka = 1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 4: vyska = -1; sirka = 0; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 5: vyska = -1; sirka = -1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 6: vyska = 0; sirka = -1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { continue; } seznamPozic.AddRange(generovanePozice); continue; case 7: vyska = 1; sirka = -1; generovanePozice = ZjistiPoziceVeSmeru(deska, vychoziPozice, pomocnaPozice, sirka, vyska, jenPreskok, false); if (generovanePozice == null) { break; } seznamPozic.AddRange(generovanePozice); break; } } return(seznamPozic); }