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