This is a simple maze game. The algorithm chooses a random starting point and random directions and continues till it reaches any end of horizontal axis.
d=document;b=d.body;m=Math;S='innerHTML';Z=25;Q='c';v='value';G='attachEvent';J=d[G]?'on':'';G=d[G]?G:'addEventListener';function K(z){return m.floor(m.random()*z)}function g(s){return d.getElementById(s)}function l(a,b,c){g(a+Q+b)[S]=c}function t(a,b,s){g(a+Q+b).style.background=s}setTimeout(function(){for(u='<input id=t ><table>',O=H='',A=[];O<62;){for(N=r=0;r<Z&&(A[r]=[],u+='<tr>');r++)for(c=0;c<Z;)u+='<td id='+r+Q+c++ +' >_';for(r=L=U=K(Z),c=B=V=K(Z),A[r][c]=O=1;!H;A[L][B]=1,O++)for(z=L,j=B,w=K(4),K(2)&&N?w=N:N=w,w>1?w>2?L++:B++:w>1?L--:B--,L=(L+Z)%Z;B==Z||B<0;)for(H=0,B=(B+Z)%Z,O=L==r||B==c||O;O>61&&H++==0;)for(b[S]+=u,R=0,l(U,V,'S'),l(z,j,'E');R<Z;R++)for(c=0;c<Z;)t(R,c,A[R][c++]>0?'tan':K(2)?'red':'#000')}g('t')[v]=m.ceil(O/5);N=setInterval(function(){T=g('t');I=T[v];T[v]=I>0?--I:I,P=I<1?'L':g(U+Q+V)[S]=='E'?'W':0;P&&alert(P)|clearInterval(N)},1000);d[G](J+'keyup',function(e){X=U,Y=V,k=e?e:window.event;k=k.keyCode-37;k==0?Y--:k==1?X--:k==2?Y++:k==3?X++:X;A[X=(X+Z)%Z][Y=(Y+Z)%Z]>0&&t(U=X,V=Y,'')},0)},5)
ZD1kb2N1bWVudDtiPWQuYm9keTttPU1hdGg7Uz0naW5uZXJIVE1MJztaPTI1O1E9J2MnO3Y9J3ZhbHVlJztHPSdhdHRhY2hFdmVudCc7Sj1kW0ddPydvbic6Jyc7Rz1kW0ddP0c6J2FkZEV2ZW50TGlzdGVuZXInO2Z1bmN0aW9uIEsoeil7cmV0dXJuIG0uZmxvb3IobS5yYW5kb20oKSp6KX1mdW5jdGlvbiBnKHMpe3JldHVybiBkLmdldEVsZW1lbnRCeUlkKHMpfWZ1bmN0aW9uIGwoYSxiLGMpe2coYStRK2IpW1NdPWN9ZnVuY3Rpb24gdChhLGIscyl7ZyhhK1ErYikuc3R5bGUuYmFja2dyb3VuZD1zfXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmb3IodT0nPGlucHV0IGlkPXQgPjx0YWJsZT4nLE89SD0nJyxBPVtdO088NjI7KXtmb3IoTj1yPTA7cjxaJiYoQVtyXT1bXSx1Kz0nPHRyPicpO3IrKylmb3IoYz0wO2M8WjspdSs9Jzx0ZCBpZD0nK3IrUStjKysgKycgPl8nO2ZvcihyPUw9VT1LKFopLGM9Qj1WPUsoWiksQVtyXVtjXT1PPTE7IUg7QVtMXVtCXT0xLE8rKylmb3Ioej1MLGo9Qix3PUsoNCksSygyKSYmTj93PU46Tj13LHc+MT93PjI/TCsrOkIrKzp3PjE/TC0tOkItLSxMPShMK1opJVo7Qj09Wnx8QjwwOylmb3IoSD0wLEI9KEIrWiklWixPPUw9PXJ8fEI9PWN8fE87Tz42MSYmSCsrPT0wOylmb3IoYltTXSs9dSxSPTAsbChVLFYsJ1MnKSxsKHosaiwnRScpO1I8WjtSKyspZm9yKGM9MDtjPFo7KXQoUixjLEFbUl1bYysrXT4wPyd0YW4nOksoMik/J3JlZCc6JyMwMDAnKX1nKCd0Jylbdl09bS5jZWlsKE8vNSk7Tj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe1Q9ZygndCcpO0k9VFt2XTtUW3ZdPUk+MD8tLUk6SSxQPUk8MT8nTCc6ZyhVK1ErVilbU109PSdFJz8nVyc6MDtQJiZhbGVydChQKXxjbGVhckludGVydmFsKE4pfSwxMDAwKTtkW0ddKEorJ2tleXVwJyxmdW5jdGlvbihlKXtYPVUsWT1WLGs9ZT9lOndpbmRvdy5ldmVudDtrPWsua2V5Q29kZS0zNztrPT0wP1ktLTprPT0xP1gtLTprPT0yP1krKzprPT0zP1grKzpYO0FbWD0oWCtaKSVaXVtZPShZK1opJVpdPjAmJnQoVT1YLFY9WSwnJyl9LDApfSw1KQ==
var d = document,b=d.body,m=Math;
function maze() {
this.rM();
this.rs = arguments[0];
this.cs = this.rs;
this.mF = new Array(this.rs);
var te = d.createElement('table');
te.setAttribute("id", "pool");
te.setAttribute("style", "float:left");
var tbody = d.createElement('tbody');
for (var r = 0; r < this.rs; r++) {
this.mF[r] = new Array(this.cs);
var tr = d.createElement('tr');
for (var c = 0; c < this.cs; c++) {
this.mF[r][c] = -1; // Not processed
var td = d.createElement('td');
td.setAttribute("id", "r" + r + "c" + c);
td.innerHTML = " ";
tr.appendChild(td);
}
tbody.appendChild(tr);
}
te.appendChild(tbody);
b.appendChild(te);
this.sX = null;
this.sY = null;
this.eX = null;
this.eY = null;
this.oCC = 1;
r = m.floor(m.random() * 10000) % this.rs, c = 0;
this.sX = r;
this.sY = c;
this.mF[r][c] = 1;
var nR = r, nC = c, done = false, prevDir = null;
while (!done)
{
var pX = nR, pY = nC, dir = m.floor(m.random() * 10000) % 4, prevDirUse = m.floor(m.random() * 10000)% 2;
if (prevDirUse && prevDir)
dir = prevDir;
else
prevDir = dir;
if (dir == 0) {// Right
nR++;
} else if (dir == 1) {// Bottom
nC++;
} else if (dir == 2) {// Top
nR--;
} else if (dir == 3) {// Left
nC--;
}
nR = (nR + this.rs) % this.rs;
if (nC == this.cs || nC < 0) {// End
nc = (nC + this.cs) % this.cs;
this.eX = this.eX != null ? this.eX : pX;
this.eY = this.eY != null ? this.eY : pY;
if (nR == r && nC == c) {
this.oCC = 0;
}
return;
}
if (nR < this.rs && nC < this.cs && this.mF[nR][nC] != 1) {
this.mF[nR][nC] = 1;
this.oCC++;
}
}
};
maze.prototype.df1 = function() {
for (var r = 0; r < this.rs; r++) {
for (var c = 0; c < this.cs; c++) {
var td = d.getElementById("r" + r + "c" + c), ce = this.mF[r][c], cr = "black";
if (this.sX == r && this.sY == c) {
td.style.color = "white";
td.innerHTML = "S";
}
if (this.eX == r && this.eY == c) {
td.style.color = "white";
td.innerHTML = "E";
}
if (ce == 1) {
cr = "green";
} else if (ce == -1 && m.floor(m.random() * 10000) % 2) {
cr = "red";
}
td.style.backgroundColor = cr;
}
}
};
setTimeout(function() {
d.getElementById('c').style.display = 'none';
b.innerHTML += "<div style='float:left'><b>Pool size (changeable): </b><input id='poolSize' type='text' value='25'/><input id='start' type='button' value='Start maze' onclick='sM();'/><br/><b>Reach the end within</b> <input id='timer' type='text' value='' readonly='true'/> seconds.</div>";
d.addEventListener("keyup", attachEvents, false);
}, 500);
maze.prototype.rM = function() {
var p = d.getElementById('pool');
if (p)
p.parentNode.removeChild(p);
};
var cM = null, cX = null, cY = null, attachEvents = function(e) {
if (cM == null) {
return;
}
var X = cX, Y = cY;
if (!e)
e = window.event;
switch (e.keyCode) {
case 37 :
Y--;
break;
case 38 :
X--;
break;
case 39 :
Y++;
break;
case 40 :
X++;
break;
}
if (X >= cM.rs) {
X = 0;
}
if (cY >= cM.cs) {
Y = 0;
}
if (X < 0) {
X = cM.rs - 1;
}
if (Y < 0) {
Y = cM.cs - 1;
}
if (cM.mF[X][Y] == 1) {
d.getElementById("r" + cX + "c" + cY).style.backgroundColor = 'green';
cX = X;
cY = Y;
d.getElementById("r" + cX + "c" + cY).style.backgroundColor = 'yellow';
}
}
var tId = null, sM = function() {
try {
var poolSize = parseInt(d.getElementById('poolSize').value);
do {
cM = new maze(poolSize);
} while (cM.oCC < poolSize * poolSize / 10);
cM.df1();
cX = cM.sX;
cY = cM.sY;
d.getElementById("r" + cX + "c" + cY).style.backgroundColor = 'yellow';
d.getElementById('timer').value = m.ceil(cM.oCC / 3);
if (tId != null)
clearInterval(tId);
tId = setInterval(function() {
var value = d.getElementById('timer').value, ms = '';
d.getElementById('timer').value = value - 1;
if (value == 0) {
ms = "Unsolved";
}
if (cX == cM.eX && cY == cM.eY) {
ms = "Solved";
}
if (ms != '') {
clearInterval(tId);
if (confirm(ms + ". Play again?")) {
sM();
}
}
}, 1000);
} catch (e) {
alert("Input Error");
}
};