Beispiel #1
0
        /// <summary>
        /// Ohodonotí danou pozici na hrací desce z pohledu útočníka.
        /// Tedy čím více bodů, tím lépe pro útočníka (a naopak pro obránce).
        /// </summary>
        /// <returns>Ohodnocení pozice vyjádřené v celých bodech (int).</returns>
        public static int Ohodnot(HraciDeska hraciDeska)
        {
            int stupen;
            Random rand = new Random();

            // Za každého živého útočníku +100 bodů
            stupen = hraciDeska.PocetUtocniku() * 100;

            int PocetUtocnikuVPevnosti = 0;

            for(int i = 0; i < hraciDeska.rozmer; i++)
            {
                for(int j = 0; j < hraciDeska.rozmer; j++)
                {
                    if(hraciDeska.Hrac(i, j) == Manazer.StavPole.utok)
                    {

                        if(HraciDeska.Pevnost(i, j))
                        {
                            // Pokud jsou všichni útočníci v pevnosti, jistě je to nejlepší tah
                            if (++PocetUtocnikuVPevnosti == 9)
                            {
                                return Int16.MaxValue;
                            }

                            // Za každého panáčka v horním řádku pevnosti +65 bodů
                            if(i == 0)
                                stupen += 65;

                            // Za každého panáčka na levém či pravém boku pevnosti +55 bodů
                            if((j == 2 || j == 4) && (i != 2))
                                stupen += 55;

                            // Za každého panáčka v penosti +20 bodů
                            stupen += 35;
                        }

                        // Za každý pohyb o pole dopředu +10 bodů
                        stupen += ((7 - i) * 10);

                        // Přidáme náhodné číslo od 0 do 9, aby počítač netáhl vždy stejně
                        stupen += rand.Next(10);
                    }
                    else if(hraciDeska.Hrac(i, j) == Manazer.StavPole.obrana)
                    {
                        // Čím dál je obránce od pevnosti, tím lépe
                        stupen += 25 * i;
                    }
                }
            }

            return stupen;
        }
Beispiel #2
0
        /// <summary>
        /// Vrací všechny platné tahy pro zadanou pozici a pro zadaného hráče.
        /// </summary>
        public static List<Tah> VratPlatneTahy(Pozice pole, Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            if(hraciDeska.Hrac(pole) == hrac)
                return VratPlatneTahy(pole.Radek, pole.Sloupec, hrac, hraciDeska);

            return new List<Tah>();
        }
Beispiel #3
0
        /// <summary>
        /// Vrací všechny platné tahy pro zadanou pozici a pro zadaného hráče.
        /// </summary>
        public static List<Tah> VratPlatneTahy(int radekOdkud, int sloupecOdkud, 
            Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            List<Tah> platneTahy = new List<Tah>();

            if(hraciDeska.Hrac(radekOdkud, sloupecOdkud) == hrac)
            {
                for(int i = 0; i < hraciDeska.rozmer; i++)
                {
                    for(int j = 0; j < hraciDeska.rozmer; j++)
                    {
                        if(ValidniTah(i, j, radekOdkud, sloupecOdkud, hrac, hraciDeska) &&
                            hraciDeska.MuzemeTahnout(i, j))
                        {
                            Tah tah = new Tah(new Pozice(radekOdkud, sloupecOdkud), new Pozice(i, j));

                            platneTahy.Add(tah);
                        }
                    }
                }
            }

            return platneTahy;
        }
Beispiel #4
0
        /// <summary>
        /// Skáče obránce horizontálně nebo vertikálně nebo diagonálně?
        /// </summary>
        private static bool Skok(int radekKam, int sloupecKam, int radekOdkud, int sloupecOdkud,
            Manazer.StavPole hrac, HraciDeska hraciDeska)
        {
            if(hrac == Manazer.StavPole.obrana)
            {
                Manazer.StavPole hracNaPozici;
                int rozdilRadku = Math.Abs(radekKam - radekOdkud);
                int rozdilSloupcu = Math.Abs(sloupecKam - sloupecOdkud);

                // Obecný skok
                if((sloupecKam == sloupecOdkud && rozdilRadku == 2) ||
                    (radekKam == radekOdkud && rozdilSloupcu == 2) ||
                    (rozdilRadku == rozdilSloupcu && rozdilSloupcu == 2))
                {
                    int preskokRadek = (radekOdkud + radekKam) / 2;
                    int preskokSloupec = (sloupecKam + sloupecOdkud) / 2;

                    // Skáče obránce přes roh hrací desky?
                    if((rozdilRadku == rozdilSloupcu && rozdilSloupcu == 2) &&
                        (((preskokRadek == 2) && (preskokSloupec == 1 || preskokSloupec == 5)) ||
                        ((preskokRadek == 4) && (preskokSloupec == 1 || preskokSloupec == 5)) ||
                        ((preskokRadek == 1) && (preskokSloupec == 2 || preskokSloupec == 4)) ||
                        ((preskokRadek == 5) && (preskokSloupec == 2 || preskokSloupec == 4))))
                        return false;

                    hracNaPozici = hraciDeska.Hrac(preskokRadek, preskokSloupec);

                    if(hracNaPozici == Manazer.StavPole.utok)
                    {
                        return true;
                    }
                }
            }

            return false;
        }