前言:

  博主在看新闻时,浏览到John Horton Conway因新型冠状病毒感染而去世。这场疫情带走了许多领域杰出的大师们,希望全人类早日战胜疫情。

John Horton Conway的生命游戏为不少数学家和码农所熟知,本篇主要介绍了Conway’s Game of Life以及基于C++的实现。

生命游戏模拟代码已上传,本文将根据此进行讲解:https://github.com/CreateSuccess/GHCGameLife

生命游戏规则:

1、 生命游戏规则有些类似与围棋,游戏背景为假设有无尽大的由正方形格子组成的空间,每一个正方形格子代表为一个细胞。

2、细胞的状态有二种,生存或者死亡;

3、在二维基础上加上时间,每个回合进行判断细胞下一个回合是生存还是死亡。

4、细胞生存还是死亡取决于其与周围八个相邻细胞的互动。

5、如果一个活细胞周围细胞只有0个活着1个,则该细胞下回合死亡。(一片区域内,种群成员过少导致该片区域无法繁衍)

6、如果一个活细胞周围细胞恰有2个或者3个,则该细胞下回合存活。

7、如果一个活细胞周围活细胞超过3个,则该细胞下回合死亡。(一片区域内,种群成员过多导致平均资源变少无法繁衍)

8、如果一个死细胞周围活细胞正好有3个,则该细胞下回合转为活细胞。(一片区域内,种群成员适中,资源过多,则种群规模扩大)

代码实现

1、生命游戏规则很简单,首先我们要制作一个棋盘用于存放,棋盘大小为变成为X的正方形空间,我们将这个空间存储在一个一维数组里;

// 创建一个m_ulMapSideLength边长的正方形空间
void GHCGameLife::CreateMap()
{m_mapLife = (CoordinateStatus *)calloc(m_ulMapSideLength, m_ulMapSideLength * sizeof(CoordinateStatus));m_mapNextTimeLife = (CoordinateStatus *)calloc(m_ulMapSideLength, m_ulMapSideLength * sizeof(CoordinateStatus));
}

2、现在我们定义空间中每个点可能出现的状态:(活细胞 | 死细胞)

enum CoordinateStatus
{COORDINATE_STATUS_ALIVE = 1,COORDINATE_STATUS_DEATH,COORDINATE_STATUS_NON_SPACE,COORDINATE_STATUS_NON_MAX,
};

3、我们对空间每个点的状态进行随机赋值

void GHCGameLife::RandomSetMap()
{CoordinateStatus status[] = { COORDINATE_STATUS_ALIVE, COORDINATE_STATUS_DEATH };int statusSize = sizeof(status) / sizeof(CoordinateStatus);srand((unsigned)time(NULL));for (unsigned long i = 0; i < m_ulMapSideLength * m_ulMapSideLength; i++){m_mapLife[i] = status[rand() % statusSize];}
}

4、此时我们已经初始化好生命游戏模型,每个点可以用X,Y坐标进行唯一定位。根据游戏规则,每个回合我们将计算每个点,其附近活细胞数量,以此来决定下个回合该点状态。

int GHCGameLife::WhetherAlive(unsigned long ulCoordinatesX, unsigned long ulCoordinatesY)
{if (ulCoordinatesX <= 0 || ulCoordinatesX > m_ulMapSideLength ||ulCoordinatesY <= 0 || ulCoordinatesY > m_ulMapSideLength){return 0;}unsigned long site = ((ulCoordinatesY - 1) * m_ulMapSideLength) + (ulCoordinatesX - 1);return m_mapLife[site] == COORDINATE_STATUS_ALIVE ? 1 : 0;
}void GHCGameLife::SkipOneTime()
{for (unsigned long i = 0; i < m_ulMapSideLength * m_ulMapSideLength; i++){unsigned int uiAliveNum = 0;unsigned long ulCoordinatesNodeX = 0, ulCoordinatesNodeY = 0;ulCoordinatesNodeY = (i + 1) / m_ulMapSideLength + ( 0 == (i + 1) % m_ulMapSideLength ? 0 : 1);ulCoordinatesNodeX = (i + 1) - m_ulMapSideLength * (ulCoordinatesNodeY - 1);/* 收集细胞周围活细胞数量 */uiAliveNum += WhetherAlive(ulCoordinatesNodeX + 1, ulCoordinatesNodeY);uiAliveNum += WhetherAlive(ulCoordinatesNodeX - 1, ulCoordinatesNodeY);uiAliveNum += WhetherAlive(ulCoordinatesNodeX, ulCoordinatesNodeY + 1);uiAliveNum += WhetherAlive(ulCoordinatesNodeX + 1, ulCoordinatesNodeY + 1);uiAliveNum += WhetherAlive(ulCoordinatesNodeX - 1, ulCoordinatesNodeY + 1);uiAliveNum += WhetherAlive(ulCoordinatesNodeX, ulCoordinatesNodeY - 1);uiAliveNum += WhetherAlive(ulCoordinatesNodeX + 1, ulCoordinatesNodeY - 1);uiAliveNum += WhetherAlive(ulCoordinatesNodeX - 1, ulCoordinatesNodeY - 1);if (m_mapLife[i] == COORDINATE_STATUS_NON_SPACE){m_mapNextTimeLife[i] = COORDINATE_STATUS_NON_SPACE;}else if (uiAliveNum == 3){m_mapNextTimeLife[i] = COORDINATE_STATUS_ALIVE;}else if (2 <= uiAliveNum && 3 > uiAliveNum && m_mapLife[i] == COORDINATE_STATUS_ALIVE){m_mapNextTimeLife[i] = COORDINATE_STATUS_ALIVE;}else{m_mapNextTimeLife[i] = COORDINATE_STATUS_DEATH;}}CoordinateStatus *pmapLife = m_mapNextTimeLife;m_mapNextTimeLife = m_mapLife;m_mapLife = pmapLife;
}

