// 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);
        }
Exemple #2
0
        // 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);
        }
Exemple #3
0
        // 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);
        }