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