// Konstruktor třídy ASTAR public Astar() { Image = new Bitmap(@"d:\MAZE1.bmp"); DefinujHraciPole(); IDVrcholu = 0; //AktualniCesta = new List<Pozice>(); Stack = new List <Pozice>(); Next = new List <Pozice>(); agent = new Pozice(IDVrcholu, 1, 5, 19, 0, 1); ZobrazHraciPole(agent.AktPozice[0], agent.AktPozice[1]); IDVrcholu++; }
// Metoda, ve které se uskutečňuje pohyb agenta po hracím poli public void PohybujSe(int pocetBehu) { for (int b = 0; b < pocetBehu; b++) { // Pomocné pole pro uložení výsledku posunu agenta ve třídě POZICE int[] report_pomocna = new int[4]; // Do tohoto pole si uložím možné směry agenta, které zjišťuji v metodě expandujVrcholy int[] expanduj_pomocna = ExpandujVrcholy(agent.AktPozice[0], agent.AktPozice[1]); // Směr je nejprve na sever, protože směry v expanduj_pomocna jsou uloženy od severu int smer = 0; // Projdu všechny směry v expanduj_pomocna foreach (int i in expanduj_pomocna) { // Pokud je dany smer povoleny, tedy -- 1, tak se vytvori nova POZICE s hodnotami tohoto policka if (i == 1) { // Prozkoumám pozici daným směrem a získám report se vším potřebným pro vytvoření této pozice report_pomocna = agent.Pohyb(smer); // Výpočet heuristické funkce pro danou pozici // Vstupem je X -- Y -- aktuální cena cesty int celkovaCena = HeuristickaFunkce(report_pomocna[1], report_pomocna[2], report_pomocna[0]); // Přidání nalezené pozice do NEXT, tedy budoucích pozicí, kam je možné jít Next.Add(new Pozice(IDVrcholu, report_pomocna[0], report_pomocna[1], report_pomocna[2], report_pomocna[3], celkovaCena)); // Zvýším ID, aby další vrchol měl jedičné IDVrcholu++; // Porovnám pozice v NEXT podle celkové ceny cesty SESTUPNE IEnumerable <Pozice> zalozni = Next.OrderBy(a => a.CelkovaCenaCesty); Next = new List <Pozice>(); // Porovnanou kolekci si uložím z5 do původní, tedy do NEXT foreach (Pozice p in zalozni) { Next.Add(p); } } // Zvýším proměnnou směr, čímž půjdu na směr posunutý o 90° smer++; } // Do prozkoumaných pozic ve STACK si uložím současnou pozici agenta, tedy poslední prozkoumanou Stack.Add(agent); // Vezmu první pozici v NEXT, tedy ta s nejnižší celkovou cenou cesty agent = Next[0]; // Kontrola zda tato nová pozice, která se bude při dalším běhu této metody prozkoumávat není výherní if (Vyhra(agent.AktPozice[0], agent.AktPozice[1], b)) { break; } // Vykreslím hrací pole, kde pozici agenta znázorňuje prázdná pozice ZobrazHraciPole(agent.AktPozice[0], agent.AktPozice[1]); // Smažu pozici, kterou jsem si uložil do agenta z NEXT Next.RemoveAt(0); } Console.WriteLine("\n---------------STACK-----------------\n|X |Y |AktCena|CelkCena"); foreach (Pozice p in Stack) { Console.WriteLine(p); } Console.WriteLine("\n---------------NEXT-----------------\n|X |Y |AktCena|CelkCena"); foreach (Pozice p in Next) { Console.WriteLine(p); } Console.WriteLine("\n---------------AGENT-----------------\n|X |Y |AktCena|CelkCena"); Console.WriteLine(agent); }