int[][]b=new int[4][4]; int pad=20,bs=100,len=pad*(b.length+1)+bs*b.length,score=0,dead=0; void setup() { size(500,500); restart(); textFont(createFont("Courier",40)); } void restart() { b=new int[4][4]; for(int i=0;i<4;i++)for(int j=0;j<4;j++)b[i][j]=0; score=dead=0; noStroke(); spawn(); } void spawn(){ ArrayList xs=new ArrayList(),ys=new ArrayList(); for(int j=0;j0){ float p=log(b[j][i])/log(2); rectt(x,y,bs,bs,5,color(255-p*255/11,p*255/11,0)); textt(""+b[j][i],x,y+22,bs,bs,color(0),30,CENTER); } } } textt("score: "+score,10,5,100,50,color(0),10,LEFT); if(dead>0) { rectt(0,0,width,height,0,color(255,199)); textt("Game Over ! Click to Restart",0,height/2,width,50,color(0),30,CENTER); if(mousePressed)restart(); } } void rectt(float x,float y,float w,float h,float r,color c) { fill(c); rect(x,y,w,h,r); } void textt(String t,float x,float y,float w,float h,color c,float s,int align) { fill(c);textAlign(align);textSize(s);text(t,x,y,w,h); } boolean gameover() { int[]dx={1,-1,0,0},dy={0,0,1,-1}; boolean out=true; for(int i=0;i<4;i++)if(go(dy[i],dx[i],false)!=null)out=false; return out; } void keyPressed() { if(dead==0) { int kC=keyCode,dy=(kC==UP?-1:(kC==DOWN?1:0)),dx=(kC==LEFT?-1:(kC==RIGHT?1:0)); int[][]newb=go(dy,dx,true); if(newb!=null) { b=newb; spawn(); } if(gameover())dead=1; } } int[][] go(int dy,int dx,boolean updateboard) { int [][]bak=new int[4][4]; for(int j=0;j<4;j++) for(int i=0;i<4;i++)bak[j][i]=b[j][i]; boolean moved=false; if(dx!=0 || dy!=0){ int d=dx!=0?dx:dy; for(int perp=0;perp0?b.length-2:1); tang!=(d>0?-1:b.length); tang-=d){ int y=(dx!=0?perp:tang),x=(dx!=0?tang:perp),ty=y,tx=x; if(bak[y][x]==0)continue; for(int i=(dx!=0?x:y)+d;i!=(d>0?b.length:-1);i+=d){ int r=dx!=0?y:i,c=dx!=0?i:x; if(bak[r][c]!=0 && bak[r][c]!=b[y][x])break; if(dx!=0)tx=i; else ty=i; } if((dx!=0 && tx==x) || (dy!=0 && ty==y))continue; else if(bak[ty][tx]==b[y][x]){ bak[ty][tx]*=2; if(updateboard)score+=bak[ty][tx]; moved=true; } else if((dx!=0 && tx!=x) || (dy!=0 && ty!=y)) { bak[ty][tx]=bak[y][x]; moved=true; } if(moved) bak[y][x]=0; } } return moved? bak:null; }