/// <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; }
/// <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>(); }
/// <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; }
/// <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; }