- Author:
- Rebecca
- Twitter:
- @
- GitHub:
- Facebook:
- Google+:
- +
- Reddit:
- /r/
- Pouet:
- Website:
- 23inch.de
- Compo:
- classic
- Demo link:
- https://js1k.com/2010-first/demo/472
- Shortlink:
- https://js1k.com/472
- Blog post:
- please update here!
- Bytes:
- 1023
- Chars:
- 1023
- Submission
eval("eval(\"B=document.body;X=B.children[0].getContext('2d'jPBlur=3;mOw=8*2;v=w*w;k=8*w;R=[];F=[];Y=localStorage;G!U)UIsAWCISInIoIl=v;JiIi<k;i++)q=(Math.random()*4+1+'')[L=0]};pAWV6'#fff'Z0,0,2*v,vjVb='#000';i=(a=' Score: ')+n;Go)i='Final'+i;GS)i+=' | '+S;Dz,1,k+wjDz='High'+a+U,v-X.measurez).width+4,k+w)Z2,k+4,v+4,1jJcOc<1;c++)KGqQc==LWVa='#'+'#eb2290'.substr(q,3j6c?a:bZ(i>>3)*w+4+C,i%8*w+4,w,wj}};rAx,yWGx>=0Qx<wQy>=0Qy<8QE=5]Qq==R[m]Q!LWLOJvar cOc<3;)r(c%2+x,(1-c++)%2+yjM++}};Nover=NmoveAeWx7X-4-C>>4;y7Y-4>>4;G!oQ5-mWKLIm=5;MIr(x,yjGM<2)F[m]Ip()}};B.onclickAeWGo)s(jG!oQM-1WS=M-1;S *=S;KGLWqILIl-=2;}b=k;Jx=MIx<k;x+=8WJaI!a;)Ji=a=x+8-1;i>x;i--)G!qQTWq=T;TIaI}GR[a]WGx>b)Ji=x;i<8+x;E++]=0)R[b++]=q}else Gx<b)b=x;}C=k-b;oOKGqQ(i%8QT==q||i>8QE-8]==q))oIS+=o*l;n+=S;GoQn>U)U=n}mONmove(ejp()};s(jp()\"_7=e.page_6PColor=_5x*8+y_TE-1]_zText(i_qE]_j);_Z;DRect(_W){_VDStyle=_UY.sh_Q&&_PX.shadow_O=-1;_NB.onmouse_LF[i]_KJi in R)_Jfor(_I=0;_Gif(_ER[i_DX.fill_A=function()".replace(/_(\w)([^_]*)(?!$)/g,".replace(/$1/g,'$2')"))
- Description
- SameGame(http://en.wikipedia.org/wiki/SameGame)
The goal is to remove many blocks as possible.
Displays total and score of last move.
Click to start a new game.
Now features a cleaner interface and a high score using localStorage.
- Base64 encoded
ZXZhbCgiZXZhbChcIkI9ZG9jdW1lbnQuYm9keTtYPUIuY2hpbGRyZW5bMF0uZ2V0Q29udGV4dCgnMmQnalBCbHVyPTM7bU93PTgqMjt2PXcqdztrPTgqdztSPVtdO0Y9W107WT1sb2NhbFN0b3JhZ2U7RyFVKVVJc0FXQ0lTSW5Jb0lsPXY7SmlJaTxrO2krKylxPShNYXRoLnJhbmRvbSgpKjQrMSsnJylbTD0wXX07cEFXVjYnI2ZmZidaMCwwLDIqdix2alZiPScjMDAwJztpPShhPScgU2NvcmU6ICcpK247R28paT0nRmluYWwnK2k7R1MpaSs9JyB8ICcrUztEeiwxLGsrd2pEej0nSGlnaCcrYStVLHYtWC5tZWFzdXJleikud2lkdGgrNCxrK3cpWjIsays0LHYrNCwxakpjT2M8MTtjKyspS0dxUWM9PUxXVmE9JyMnKycjZWIyMjkwJy5zdWJzdHIocSwzajZjP2E6YlooaT4+Mykqdys0K0MsaSU4KncrNCx3LHdqfX07ckF4LHlXR3g+PTBReDx3UXk+PTBReTw4UUU9NV1RcT09UlttXVEhTFdMT0p2YXIgY09jPDM7KXIoYyUyK3gsKDEtYysrKSUyK3lqTSsrfX07Tm92ZXI9Tm1vdmVBZVd4N1gtNC1DPj40O3k3WS00Pj40O0chb1E1LW1XS0xJbT01O01Jcih4LHlqR008MilGW21dSXAoKX19O0Iub25jbGlja0FlV0dvKXMoakchb1FNLTFXUz1NLTE7UyAqPVM7S0dMV3FJTElsLT0yO31iPWs7Sng9TUl4PGs7eCs9OFdKYUkhYTspSmk9YT14KzgtMTtpPng7aS0tKUchcVFUV3E9VDtUSWFJfUdSW2FdV0d4PmIpSmk9eDtpPDgreDtFKytdPTApUltiKytdPXF9ZWxzZSBHeDxiKWI9eDt9Qz1rLWI7b09LR3FRKGklOFFUPT1xfHxpPjhRRS04XT09cSkpb0lTKz1vKmw7bis9UztHb1FuPlUpVT1ufW1PTm1vdmUoZWpwKCl9O3MoanAoKVwiXzc9ZS5wYWdlXzZQQ29sb3I9XzV4KjgreV9URS0xXV96VGV4dChpX3FFXV9qKTtfWjtEUmVjdChfVyl7X1ZEU3R5bGU9X1VZLnNoX1EmJl9QWC5zaGFkb3dfTz0tMTtfTkIub25tb3VzZV9MRltpXV9LSmkgaW4gUilfSmZvcihfST0wO19HaWYoX0VSW2lfRFguZmlsbF9BPWZ1bmN0aW9uKCkiLnJlcGxhY2UoL18oXHcpKFteX10qKSg/ISQpL2csIi5yZXBsYWNlKC8kMS9nLCckMicpIikp
- Original source
docbody = document.body;
context = docbody.children[0].getContext('2d');
context.shadowBlur = 3;
mousep=-1; // mouse position (in blocks)
w = 8*2; // board width and block size
v = w*w; // displayed board width
k = 8*w;
board = []; // game board
marked = []; // marked blocks
Y=localStorage;
if(!Y.sh) Y.sh = 0; // high score :D
// setup new game
setup = function()
{
offset = 0; // colums removed
delta = 0; // move score
score = 0; // total score
end = 0; // game over
left = v; // blocks left * 2
// setup board and marks
for(i=0; i<k; i++)
// (x+'')[0] ^= Math.floor(x) for 0 <= x < 10
board[i] = (Math.random()*4+1+'')[marked[i] = 0]
};
// draw board including highlighting
print = function()
{
// clear board and score
context.fillStyle = context.shadowColor = '#fff';
context.fillRect(0,0,2*v,v);
// print score + delta
context.fillStyle = b = '#000';
i = (a = ' Score: ')+score;
if(end) i = 'Final'+i;
if(delta) i += ' | '+delta;
context.fillText(i,1,k+w);
// print high score
context.fillText(i='High'+a+Y.sh,v-context.measureText(i).width+4,k+w);
// print separator
context.fillRect(2,k+4,v+4,1);
// draw board (-1 - marked, 0 - unmarked)
for(c=-1;c<1;c++)
for(i in board)
if(board[i] && c==marked[i]) {
// hint: colors are interlaced
context.fillStyle = a = '#'+'#eb2290'.substr(board[i],3);
context.shadowColor = c ? a : b;
context.fillRect((i>>3)*w+4+offset,i%8*w+4,w,w);
}
};
// mark highlighted blocks
// x,y - mouse position
mark = function(x,y)
{
// check bounds and if already marked
if(x>=0 && x<w && y>=0 && y<8 && board[i=x*8+y] && board[i]==board[mousep] && !marked[i]) {
marked[i] = -1; // -1 is cheaper than 1
// mark next positions
for(var c=-1; c<3;)
mark(c%2+x,(1-c++)%2+y);
numMarked++
}
};
// move handler
docbody.onmouseover =
docbody.onmousemove = function(e)
{
// map to board
x = e.pageX-4-offset >> 4;
y = e.pageY-4 >> 4;
// don't select after game end or if block already selected
if(!end && x*8+y-mousep) {
// unmark
for(i in board)
marked[i] = 0;
// remember position
mousep = x*8+y;
// mark new blocks
numMarked = 0;
mark(x,y);
if(numMarked<2) marked[mousep] = 0;
print()
}
};
// click handler
docbody.onclick = function(e)
{
if(end) setup();
if(!end && numMarked-1) {
// score: (n-1)^2 for n blocks
delta = numMarked-1;
delta *= delta;
// remove marked blocks
for(i in board)
if(marked[i]) {
board[i] = 0;
marked[i] = 0;
left -= 2;
}
b = k;
// block propagation
for(x=numMarked=0; x<k;x+=8) {
// vertical
// hint: a has 2 uses here, do not touch ;)
for(a=0;!a;)
for(i=a=x+8-1; i>x; i--)
if(!board[i] && board[i-1]) {
board[i] = board[i-1];
board[i-1] = 0;
a = 0;
}
// horizontal
if(board[a]) {
if(x>b)
for(i=x; i<8+x; board[i++]=0)
board[b++] = board[i]
}
else if(x<b)
b = x;
}
// count remaining columns for offset
offset = k-b;
// end check
end = -1;
for(i in board)
if(board[i] && (i%8 && board[i-1]==board[i] || i>8 && board[i-8]==board[i]))
end = 0;
// game end score: -blocks*2
delta += end*left;
// add score
score += delta;
// highscore
if(end && score>Y.sh) Y.sh = score
}
// mark next blocks immediately
mousep = -1;
docbody.onmousemove(e);
print()
};
setup();
print()