图像化展示生命游戏模型进程

L代表活细胞,空格代表死细胞,X代表非空间点(无法生存点)

初始化一个9X9的空间

第一回合模型:

第二回合模型:

。。。 。。。 第100回合模型:

L代表活细胞,空格代表死细胞,X代表非空间点(无法生存点)

初始化一个20X20的空间

第一回合模型:

第200回合模型

L代表活细胞,空格代表死细胞,X代表非空间点(无法生存点)

初始化一个20X20的空间,随机设置非空间点

第一回合模型:

第200回合模型:

结语

1、生命模型在测试过程能生成一些有趣的图案;

2、设置障碍后的生命模型往往能在后期拥有更多的活细胞,令人唏嘘。最近疫情,美国一直崇拜的自由反而造成了大面积感染,一味的自由对生命并不是好事。

Conway’s Game of Life介绍及实现相关推荐

  1. 数模笔记14-元胞自动机

    元胞自动机模型 元胞自动机理论 元胞自动机(Cellular Automata,CA)是一种时空离散的局部动力学模型,是研究复杂系统的一种典型方法,特别适合用于空间复杂系统的时空动态模拟研究. 元胞自 ...

  2. 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

    原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...

  3. 英国全能数学家John Conway因新冠去世,他曾发明风靡一个时代的电脑游戏,还能心算万年历...

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  4. C++ libco 介绍与应用

    文章目录 导论 准备知识 协程的背景 libco 使用简介 libco 协程 关键数据结构及其关系 libco 协程的生命周期 事件驱动与协程调度 libco 总结 导论   使用 C++ 来编写高性 ...

  5. Conway(康威)定律理解

    在读架构之美的时候,里面提到到了康威定律(Conway定律),里面提到,团队的组织方式必然会对它产生的代码有影响.随着时间的推移,架构也会影响到团队的协作的好坏.当团队瓦解时,代码的交互就很糟糕.当团 ...

  6. Conway‘s Law

    原文地址:https://developer.aliyun.com/article/8611 概述 关于微服务的介绍,可以参考微服务那点事. 微服务是最近非常火热的新概念,大家都在追,也都觉得很对,但 ...

  7. Conway’s Game of Life中看C++SSE2并行化计算

    一.Conway's Game of Life描述 康威生命游戏(英语:Conway's Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 1.规 ...

  8. Conway: 游戏人生

    Conway: 游戏人生 发信人: dionysus (悲剧的诞生) 本文首发于<心桥>第26期,此处略有改动. Conway: 游戏人生 上帝是怎样创造这个世界的?按照<圣经> ...

  9. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

最新文章

  1. arcgis栅格数据平滑_基于ArcGIS对栅格进行平滑处理
  2. The working copy is locked due to a previous error.
  3. 生产者消费者_【线程通信】生产者消费者模型
  4. 香蜜台词共赴鸿蒙,香蜜台词斗法
  5. Control-Flow Enforcement Technology (CET)
  6. 程序员最艰巨的十大任务
  7. 主题:spring集成quartz,出现2次重复调用的问题
  8. 在工作流引擎基础上搭建电子商务揽收系统解决方案
  9. 计算机包括桌面计算机和便携式计算机,【填空题】( )计算机包括桌面计算机和便携式计算机这两种形式。...
  10. ege管理系统_网上人才管理系统方案
  11. html5 手机uc浏览器 复制链接,清除UC手机浏览器强制在页面中加入的关键词链接...
  12. 互联网思维之迭代思维
  13. ZDNS发布国际标准IETF RFC 8897,网络根基安全升级迈出关键一步
  14. 基于Java的建筑工程综合管理信息系统
  15. IMAS辅导书籍推荐
  16. ARM常用重要的寄存器及指令解释 和 指令英文全称
  17. android 倒计 代码,2小时倒计时
  18. 麻省理工 - OpenCourseWare
  19. heartbleed漏洞小记
  20. 接上显示器查看万由NAS系统,提示Press root password or ctrl+D:

热门文章

  1. 蓝奏云PHP解析接口,蓝奏云下载地址解析API[直链]
  2. H5时代的多行文本框
  3. java double 保留小数_java使double类型保留两位小数的方法
  4. OPPO手机设备安装谷歌服务套件GMS,使用Play商店
  5. LDP机制补充与配置(华为设备)
  6. 时钟芯片 服务器,通用实时时钟芯片
  7. 租车信息系统数据库设计(1)
  8. 一个用户只能登录一次
  9. 机房装饰实施方案的评审
  10. 多边形等距放缩原理与python实现