Pledge algorithmus?

Neue Frage »

Auf diesen Beitrag antworten »
MazeSolver Pledge algorithmus?

Meine Frage:
Hey,
Also ich bin gerade dabei ein Pledge Algorithmus zu schreiben. Ich bin leider sehr neu in diesem Gebiet, weshalb ich etwas überfodert bin mit dieser Aufgabe.

Die Sprache die ich benutze ist JavaScript

und ich hab bereits in meinem Programm, Labyrinth gezeichnet und so programmiert, dass man den Startpunkt beliebig auswählen kann.

Nun soll der nächste schritt sein, dass ich eine Feldvariable programmiere die den Lösungsweg des Algorithmus enthält. Aber ich versteh nicht genau wie ich das vorgehen soll?

Mir wurde vorgeschlagen eine Funktion loeseLaybrinth zu entwerfen.
Doch ich komme in diesem Punkt einfach nicht weiter

mein Programm findet ihr hier
http://jsbin.com/muwagat/11/edit?js,output


Meine Ideen:
Das Ziel sollte sein, dass mithilfe dem Algorithmus ich aus dem Labyrinth herausfinde. Und für die Animation hab ich überlegt mit window.setInterval zu arbeiten.
 
Auf diesen Beitrag antworten »
eulerscheZahl

Das Verlassen klappt noch nicht so ganz:
Zitat:
Die Hand wird nur dann von der Wand des Irrgartens genommen, wenn beide Bedingungen erfüllt sind: „Summe der gemachten Drehungen gleich Null“ und „aktuelle Ausrichtung gleich Zielrichtung“. Dadurch vermeidet der Algorithmus, in Fallen zu tappen, die die Form des Großbuchstaben „G“ besitzen.

