生命游戏的三种玩法

生命游戏

规则

每个细胞有两种状态——存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动。

当细胞为死亡状态,若周围有3个存活细胞,则该细胞变成存活状态(模拟繁殖)

当细胞为存活状态,若周围有2个或3个存活细胞,保持原样

若周围有3个以上存活细胞,该细胞变成死亡(模拟极度拥挤)

若周围有低于2个一下存活细胞,该细胞死亡(模拟人口稀疏)

这个游戏也叫康威生命游戏、细胞自动机、元胞自动机等。

图案介绍

“脉冲星”:它周期为3,看起来像一颗爆发的星星

“滑翔者”:每4个回合它会延右下方移动一格,虽然细胞早就不是原来的细胞,但它能保持原来额形状

“轻量级飞船”:它周期为4,每两个“回合”向右走一格

“滑翔者枪”:它会不断的产生一个有一个“滑翔者”

“繁殖者”:它会向右进行,留下一个接一个的“滑翔者枪”

C/C++实现

用C/C++模拟了最简单的规则,代码

1 #include

2 #include

3 #include

4

5 const int DATH = 0;

6 const int ALIVE = 1;

7 const int maxn = 50;

8 const int maxr = 100,maxl = 100;

9 const int dx[] = { -1,-1,-1,0,1,1,1,0 }, dy[] = { -1,0,1,1,1,0,-1,-1 };

10

11 int map[maxr][maxl], newmap[maxr][maxl];

12 int m, n, general = 0;;

13

14 //初始化,生成随机数(无法避免随机数的浪费)

15 void rule1()

16 {

17 srand(time(NULL));

18 for(int i = 0;i < m;i++)

19 for (int j = 0; j < n; j++)

20 map[i][j] = rand() % 2; //假设约n/2

21 }

22

23 //"脉冲星",周期为3

24 void rule2()

25 {

26 for (int i = 0; i < m; i++)

27 for (int j = 0; j < n; j++)

28 map[i][j] = 0;

29 map[4][2] = map[5][2] = map[6][2] = 1;

30 map[4][7] = map[5][7] = map[6][7] = 1;

31 map[2][4] = map[2][5] = map[2][6] = 1;

32 map[7][4] = map[7][5] = map[7][6] = 1;

33

34 map[10][2] = map[11][2] = map[12][2] = 1;

35 map[10][7] = map[11][7] = map[12][7] = 1;

36 map[9][4] = map[9][5] = map[9][6] = 1;

37 map[14][4] = map[14][5] = map[14][6] = 1;

38

39 map[4][9] = map[5][9] = map[6][9] = 1;

40 map[4][14] = map[5][14] = map[6][14] = 1;

41 map[2][10] = map[2][11] = map[2][12] = 1;

42 map[7][10] = map[7][11] = map[7][12] = 1;

43

44 map[10][9] = map[11][9] = map[12][9] = 1;

45 map[10][14] = map[11][14] = map[12][14] = 1;

46 map[9][10] = map[9][11] = map[9][12] = 1;

47 map[14][10] = map[14][11] = map[14][12] = 1;

48 }

49

50 //计算(x,y)周围存活细胞的个数

51 int neighbor_num(int x, int y,int map[][maxl])

52 {

53 int cnt = 0;

54 for (int i = 0; i < 8; i++)

55 {

56 int nx = x + dx[i], ny = y + dy[i];

57 if (nx >= 0 && nx < m && ny >= 0 && ny < n && map[nx][ny]) cnt++;

58 }

59 return cnt;

60 }

61

62 //打印第i代的结果

63 void print_general()

64 {

65 printf("第%d代:\n", general);

66 for (int i = 0; i < m; i++)

67 {

68 for (int j = 0; j < n; j++)

69 if (map[i][j]) printf("■");

70 else printf("□");

71 printf("\n");

72 }

73 }

74

75 //将map复制到tmp_map

76 void copy_map(int map[][maxl], int tmp_map[][maxl])

77 {

78 for (int i = 0; i < m; i++)

79 for (int j = 0; j < n; j++)

80 tmp_map[i][j] = map[i][j];

81 }

82

83 //得到下一代

84 void iteration()

85 {

86 int tmp_map[maxr][maxl];

87 copy_map(map, tmp_map); //保存之前图像,使得当前元素状态的改变还是基于之前的地图,而不是被修改了的

88 for(int i = 0;i < m;i++)

89 for (int j = 0; j < n; j++)

90 {

91 int cnt = neighbor_num(i, j, tmp_map);

92 switch (cnt)

93 {

94 case 2: continue;

95 case 3: map[i][j] = ALIVE; break;

96 default: map[i][j] = DATH; break;

97 }

98 }

99

100 general++;

101 print_general();

102 }

103

104 int main()

105 {

106 scanf("%d%d", &m, &n);

107 rule1();

108 print_general();

109 while (1)

110 iteration();

111

112 return 0;

113 }

View Code

Excel中的VBA实现

某位大神写的,自带滑翔机,链接

模拟软件Golly

自带各种规则和图案,体验感极好,当然也可以编写规则和图案,贴吧里有一些教程,链接

各种版本的下载链接:http://golly.sourceforge.net/

附(其生成的一些有趣图片):

官网logo

谢宾斯基三角形

柔和的曲线

参考链接:维基百科-康威生命游戏

Copyright © 2022 ZGC网游最新活动_热门游戏资讯_玩家互动社区 All Rights Reserved.