C 生命游戏源代码


C 生命游戏源代码


正文

main.c

/* 生命游戏规则 */
// 1. 如果一个格子周围有3个格子为白,则该格子为白;
// 2. 如果一个格子周围有2个格子为白,则该格子颜色不变;
// 3. 如果一个格子周围白色格子少于2个,则该格子为黑;
// 4. 如果一个格子周围有超过3个格子为白,则该格子为黑。

#include <unistd.h>
#include <stdio.h>

#define ROW 25
#define COL 50
#define ALIVE 1
#define DEAD 0

// map标记
int map[ROW][COL];

void main()
{
    void showBg(int bg[ROW][COL]);
    void map_copy(int map[][COL], int tmp_map[][COL]);
    int countAlive(int row, int col, int tmp_map[][COL]);
    void iteration();
    void rule_init();
    void rule1();
    void rule2();
    void rule3();
    void rule4();
    void rule5();

    // 清屏
    fprintf(stdout, "\033[2J");

    // map规则初始化
    rule_init();
    // map具体规则
    rule4();

    // 开始循环
    while(1)
    {
        // 渲染页面
        showBg(map); 
        // 暂停1s
        sleep(1);
        // 生成下一代
        iteration();
    }
}

/*
 * 函数名: showBg()
 * 功能: 显示背景
 * 参数: 需要显示的背景数组数据
 * 返回值: 无
*/
void showBg(int bg[][COL])
{
    int i, j;

    /* 定位到第一行第一列 */
    fprintf(stdout, "\033[1;1H");
    fflush(stdout);

    /* 打印所有数据 */
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            switch (bg[i][j])   // 不同数据打印不同颜色
            {
                case DEAD:
                    fprintf(stdout, " "); 
                    break;
                case ALIVE:
                    fprintf(stdout, "\033[1;47m \033[0m"); 
                    break;
            }
        }
        putchar('\n');
    }
}

/**
 * map数组copy到tmp_map数组中
 * function无法返回数组,因为返回的数组无法整体赋值,而且函数形参传递数组实际传递的是实参数组的首元素地址,
 * 所以在函数中改变数组元素内容,调用函数的位置的数组内容也一起发生了变化,这样就解决了函数无法返回数组的问题。
 */
void map_copy(int map[][COL], int tmp_map[][COL])
{
    int i, j;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            tmp_map[i][j] = map[i][j];
        }
    }
}

/**
 * 计算周边ALIVE数
 */
int countAlive(int row, int col, int tmp_map[][COL])
{
    int count = 0, r, c;
    for (r = row - 1; r <= row + 1; r++) 
    {
        // 计算九宫格中ALIVE数
        for (c = col - 1; c <= col + 1; c++)
        {
            if (r < 0 || r >= ROW || c < 0 || c >= COL) {
              continue;
            } else if (tmp_map[r][c] == ALIVE) {
                count++;
            }
        }
    }

    // 如果自己是ALIVE,则排除自己
    if (tmp_map[row][col] == ALIVE) {
        count--;
    }
    
    return count;
}

/**
 * 迭代生成下一代
 */
void iteration()
{
    int i, j;
    int tmp_map[ROW][COL];
    map_copy(map, tmp_map);
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            switch (countAlive(i, j, tmp_map))
            {
                case 2:
                    break;
                case 3:
                    map[i][j] = ALIVE;
                    break;
                default:
                    map[i][j] = DEAD;
                    break;
            }
        }
    }
}

/**
 * map规则初始化
 */
void rule_init()
{
    int i, j;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            map[i][j] = DEAD;
        }
    }
}

// 滑翔机1
void rule1()
{
    map[1][3]=ALIVE;
    map[2][1]=ALIVE;map[2][3]=ALIVE;
    map[3][2]=ALIVE;map[3][3]=ALIVE;
}

// 滑翔机2
void rule2()
{
    map[0][0]=ALIVE;
    map[1][1]=ALIVE;map[1][2]=ALIVE;
    map[2][0]=ALIVE;map[2][1]=ALIVE;
}

// 滑翔机3
void rule3()
{
    map[1][2]=ALIVE;
    map[2][3]=ALIVE;
    map[3][1]=ALIVE;map[3][2]=ALIVE;map[3][3]=ALIVE;
}

// 滑翔者枪
void rule4()
{
    int p = 12;

    map[1][p+11]=1;map[1][p+13]=1;
    map[2][p+10]=1;map[2][p+13]=1;
    map[3][p+9]=1;map[3][p+10]=1;map[3][p+21]=1;map[3][p+28]=1;
    map[4][p+1]=1;map[4][p+2]=1;map[4][p+7]=1;map[4][p+8]=1;map[4][p+12]=1;map[4][p+21]=1;map[4][p+27]=1;map[4][p+29]=1;
    map[5][p+1]=1;map[5][p+2]=1;map[5][p+9]=1;map[5][p+10]=1;map[5][p+20]=1;map[5][p+27]=1;map[5][p+28]=1;map[5][p+30]=1;
    map[6][p+10]=1;map[6][p+13]=1;map[6][p+16]=1;map[6][p+17]=1;map[6][p+27]=1;map[6][p+28]=1;map[6][p+30]=1;map[6][p+31]=1;map[6][p+35]=1;map[6][p+36]=1;
    map[7][p+11]=1;map[7][p+13]=1;map[7][p+16]=1;map[7][p+19]=1;map[7][p+20]=1;map[7][p+21]=1;map[7][p+22]=1;map[7][p+27]=1;map[7][p+28]=1;map[7][p+30]=1;map[7][p+35]=1;map[7][p+36]=1;
    map[8][p+16]=1;map[8][p+17]=1;map[8][p+18]=1;map[8][p+19]=1;map[8][p+27]=1;map[8][p+29]=1;
    map[9][p+17]=1;map[9][p+18]=1;map[9][p+28]=1;
}

// 脉冲星
void rule5()
{
    map[4][2] = map[5][2] = map[6][2] = 1;
     map[4][7] = map[5][7] = map[6][7] = 1;
     map[2][4] = map[2][5] = map[2][6] = 1;
    map[7][4] = map[7][5] = map[7][6] = 1;
 
     map[10][2] = map[11][2] = map[12][2] = 1;
     map[10][7] = map[11][7] = map[12][7] = 1;
    map[9][4] = map[9][5] = map[9][6] = 1;
    map[14][4] = map[14][5] = map[14][6] = 1;

    map[4][9] = map[5][9] = map[6][9] = 1;
    map[4][14] = map[5][14] = map[6][14] = 1;
    map[2][10] = map[2][11] = map[2][12] = 1;
    map[7][10] = map[7][11] = map[7][12] = 1;
 
    map[10][9] = map[11][9] = map[12][9] = 1;
    map[10][14] = map[11][14] = map[12][14] = 1;
    map[9][10] = map[9][11] = map[9][12] = 1;
    map[14][10] = map[14][11] = map[14][12] = 1;
}

编译:

gcc main.c -o lifegame






参考资料

人类有没有可能是被设计出来的? https://www.zhihu.com/question/298688205/answer/528647866


返回