import java.awt.*;
import acm.graphics.*;
import acm.program.*;
public class Beeperline extends GraphicsProgram {
//扩散动画
private final int Weigh = 50;
int [][] a=new int[Weigh][Weigh], b = new int[Weigh][Weigh];
GOval[][] r = new GOval[Weigh][Weigh];
int i,j;
//表格
public void ground() {
GRect kuang = new GRect(Weigh*20,Weigh*20);
kuang.setColor(Color.black);
add(kuang,20,20);
for(int i=40; i<20*Weigh+20; i+=20){
GLine line = new GLine(i,20,i,Weigh*20+20);
add(line);
line = new GLine(20,i,Weigh*20+20,i);
add(line);
}
for(int i=0; i<Weigh; i++){
for(int j=0; j<Weigh; j++){
a[i][j]=0;
r[i][j] = new GOval(20,20);
FalseGO(i,j);
add(r[i][j],i*20+20,j*20+20);
}
}
}
public void judge(int n,int m){
int num=0;
for(i=-1; i<=1; i++) {
for(j=-1; j<=1; j++) {
if((n+i)>=Weigh||(m+j)>=Weigh||(n+i)<0||(m+j)<0||(i==0&&j==0))
continue;
else if(a[n+i][m+j]==1) num++;
}
}
b[n][m]=num;
}
public void CROval(){
for(int n=0; n<Weigh; n++)
for(int m=0; m<Weigh; m++) judge(n,m);
for(int i=0; i<Weigh; i++) {
for(int j=0; j<Weigh; j++) {
if(a[i][j]==0){
if(b[i][j]==3) {
a[i][j]=1;
TrueGO(i,j);
}
}
else {
if(b[i][j]<2||b[i][j]>3) {
a[i][j]=0;
FalseGO(i,j);
}
}
}
}
}
public void First() {
for(i=0; i<Weigh; i++)
for(j=0; j<Weigh; j++) {
if(Math.random()<0.02) {
TrueGO(i,j);
a[i][j]=1;
break;
}
}
}
public void TrueGO(int i,int j) {
r[i][j].setFilled(true);
r[i][j].setColor(Color.red);
}
public void FalseGO(int i,int j) {
r[i][j].setFilled(true);
r[i][j].setColor(Color.yellow);
}
public void run() {
ground();
while(true) {
First();
CROval();
pause(100);
}
}
}