前言:

  博主在看新闻时,浏览到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. Echarts 解决饼图文字过长重叠的问题
  2. WordPress yolink Search插件‘s’参数跨站脚本漏洞
  3. 微信windows版_刚刚微信内测更新!可以批量管理好友,太方便了
  4. 『软件工程6』详解软件项目管理之软件范围与估算
  5. 卡方线性趋势检验_SPSS:趋势卡方检验
  6. 基于套接字SOCKET的及时聊天
  7. Mysql 查看版本号
  8. JAVA 类加载机制学习笔记
  9. 进程,线程和协程 并行与并发
  10. c# 中实用包,实用dll。
  11. python 文件上传 web_Python WebDriver 文件上传(一)
  12. 中国科学院全国名词委组合数学和计算机科学研究开发中心 顾同新,有关组合数学家陆家羲的几点史实澄清.doc...
  13. 前端 | 数据可视化之ECharts
  14. tumblr_如何在您的Tumblr博客中添加论坛
  15. 电脑死机什么导致,带你一次性了解所有导致电脑死机蓝屏原因!
  16. 购物商城html源码asp,购物商城 html
  17. 北京大学2009年4月18日计算机会场QA
  18. input禁止光标_input 不可输入,且禁止光标显示的几种方案兼容iphone5(se)
  19. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++
  20. 欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干

热门文章

  1. Android-APK瘦身实践
  2. Permission denied: user=administrator, access=WRITE 问题解决
  3. 修復Windows無法存取指定的裝置路徑或檔案
  4. DS1302实时时钟
  5. php修改头像怎么做,PHP - 点击更换头像
  6. 装修小知识 杜绝厨房装修遗憾
  7. oracle有条件执行插入语句
  8. 【AP】a pratical guide to robust optimization(2)
  9. 从订单信息页面进入订单详细商品页面,最简单的MVC思想
  10. 去掉最高分最低分求平均分