请你编程

Author: 张凌云 Date: 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);}