Ich sehe hier ein Problem, wenn man bereits in der Falle startet.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
$(document).ready(function(){
$("body").append( "<canvas id='labyrinth' width = '500px' height ='500px'/>" );
var canvas=$("#labyrinth") [0];
var zeichnen=$("#labyrinth") [0].getContext('2d');



$("body").append("<input type='button' id='loeschen' value='Löschen' />");
$("#loeschen").click(function() {
	loescheFlaeche();
	rect();  
});
  
var gesetzt=false;
var xpos=-1;
var ypos=-1;
var gedrueckt=false;
var x,y;
var weg=0;
var wartezeit=0;
var level=[];
var aktuellesLevel=0;
level[0]=[];
var breite=10;
var zeichenBreite=40;

level[0]=[[1,1,1,1,1,1,1,1,1,1],
          [1,0,0,0,0,0,0,0,0,1],
          [1,0,0,0,0,0,0,0,0,1],
          [1,0,0,1,1,1,1,1,0,1],
          [1,0,0,1,1,0,0,0,0,1],
          [1,0,0,1,1,0,0,0,0,1],
          [1,0,0,1,1,1,1,1,1,1],
          [1,0,0,0,0,0,0,0,0,1],
          [1,0,0,0,0,0,0,0,0,0],
          [1,0,0,0,0,0,0,0,0,1],
          [1,1,1,1,1,1,1,1,1,1]
           ];
var zeilen=11;

canvas.onmousemove=function (event) {mausGedrueckt(event);};
canvas.onmousedown=function (event) {gedrueckt=true; mausGedrueckt(event);};
canvas.onmouseup=function (event) {gedrueckt=false;};
canvas.onmouseout=function (event) {gedrueckt=false;};
  
function mausGedrueckt(e) {
	var x=e.pageX-canvas.offsetLeft;
	var y=e.pageY-canvas.offsetTop;
	if (gedrueckt===true) {
		xquadrat=parseInt(x/zeichenBreite);
		yquadrat=parseInt(y/zeichenBreite);
		if (!isBlack(xquadrat,yquadrat) && gesetzt === false) {
			level[aktuellesLevel][yquadrat][xquadrat]=2;
			xpos=xquadrat;
			ypos=yquadrat;
			gesetzt=true;
			loeseLabyrinth();
			rect();
		}
	}
	return false;	
}

function isBlack(x,y) {
	if (level[aktuellesLevel][y][x]==1) {
		return true;
	} else {
		return false;
	}
} 
  
function rect(){
	zeichnen.fillStyle="#000000";
	for (var zeile=0;zeile<zeilen;zeile++){
		for (var spalte=0;spalte<breite;spalte++){
			if (level[aktuellesLevel][zeile][spalte]==1){
				zeichnen.fillStyle="#000000";
				zeichnen.fillRect(spalte*zeichenBreite,zeile*zeichenBreite,zeichenBreite,zeichenBreite);
			} else if (level[aktuellesLevel][zeile][spalte]==2){
				zeichnen.fillStyle="#ff00ff";
				zeichnen.fillRect(spalte*zeichenBreite,zeile*zeichenBreite,zeichenBreite,zeichenBreite);
			}else if (level[aktuellesLevel][zeile][spalte]>=3){
				zeichnen.beginPath();
				var color = 7*level[aktuellesLevel][zeile][spalte];
				if (color > 255) color = 255;
				zeichnen.fillStyle= "rgba(" + color + ",0,0,1)";
				zeichnen.arc((spalte+.5)*zeichenBreite,(zeile+.5)*zeichenBreite,zeichenBreite/2,0,2*Math.PI);	
				zeichnen.fill();
			}
		}
	}
}

function loescheFlaeche() {
	zeichnen.fillStyle="#FFFFFF";
	zeichnen.fillRect(0,0,500,500);
	for (var zeile=0;zeile<zeilen;zeile++){
		for (var spalte=0;spalte<breite;spalte++){
			if (level[aktuellesLevel][zeile][spalte] > 1) level[aktuellesLevel][zeile][spalte] = 0;
		}
	}
	gesetzt = false;
}

function loeseLabyrinth() {
	offset = [[0,1],[1,0],[0,-1],[-1,0]];
	var x = xpos; var y = ypos;
	var steps = 0;
	var initialDir = 1;
	var dir = initialDir;
	while (x != 0 && x != breite - 1 && y != 0 && y != zeilen - 1 && ++steps < zeilen*breite) {
		//4 Möglichkeiten: Richtung beibehalten, Rechtsdrehung, Linksdrehung, Umdrehen
		var options = [];
		if (!isBlack(x + offset[(dir+4)%4][0], y + offset[(dir+4)%4][1])) //Richtung beibehalten
			options.push([x + offset[(dir+4)%4][0], y + offset[(dir+4)%4][1], dir]);
		if (!isBlack(x + offset[(dir+5)%4][0], y + offset[(dir+5)%4][1])) //Rechtsdrehung
			options.push([x + offset[(dir+5)%4][0], y + offset[(dir+5)%4][1], dir+1]);
		if (!isBlack(x + offset[(dir+3)%4][0], y + offset[(dir+3)%4][1])) //Linksdrehung
			options.push([x + offset[(dir+3)%4][0], y + offset[(dir+3)%4][1], dir-1]);
		if (!isBlack(x + offset[(dir+6)%4][0], y + offset[(dir+6)%4][1])) //Umdrehen
			options.push([x + offset[(dir+6)%4][0], y + offset[(dir+6)%4][1], dir+2]);
		
		//finde die optimale Richtung: wenn initialDir möglich, dann mach das
		var bestSolution = -1;
		for (var opt = 0; opt < options.length; opt++) {
			if (options[opt][2] == initialDir)
				bestSolution = opt;
		}
		
		var preferredDirection = [4,5,3,6]; //geradeaus, rechts, links, umdrehen
		for (var i = 0; i < preferredDirection.length; i++) {
			if (bestSolution == -1) { //noch keine Richtung gefunden
				for (var opt = 0; opt < options.length; opt++) {
					if ((options[opt][2]+4)%4 == (dir+preferredDirection[i])%4)
						bestSolution = opt;
				}		
			}
		}

		x = options[bestSolution][0];
		y = options[bestSolution][1];
		dir = options[bestSolution][2];
		level[aktuellesLevel][y][x] = 2 + steps;
	}
}

loescheFlaeche();
rect();

});
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »