JS1K

#2: the original

Source for demo by PN. See also description.

C=document.body.children[0];c=C.getContext("2d");f=500;C.width=800;C.height=f;a=Array(f*5);A=Array(f*5);t=n=g=0;N=200;W=50;for(B=i=10;i<f;){c.moveTo(0,i);c.lineTo(f,i);c.moveTo(i,0);c.lineTo(i,f);i+=B}c.stroke();Q=c.fillStyle="#55a";function m(d){return d-d%B}function K(d){c.fillStyle=d}function P(){Q=c.fillStyle;K("#fff");c.fillRect(f,B,f,f);K("#000");c.fillText("$"+N+" Pop:"+g,f,W);K(Q)}function l(){for(k=G=J=0;k<f*5;k++){if(a[k]!=2&&a[k]>=0){n=0;for(b=-100;b<101;b+=W)for(u=-2;u<3;u++){F=a[k]-a[k+b+u];F==-3?n-=B:F==-1?n+=2:(F==-2||F==1&&A[k]>0)&&(n+=7)}a[k]<1?(A[k]>0&&G++,n+=j,N++):a[k]>2?(A[k]>0&&J++,n+=g,N+=5):(n+=g/5,N+=2);M=Math.random()*n;i=Q;(M>20||M<5&&A[k]==1)&&(K("#ccc"),A[k]=1,M<5&&(K("#888"),G--,A[k]=0),c.fillRect(k%W*B,m(k)/W*B,7,5));K(i)}a[k]==2&&(N--,A[k]=2);j=J;g=G}}window.onclick=function(d){x=m(d.pageX);y=m(d.pageY);N>4&&(N-=5,x>f?(N+=5,t++,y=0,x=f,t>3?(K("#55a"),t=0):t==1?K("#c00"):t==2?K("#0d0"):t==3&&K("#ba3")):a[y*5+x/B]=t,c.fillRect(x,y,B,B))};setInterval(P,W);setInterval(l,f*B);