예제 #1
0
        public void inicijalizujAstar()
        {
            AStarSearch astar = new AStarSearch();

            /*Inicijalizujem pocetno stanje tako da prima
             * koordinate kompa koje on ima na pocetku partije (9,9)
             * */
            pocetnoStanje       = new State();
            pocetnoStanje.markI = DisplayPanel.INSTANCE.computer.POZICIJA.X;
            pocetnoStanje.markJ = DisplayPanel.INSTANCE.computer.POZICIJA.Y;

            krajnjeStanje = new State();

            State sp = pocetnoStanje;
            State ss = astar.search(pocetnoStanje);

            /* Nakon sto se zavrsi pretraga, krajnjeStanje
             * dobija koordinate sela koje je najbolje napasti
             * po heuristickoj funkciji
             * */

            krajnjeStanje.markI = astar.getPoint().X;
            krajnjeStanje.markJ = astar.getPoint().Y;

            State solution = krajnjeStanje;

            inicijalizacijaPretrage(astar);

            displayPanel1.Refresh();
        }
        //TODO 5: Implementirati klasu koja kombinuje algoritme Prvi u dubinu i A*
        public State searchCombined(State pocetnoStanje)
        {
            List <State> stanjaNaObradi = new List <State>();
            Hashtable    predjeniPut    = new Hashtable();

            stanjaNaObradi.Add(pocetnoStanje);
            while (stanjaNaObradi.Count > 0)
            {
                State naObradi = stanjaNaObradi[0];

                if (!predjeniPut.ContainsKey(naObradi.GetHashCode()))
                {
                    Main.allSearchStates.Add(naObradi);
                    if (naObradi.kutija1 || naObradi.kutija2)
                    {
                        AStarSearch aZvezda = new AStarSearch();
                        return(aZvezda.search(naObradi));
                    }
                    predjeniPut.Add(naObradi.GetHashCode(), null);
                    List <State> mogucaSledecaStanja = naObradi.mogucaSledecaStanja();
                    stanjaNaObradi.InsertRange(0, mogucaSledecaStanja);
                }
                stanjaNaObradi.Remove(naObradi);
            }
            return(null);
        }
 private void btnAStar_Click(object sender, EventArgs e)
 {
     inicijalizacijaPretrage();
     AStarSearch astar = new AStarSearch();
     State sp = pocetnoStanje;
     State solution = astar.search(sp);
     if (solution != null)
     {
         resenje = solution.path();
     }
     displayPanel1.Refresh();
 }
예제 #4
0
        private void ADepth_Click(object sender, EventArgs e)
        {
            inicijalizacijaPretrage();
            AStarSearch aStar       = new AStarSearch();
            State       sp          = pocetnoStanje;
            State       solution    = null;
            State       plavaKutija = null;


            if (solution != null)
            {
                resenje = solution.path();
            }
            displayPanel1.Refresh();
        }
예제 #5
0
        private void inicijalizacijaPretrage(AStarSearch astar)
        {
            /*iniccijalizacija pocetnog stanja koje je u svakom potezu trenutna pozicija protivnika*/
            pocetnoStanje = new State();
            //dajem mu poziciju gde se nalazi computer kad je na potezu
            pocetnoStanje.markI = DisplayPanel.INSTANCE.computer.POZICIJA.X;
            pocetnoStanje.markJ = DisplayPanel.INSTANCE.computer.POZICIJA.Y;

            krajnjeStanje = new State();

            astar.search(pocetnoStanje);

            krajnjeStanje.markI = astar.getPoint().X;
            krajnjeStanje.markJ = astar.getPoint().Y;
        }
예제 #6
0
        public State search(State pocetnoStanje)
        {
            List <State> stanjaNaObradi        = new List <State>();
            Hashtable    predjeniPut           = new Hashtable();
            State        saPokupljenimKutijama = null;

            stanjaNaObradi.Add(pocetnoStanje);
            while (stanjaNaObradi.Count > 0)
            {
                State naObradi = stanjaNaObradi[stanjaNaObradi.Count - 1];

                if (!predjeniPut.ContainsKey(naObradi.GetHashCode()))
                {
                    Main.allSearchStates.Add(naObradi);
                    if (naObradi.jePokupioKutije())
                    {
                        saPokupljenimKutijama = naObradi;
                        break;
                    }

                    predjeniPut.Add(naObradi.GetHashCode(), null);
                    List <State> mogucaSledecaStanja = naObradi.mogucaSledecaStanja();
                    foreach (State sledeceStanje in mogucaSledecaStanja)
                    {
                        stanjaNaObradi.Add(sledeceStanje);
                    }
                }
                stanjaNaObradi.Remove(naObradi);
            }

            if (saPokupljenimKutijama != null)
            {
                AStarSearch astar = new AStarSearch();
                return(astar.search(saPokupljenimKutijama));
            }

            return(null);
        }
