예제 #1
0
 // 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++;
 }
예제 #2
0
        // 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);
        }