生命游戏,有人玩过吗?
翻以前的资料时,找到一个很久以前用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; }