【生命游戏】

/*
生命游戏
说明:
生命游戏(game of life)为1970年由英国数学家J.H.Conway所提出来,某一细胞的邻居包括上,下,左,右,左上,左下,
右上,右下相邻之细胞。游戏规则如下:
孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。
拥挤死亡:如果细胞的邻居在四个以上,则该细胞在再一次状态将死亡。
稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。
复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。

解法:
生命游戏的规则可简化为以下,并使用case比对即可使用程式操作:
1.邻居个数为0,1,4,5,6,7,8时则该细胞下次的状态为死亡。
2.邻居个数为2时,则该细胞下次状态为复活。
3.邻居个数为3时,则该细胞下次状态为稳定。
*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXROW 10
#define MAXCOL 25
#define DEAD 0
#define ALIVE 1

int map[MAXROW][MAXCOL], newmap[MAXROW][MAXCOL];

void init();
int neighbors(int , int );
void outputMap();
void copyMap();

int main()
{
    int row, col;
    char ans;
    init();
    while(1)
    {
        outputMap();
        for(row = 0; row < MAXROW; row++)
        {
            for(col = 0; col < MAXCOL; col++)
            {
                switch(neighbors(row, col))
                {
                    case 0:
                    case 1:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                        newmap[row][col] = DEAD;
                        break;
                    case 2:
                        newmap[row][col] = map[row][col];
                        break;
                    case 3:
                        newmap[row][col] = ALIVE;
                        break;
                }
            }
        }

        copyMap();
        printf("\nContinue next Generation ? ");
        getchar();
        ans = toupper(getchar());

        if(ans != ‘y‘ && ans != ‘Y‘)
        {
            break;
        }
    }
    return 0;
}

void init()
{
    int row, col;

    for(row = 0; row < MAXROW; row++)
    {
        for(col = 0; col < MAXCOL; col++)
        {
            map[row][col] = DEAD;
        }
    }

    puts("\n============Game of life Program============");
    puts("Enter x, y where x, y is living cell.");
    printf("0 <= x <= %d, 0 <= y <= %d and ", MAXROW - 1, MAXCOL - 1);
    puts("terminate with (x, y) = (-1, -1)\n");
    printf("Enter: \n"); 

    while(1)
    {
        scanf("%d%d", &row, &col);
        if(0 <= row && row <MAXROW && 0 <= col && col < MAXCOL)
        {
            map[row][col] = ALIVE;
        }
        else if(row == -1 || col == -1)
        {
            break;
        }
        else
        {
            printf("(x, y) exceeds map ranage !\n");
        }
    }
}

int neighbors(int row, int col)
{
    int count = 0, c, r;
    for(r = row - 1; r <= row + 1; r++)
    {
        for(c = col - 1; c <= col + 1; c++)
        {
            if(r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL)
            {
                continue;
            }
            if(map[r][c] == ALIVE)
            {
                count++;
            }
        }
    }
    if(map[row][col] == ALIVE)
    {
        count--;
    }

    return count;
}

void outputMap()
{
    int row, col;
    printf("\n\n%20c Game of life cell status\n", ‘@‘);
    for(row = 0; row < MAXROW; row++)
    {
        printf("\n%20c",‘@‘);
        for(col = 0; col < MAXCOL; col++)
        {
            if(map[row][col] == ALIVE)
            {
                putchar(‘#‘);
            }
            else
            {
                putchar(‘-‘);
            }
        }
    }
}

void copyMap()
{
    int row, col;
    for(row = 0; row < MAXROW; row++)
    {
        for(col = 0; col < MAXCOL; col++)
        {
            map[row][col] = newmap[row][col];
        }
    }
}

//不完善 
时间: 2024-10-28 02:11:46

【生命游戏】的相关文章

【转载】【元胞自动机】生命游戏(时间简史)

原帖:http://www.cnblogs.com/lvpengms/archive/2010/02/08/1666095.html 晚上闲着没事干,鉴于前一段时间数学建模中看到了生命游戏 Game of Life,所以用C++实现一下,效果还不错. 本程序是用vs2005 C++编写,有意想要程序和源码的朋友可以给我发邮件. 更新:程序源码可以从这个地址下载:下载元胞自动机源码及程序 =======================================================

生命游戏和随机数之间某种不可言说的秘密

为什么我感觉随便写一个一维生命游戏规则就可以做出一个看起来很随机实际上也蛮随机的随机数生成器.... 这是代码: 1 #include <cstdio> 2 #include <fstream> 3 #include <iostream> 4 5 #include <cstdlib> 6 #include <cstring> 7 #include <algorithm> 8 #include <cmath> 9 10 #i

元胞自动机+生命游戏

元胞自动机 元胞自动机(Cellular Automaton,复数为Cellular Automata,简称CA,也有人译为细胞自动机.点格自动机.分子自动机或单元自动机).是一时间和空间都离散的动力系统.散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新.大量元胞通过简单的相互作用而构成动态系统的演化. 不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成.凡是满

生命游戏&amp;一维细胞自动机 笔记

de 生命游戏是一种简单的聚合模型,展示了事物是如何聚合的,是自动机(CA)模型的一种.由剑桥大学约翰康威发明,其规则为: 1. 每个细胞拥有八个邻居,细胞状态只有存活(黑)和死亡(白)两种: 2.处于死亡状态的细胞可以在有三个存活邻居的情况下复活: 3.存活状态的细胞在相邻有2个一下或三个以上存活细胞的情况下会死去,2-3个相邻细胞存活时会继续存活: 从而产生了信号灯.闪光灯.滑翔机.警示灯等经典的变换. 遵循简单规则的简单图像聚合一起可以形成复杂图像,甚至如活物一般能进行空间平移(自组织模型

生命游戏/Game of Life的Java实现(转)

首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去:相反,如果周围活细胞过少,这个细胞会因太孤单而死去.具体如下图: 每个格子的生死遵循下面的原则: 1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,

LeetCode:Game of Life - 康威生命游戏

1.题目名称 Game of Life(康威生命游戏) 2.题目地址 https://leetcode.com/problems/game-of-life 3.题目内容 英文: According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conw

关于康威生命游戏的学习

 康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它最初于1970年10月在<科学美国人>杂志上马丁·葛登能的"数学游戏"专栏出现. 一个偶然机会发现了这个美妙的生命游戏.于是开始写程序来实现它,其实实现是很简单的,我现在还只能做到这个而已,不过还会继续深究下去的.先用Random来生成随机数,这样就可以在初始的时候在随机位置设定生死细胞了.输出的时候用2个for循环就是了.昨天做的时候遇到的问题是不知道最后该怎么判断了,因为判断

混沌,细胞自动机与生命游戏

混沌,细胞自动机与生命游戏 1.康威生命游戏的规则 生命游戏中,对于任意细胞,规则如下:每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动. Ⅰ. A live square with two or three live neighbors survives (survival).Ⅱ. A dead square with exactly three live neighbors becomes a live cell (birth).Ⅲ. In all other c

C语言练习题一道——生命游戏

生命游戏是一个很简单,但却是很有趣的程序习题.在一个四周都可以延伸到无限的 棋盘上的某个格子中会有一个有机体.每一个有机体在时间t 时,会依照环绕着它的8 个邻 居的特性而决定在时间t+1 时是否能生存下去.如果某一格在时间t 时: (1)有一个有机体,但是它的邻居少于或等于1 个,或者是大于3 个,那就会因为不 够稠密或太过稠密,这个有机体在时间t+1 时就会死亡:换言之,在t+1 时间,那一格中不 会存在有机体.下面就是几个在时间t+1 时会死亡的例子,如图1 所示. 图1 (2)有有机体在