예제 #7
0
        private void gameSpeedTimer_Tick(object sender, EventArgs e)
        {
            if (Monitor.TryEnter(agentUpdateLock))
            {
                try
                {
                    // agenti traze naseg robotica, tako da je ciljno stanje u stvari pozicija robotica
                    Node trenutnaPozicijaRobotica = manualRobotPozicija;
                    Main.krajnjiNode = trenutnaPozicijaRobotica;
                    displayPanel1.Refresh();

                    // pokreni pretragu za svakog inteligentnog agenta i nadji najbolji sledeci potez za svakog od njih
                    for (int agentIndex = 0; agentIndex < minimaxAgentiPocetno.Count; agentIndex++)
                    {
                        State sp       = minimaxAgentiPocetno[agentIndex];
                        State solution = null;
                        if (interaktivnaPretraga == "A*")
                        {
                            AStarSearch pretraga = new AStarSearch();
                            solution = pretraga.search(sp);
                        }
                        else if (interaktivnaPretraga == "minimax")
                        {
                            MinMaxSearch pretraga = new MinMaxSearch();
                            solution = pretraga.search(sp);
                        }

                        if (solution != null)
                        {
                            try
                            {
                                List <State> putanja      = solution.getPutanja();
                                State        sledeciPotez = putanja[1];
                                sledeciPotez.roditeljskoStanje = null;

                                displayPanel1.moveAgentIcon(agentIndex, sledeciPotez.trenutniCvor.kordinataI - displayPanel1.agentPositions[agentIndex][0], sledeciPotez.trenutniCvor.kordinataJ - displayPanel1.agentPositions[agentIndex][1]);
                                // sledeca pretraga ce krenuti od novog stanja
                                minimaxAgentiPocetno[agentIndex] = sledeciPotez;
                                if (Main.manualRobotPozicija.kordinataI == sledeciPotez.trenutniCvor.kordinataI && Main.manualRobotPozicija.kordinataJ == sledeciPotez.trenutniCvor.kordinataJ)
                                {
                                    gameFinished        = true;
                                    lblStatus.Text      = "Protivnik je pobedio. :( Vise srece drugi put.";
                                    lblStatus.BackColor = Color.Red;
                                }
                            }
                            catch (Exception exc) { gameFinished = true; }
                        }
                    }

                    if (Main.manualRobotPozicija.kordinataI == ciljManualRobotica.kordinataI && Main.manualRobotPozicija.kordinataJ == ciljManualRobotica.kordinataJ && gameSpeedTimer.Enabled)
                    {
                        gameSpeedTimer.Enabled = false;
                        displayPanel1.Refresh();
                        gameFinished        = true;
                        lblStatus.Text      = "Vi ste pobedili! :) Cestitamo!";
                        lblStatus.BackColor = Color.Green;
                    }
                    Main.krajnjiNode = ciljManualRobotica;
                    displayPanel1.Refresh();
                }
                finally
                {
                    if (gameFinished)
                    {
                        gameSpeedTimer.Enabled = false;
                    }
                    agentSteps += 1;
                    Monitor.Exit(agentUpdateLock);
                }
            }
        }
예제 #8
0
        //pomeranje heroja
        public void moveIcon(int dI, int dJ)
        {
            popuniHeroja();
            popuniMasinu();
            if (me.NAPOTEZU)
            {
                int staraPozicijaX = me.POZICIJA.X;
                int staraPozicijaY = me.POZICIJA.Y;

                me.pomeri(new Pozicija(dI, dJ));
                me.NAPOTEZU       = false;
                computer.NAPOTEZU = true;

                InvalidateAdv(me.POZICIJA.X, me.POZICIJA.Y);
                InvalidateAdv(staraPozicijaX, staraPozicijaY);
            }
            if (computer.NAPOTEZU)
            {
                int staraPozicijaX = computer.POZICIJA.X;
                int staraPozicijaY = computer.POZICIJA.Y;

                /*svaki put kad je komp na potezu radi se pretraga
                 * da se utvrdi koje selo je najbolje napasti
                 * */
                AStarSearch pretraga = new AStarSearch();

                /*pocetnoStanje dobija koordinate trenutne pozicije
                 * komp-a
                 * */
                pocetnoStanje       = new State();
                pocetnoStanje.markI = computer.POZICIJA.X;
                pocetnoStanje.markJ = computer.POZICIJA.Y;

                /*Prosledjuje se pocetno stanje, da bi se
                 * odredilo koje je najbolje sledece stanje
                 * */
                State najbolje = pretraga.search(pocetnoStanje);

                /* Nakon sto se zavrsi pretraga, krajnjeStanje
                 * dobija koordinate sela koje je najbolje napasti
                 * po heuristickoj funkciji
                 * */
                State krajnjeStanje = new State();
                krajnjeStanje.markI = pretraga.getPoint().X;
                krajnjeStanje.markJ = pretraga.getPoint().Y;

                if (krajnjeStanje.markI == computer.POZICIJA.X && krajnjeStanje.markJ == computer.POZICIJA.Y)
                {
                    /*ova metoda vrsi borbu kompjutera kada dodje do ciljnog sela*/
                    Selo temp = nadjiSelo(new Pozicija(krajnjeStanje.markI, krajnjeStanje.markJ));

                    if (temp != null)
                    {
                        if (temp.OSVOJIO != null && temp.OSVOJIO.Equals(me))
                        {
                            Form1 fm1 = new Form1(computer, temp);
                            fm1.ShowDialog();
                        }
                        else
                        {
                            borba2(ref computer, ref temp);
                        }
                    }
                }

                /*Komp se pomera u pravcu sela
                 * */
                computer.pomeri(new Pozicija(krajnjeStanje.markI, krajnjeStanje.markJ));

                /*Nakon sto se pomeri za odredjen broj mesta,
                 * komp nije vise na potezu
                 * */
                computer.NAPOTEZU = false;
                me.NAPOTEZU       = true;

                /*Brise se ikonica na staroj poziciji i iscrtava na novoj
                 * */
                InvalidateAdv(computer.POZICIJA.X, computer.POZICIJA.Y);
                InvalidateAdv(staraPozicijaX, staraPozicijaY);
            }
        }