正文
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