生命游戏,有人玩过吗?
翻以前的资料时,找到一个很久以前用C#写的生命游戏。呵呵,勾起很多美好的回忆。不知道各位玩过这个游戏没有。如果不了解这个游戏,请百度一下。下面发一个控制台下的简化版的生命游戏,有兴趣可以自己编译玩一下。
用的都是标准函数,应该是什么编译器都可以编译,玩的时候最好把控制台窗口放大点。
细胞初始率在20%-60%之间比较好玩

程序代码:#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define WIDTH 60
#define HEIGHT 30
char map[HEIGHT][WIDTH];
void init_instanse()
{
srand(time(NULL));
}
void init_map(int p)
{
int i, j;
for(i = 0; i < HEIGHT; i++)
for(j = 0; j < WIDTH; j++)
map[i][j] = (rand() % 100) < p ? 1 : 0;
}
void display()
{
char str[(WIDTH + 1) * HEIGHT + 1];
int i, j, p;
for(p = i = 0; i < HEIGHT; i++)
{
for(j = 0; j < WIDTH; j++)
str[p++] = map[i][j] ? '*' : ' ';
str[p++] = '\n';
}
str[p] = '\0';
system("cls");
puts("Press any key to exit.\n");
puts(str);
}
void delay(int ms)
{
time_t now;
now = clock();
now += ms;
while(now > clock());
}
int get_neighbor(int r, int c)
{
int count = 0;
if(r - 1 >= 0 && c - 1 >= 0 && map[r - 1][c - 1]) count++;
if(r - 1 >= 0 && map[r - 1][c]) count++;
if(r - 1 >= 0 && c + 1 < WIDTH && map[r - 1][c + 1]) count++;
if(c - 1 >= 0 && map[r][c - 1]) count++;
if(c + 1 < WIDTH && map[r][c + 1]) count++;
if(r + 1 < HEIGHT && c - 1 >= 0 && map[r + 1][c - 1]) count++;
if(r + 1 < HEIGHT && map[r + 1][c]) count++;
if(r + 1 < HEIGHT && c + 1 < WIDTH && map[r + 1][c + 1]) count++;
return count;
}
void step()
{
char tm[HEIGHT][WIDTH];
int i, j, neighbor;
for(i = 0; i < HEIGHT; i++)
for(j = 0; j < WIDTH; j++)
{
neighbor = get_neighbor(i, j);
switch(neighbor)
{
case 0:
case 1: tm[i][j] = 0; break;
case 2: tm[i][j] = map[i][j]; break;
case 3: tm[i][j] = 1; break;
case 4:
case 5:
case 6:
case 7:
case 8: tm[i][j] = 0; break;
}
}
for(i = 0; i < HEIGHT; i++)
for(j = 0; j < WIDTH; j++)
map[i][j] = tm[i][j];
}
int main()
{
int i;
init_instanse();
printf("输入初始细胞存在率(0 - 99)% : ");
scanf("%d", &i);
init_map(abs(i) % 100);
while(!kbhit())
{
display();
delay(100);
step();
}
return 0;
}










