请你编程
假设平面上画好方形网格,每个小方块儿视为生命细胞,它有两种状态,即生和死,分别以染白色和红色代表。首先我们设置初始状态,一些方块儿染白色,另一些染红色。生命开始了演化。一个生命细胞下一步是生还是死,依它周围情形而定。对一个内部方块而言,如果周围的8个方块中恰有3块为白,则它下一步染白色;如果有2块为白,则它下一步保持原色彩;如果是其它情形(有0,1,4,5,6,7,8个块为白色)则它下一步染红色。
以上规则是1970年前后,英国数学家John Conway和他的学生给出的,这个规则反映了如下背景:如果生命细胞周围其它生命细胞太少,由于得不到足够的支持和帮助,它将死亡;如果生命细胞周围其它生命细胞太多,由于资源不再充足,它也将死亡;只有当环境适宜时,生命细胞才能生存繁衍。
由于此规则恰当、简单、变化花样繁多且十分易于实现,所以曾使许多人着迷。现提供一个用Borland C写的生命游戏程序,读者不妨在自己的微机上一试。
必要的解释:程序中取200×200矩阵对应屏幕像素点阵。初始状态全部赋1,即开始生命细胞全是活的。变换只对内点进行,而不改变四个边界的状态。循环让生命演化实现,于是,我们眼前就展现出一幅幅奇异美妙的图画。欣赏够了,按ESC退出。
#3 三点说明:
(1)机器显示卡是VGA。
(2)由于运行时占内存较大,所以需先将源程序编译成EXE文件,退到DOS下运行,而不能在C集成环境下运行。
(3)读者还可以作一些发挥。将程序中矩阵初值不是一次全赋为1,而是随机赋给0或1;或是让四个边界也参与变换;或是选择别的色彩代表生和死;则可以看到另一番美妙景致。
#3 源程序:
#include "bios.h"
#include "alloc.h"
#include "conio.h"
void draw(int x,int y,char color)
{asm{mov ah,0ch
mov al,color
mov cx,x
mov dx,y
int 10h } }
/*此函数用于在屏幕(x,y)处画一点0≤x≤319,0≤y≤199,0≤color≤255*/
void main()
{int i,j,k1,k2,st,l;
char far *base,*ch;
base=(char*)farmalloc(40000);
ch=(char*)farmalloc(40000);
clrscr();
asm{mov ah,0
mov al,13h
int 10h} /*置成320×200-256色图形方式*/
for(i=0;i<=60;i++)
for(j=0;j<200;j++)
{draw(i,j,11);
draw(i+259,j,11);
} /*画两条青色色带*/
for(i=0;i<200;i++)
for(j=0;j<200;j++)
*(base+i*200+j)=1;
for(l=0;l<1000;l++)
{if(bioskey(1)!=0)
if((bioskey(0)<<8)>>8==27)break;
for(i=1;i<=198;i++)
for(j=1;j<199;j++)
{st=0;
for(k1=i-1;k1<=i+1;k1++)
for(k2=j-1;k2<=j+1;k2++)
st=st+*(base+k1*200+k2);
st=st-*(base+i*200+j);
if(st==3)*(ch+i*200+j)=1;
else
if(st==2)*(ch+i*200+j)=*(base+i*200+j);
else*(ch+i*200+j)=0;
if(*(ch+i*200+j))draw(60+j,i,30);
else draw(60+j,i,39);}
for(i=1;i<199;i++)
for(j=1;j<199,j++)
*(base+i*200+j)=*(ch+i*200+j);}
asm{mov ax,3
int 10h} /*恢复文本方式*/
farfree(base);
farfree(ch);}