//Conway's Game of Life
CDC *dc[2]; //dbl buf
I64 cur_dc,;
Bool restart;
U0 DrawIt(CTask *,CDC *dc2)
{
dc[cur_dc]->flags|=DCF_NO_TRANSPARENTS;
GrBlot(dc2,0,0,dc[cur_dc]);
}
U0 AnimateTask(I64)
{
I64 x,y,x1,y1,cnt,next_dc;
while (TRUE) {
next_dc=cur_dc^1;
start_over:
restart=FALSE;
DCClear(dc[next_dc]);
for (y=1;y<Fs->parent_task->pix_height-1;y++) {
for (x=1;x<Fs->parent_task->pix_width-1;x++) {
cnt=0;
for (y1=y-1;y1<=y+1;y1++)
for (x1=x-1;x1<=x+1;x1++)
if (GrPeek(dc[cur_dc],x1,y1)==GREEN)
cnt++;
if (restart) goto start_over;
if (GrPeek(dc[cur_dc],x,y)==GREEN) {
if (cnt==3) {
dc[next_dc]->color=GREEN;
GrPlot(dc[next_dc],x,y);
}
} else {
// if (cnt==3) {//Use this for the classic rules
if (cnt==2) {
dc[next_dc]->color=GREEN;
GrPlot(dc[next_dc],x,y);
}
}
}
Yield;
}
Sleep(50);
cur_dc=next_dc;
}
}
public U0 Life()
{
I64 msg_code,cnt,x1,y1,x2,y2,arg1,arg2;
dc[0]=DCNew(GR_WIDTH,GR_HEIGHT);
dc[1]=DCNew(GR_WIDTH,GR_HEIGHT);
cur_dc=0;
restart=FALSE;
SettingsPush; //See SettingsPush
AutoComplete;
WinBorder;
WinMax;
DocClear;
DCFill;
Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs);
Fs->draw_it=&DrawIt;
Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS-WIF_SELF_BORDER;
do {
msg_code=GetMsg(&arg1,&arg2,1<<MSG_KEY_DOWN+1<<MSG_MS_L_DOWN);
switch (msg_code) {
case MSG_MS_L_DOWN:
x1=arg1; y1=arg2;
x2=arg1; y2=arg2;
cnt=0;
while (msg_code!=MSG_MS_L_UP) {
restart=TRUE;
dc[cur_dc]->color=GREEN;
dc[cur_dc]->thick=0.04*ms.speed;
GrLine3(dc[cur_dc],x1,y1,0,x2,y2,0);
restart=TRUE;
msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);
x1=x2; y1=y2;
x2=arg1; y2=arg2;
}
GrLine3(dc[cur_dc],x1,y1,0,x2,y2,0);
break;
case MSG_KEY_DOWN:
break;
}
} while (msg_code!=MSG_KEY_DOWN || !arg1);
GetMsg(,,1<<MSG_KEY_UP);
SettingsPop;
DCFill;
DCDel(dc[0]);
DCDel(dc[1]);
}
Life;