标题:【转载】小程序演绎的生命游戏
取消只看楼主
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
 问题点数:0 回复次数:0 
【转载】小程序演绎的生命游戏
http://www.isee.zju.
   本世纪70年代,人们曾疯迷于一种被称作“生命游戏”的小游戏,这种游戏相当简单。假设有一个象棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。由英国数学家John Conway确定的游戏规则如下:
   (1)如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;
   (2)如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
   (3)在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。

  依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。该游戏之所以被称为生命游戏,是因为其简单的游戏规则反映了自然界中这样的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡,如果太多,则会因为得不到足够的生命资源而死亡。
  用计算机模拟这个生命游戏也相当简单,可以用一个M×N象素的图象来代表M×N个细胞,其中每一个象素,代表一个细胞,象素为黑色表示细胞为生,象素为白色代表细胞为死。
  例如一个图象中几个象素所代表的生命的初始状态如下左图所示,依上述规则进行行迭代变化,则经过1次、2次、3次变化后的情况分别如下图所示:
    " border="0" />
    设定图象中每个象素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。
  下面给出的小程序程序用TC2.0编写。变化时边缘细胞不参与变化。随着迭代次数的不同,在屏幕显示的图案精彩纷呈,象万花筒般引人入胜。
程序代码:
/*代码被我略作修改~-hoodlum1980*/
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#define N 108
int ForeColor=BLUE;
int BackColor=BLACK;
int BorderColor=DARKGRAY;
int CellSize=3;
int BoardLeft=2;
int BoardTop=2;
/*绘制一个代表像素的格子*/
void putcell(int x,int y,int color)
{
    setcolor(BorderColor);
    setfillstyle(SOLID_FILL,color);
    rectangle(x*CellSize,y*CellSize,(x+1)*CellSize,(y+1)*CellSize);
    floodfill(x*CellSize+1,y*CellSize+1,BorderColor);
}

void    main()
{
    int orgData[N][N],resData[N][N];/*分别记录每次   迭代的初始和结果状态*/
    int nCount,nRows,nCols,i,j,times; /*times记录迭代次数*/
    int GraphDriver=DETECT,GraphMode;
    for (i=0;i<N;i++) /*初始化数据,令每一个细胞为1*/
        for (j=0;j<N;j++)
            orgData[i][j]=1;
    initgraph(&GraphDriver,&GraphMode,"");/*初始化屏幕 显示*/
    rectangle(BoardLeft,BoardTop,BoardLeft+N,BoardTop+N);
    /*rectangle(BoardLeft*CellSize,BoardTop*CellSize,(BoardLeft+N)*CellSize,(BoardTop+N)*CellSize);*/ /*作显示边框*/
    while(!kbhit())
    {
        for (nRows=1;nRows<N-1;nRows++)
        {
            for (nCols=1;nCols<N-1;nCols++)
            {
                /*计算每一个细胞周围的活的细胞数*/
                nCount =  orgData[nRows-1][nCols-1] + orgData[nRows-1][nCols] + orgData[nRows-1][nCols+1];
                nCount += orgData[nRows][nCols-1] + orgData[nRows][nCols+1] + orgData[nRows+1][nCols-1];
                nCount += orgData[nRows+1][nCols] + orgData[nRows+1][nCols+1];
                switch(nCount)
                {
                    /*周围有3个活细胞,该细胞为生,在屏幕上用黑色象素表示*/
                    case 3:
                        putpixel(nCols+BoardLeft,BoardTop+nRows,BackColor);
                        /*putcell(nCols+BoardLeft,BoardTop+nRows,BackColor);*/
                        resData[nRows][nCols]=1;
                        break;
                        /*周围有2个活细胞,该细胞不变,在屏幕显示也不变*/
                    case 2:
                        resData[nRows][nCols]=orgData[nRows][nCols];
                        break;
                        /*其它情况下,细胞为死,在屏幕上用白色象素表示*/
                    default:
                        resData[nRows][nCols]=0;
                        putpixel(nCols+BoardLeft,BoardTop+nRows,ForeColor);
                        /*putcell(nCols+BoardLeft,BoardTop+nRows,ForeColor);*/
                }
            }
        }
        for (i=1;i<N-1;i++)
            for (j=1;j<N-1;j++)
                orgData[i][j]=resData[i][j];

        delay(500);
    }
    getch();
}


  在计算机上运行上述程序,得到迭代次数为45、69、74、78、97、116、119和156时的图象分别为下图所示。
  " border="0" />
  在实际模拟时,可以取更多的生命细胞,也可以考虑生命细胞的初始状态是依一定概率设定的随机状态,变化时也可以让边缘细胞参与变化。只要对上述程序略作更改,就会得到另外一系列美妙绝伦的图案。
  这个游戏之所以让很多人着迷,一方面因为简单中产生的让人惊叹的美丽,另一方面也是因为这个游戏的思想和其深刻内涵已经应用到科学上的很多领域,有兴趣的朋友可以参看有关方面的专著。
                                                                                                               原载于《电脑报》 作者:梁昌霖

[[it] 本帖最后由 hoodlum1980 于 2008-3-18 03:28 编辑 [/it]]
搜索更多相关主题的帖子: 细胞 生命游戏 数学家 英国 象棋 
2008-03-18 03:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-203923-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.790909 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved