zoukankan      html  css  js  c++  java
  • 生命游戏的三种玩法

     生命游戏

    规则

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

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

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

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

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

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

    图案介绍

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

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

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

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

     

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

    C/C++实现

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

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<time.h> 
      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代:
    ", 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("
    ");
     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

    谢宾斯基三角形

    柔和的曲线

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

  • 相关阅读:
    程序执行并发和并行的理解
    计算机的线程和进程的区别理解,不是编程上的进程和线程
    php单线程理解
    一句话题解(2020.12)
    PE328 Lowest-cost Search
    arc109D
    6908. 【2020.11.30提高组模拟】关灯(light)/loj#3385. 「COCI 2020.11」Svjetlo
    CF1456D. Cakes for Clones
    CF1456C. New Game Plus!
    agc025E
  • 原文地址:https://www.cnblogs.com/lfri/p/9733883.html
Copyright © 2011-2022 走看看