请你编程 引人入胜的生命游戏 张凌云 1997-01-01 #3  生命游戏来源于分形,其规则如下:   假设平面上画好方形网格,每个小方块儿视为生命细胞,它有两种状态,即生和死,分别以染白色和红色代表。首先我们设置初始状态,一些方块儿染白色,另一些染红色。生命开始了演化。一个生命细胞下一步是生还是死,依它周围情形而定。对一个内部方块而言,如果周围的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);}