board={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},{0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; board2={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0},{0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0}, {0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0},{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; initboard=board2;width=16;height=16; BoardNext[board_]:=Array[Function[{r,c},Transition[board,r,c]],{height,width}]; CellNext[val_,nSum_]:=If[val==0,If[nSum==3,1,0],If[nSum==2||nSum==3,1,0]]; Transition[board_,row_,col_]:=CellNext[GetV[board,row,col],NeighborSum[board,row,col]]; GetV[board_,row_,col_,default_:0]:=If[row<=0||row>height,default,If[col<=0||col>width,default,board[[row]][[col]]]]; NeighborSum[board_,row_,col_]:=Total[{GetV[board,row-1,col-1],GetV[board,row-1,col],GetV[board,row-1,col+1],GetV[board,row,col-1], GetV[board,row,col+1],GetV[board,row+1,col-1],GetV[board,row+1,col],GetV[board,row+1,col+1]}]; ToggleCell[board_,row_,col_]:=ReplacePart[board,{row,col}->If[GetV[board,row,col]==1,0,1]]; DrawCell[board_, row_, col_] := {If[GetV[board, row, col] == 1, Black, RGBColor[.9, .9, .9]], Rectangle[{col - 1, height - row}]}; RectArray[board_]:=Array[Function[{r,c},DrawCell[board,r,c]],{height,width}]; DrawBoard[board_]:=Graphics[Flatten[RectArray[board],1],ImageSize->Medium]; ProcessClick[board_,pt_]:=Block[{r=height-Floor[pt[[2]]],c=Floor[pt[[1]]]+1},(z={r,c};ToggleCell[board,r,c])]; DynamicModule[{myboard=initboard}, Column[{Row[{Button["Next",myboard=BoardNext[myboard]],Button["Reset",myboard=initboard]}], Framed@ClickPane[Dynamic[DrawBoard[myboard]],(myboard=ProcessClick[myboard,#])&],Dynamic[z]}]]