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