生命游戏

简介: 康威生命游戏:
康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序。[1]美国趣味数学大师马丁·加德纳(Martin Gardner,1914-2010)通过《科学美国人》杂志,将康威的生命游戏介绍给学术界之外的广大渎者,一时吸引了各行各业一大批人的兴趣,这时细胞自动机课题才吸引了科学家的注意。[1]
中文名:康威生命游戏
外文名:Conway life game
提出者约翰·何顿·康威


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

生命游戏

  • 生命游戏
  • 概述>
  • 一、游戏规则是什么?
    • <==游戏规则 :==> 生存定律
    • 游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
  • 二、使用步骤
    • 1.引入库
    • 2.主函数
    • 3.函数调用
  • 总结

概述>

提示:这里可以添加本文要记录的大概内容:

小崔

生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏。事实上,也是因为它模拟和显示的图像看起来颇似生命的出生和繁衍过程而得名为“生命游戏”。在游戏进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状一经锁定就不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。每个方格中都可放置一个生命细胞,每个生命细胞只有两种状态:“生”或“死”。用黑色方格表示该细胞为“生”,空格(白色)表示该细胞为“死”。或者说方格网中黑色部分表示某个时候某种“生命”的分布图。生命游戏想要模拟的是:随着时间的流逝,这个分布图将如何一代一代地变化。


提示:以下是本篇文章正文内容,下面案例可供参考

一、游戏规则是什么?

<游戏规则 :>
生存定律

游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。

  • (1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。
  • (2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
  • (3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
  • (4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。

二、使用步骤

1.引入库

代码如下(声明):

#include <graphics.h>//easyX #include <mmsystem.h>
#pragma comment(lib,"winmm.lib")//每个正方形格子大小
#define SPACE   10#define  ROWS    80
#define  COLS    80
//是否继续设置地图
bool isContinueSet;//绘制一个矩形
void drawRect(int x, int y, int flag);
//绘制整个窗口
void drawMap(int map[ROWS][COLS]);//循环不断获取鼠标信息并根据鼠标信息设置map
void getAndSet(int map[ROWS][COLS]);//细胞周期变化
void lifeWeek(int map[ROWS][COLS]);
//获取周围存活数量
int getRoundAlive(int map[ROWS][COLS],int i,int j);

2.主函数

代码如下(主函数):

int main(){isContinueSet = true;//1 做窗口initgraph(COLS*SPACE, SPACE*ROWS);int map[ROWS][COLS] = { 0 };//表示细胞//map[1][3] = 1;CreateThread(NULL, NULL,(LPTHREAD_START_ROUTINE)getAndSet,//函数名(LPVOID)map,//实参NULL, NULL);while (isContinueSet){drawMap(map);Sleep(10);//停顿百分之一秒}settextcolor(RED);outtextxy(400, 500, "开始演示");mciSendString("open 1.mp3.mp3", NULL, NULL, NULL);mciSendString("play 1.mp3.mp3 repeat", NULL, NULL, NULL);//循环播放 repeat/*如果细胞周围有3个存活的细胞   存活如果细胞周围有2个存活的细胞   维持不变如果是其他情况                不存活*/while (1){//循环演化//求出来每个细胞周围存活数量//然后判断 设置lifeWeek(map);//显示drawMap(map);Sleep(10);//停顿百分之一秒}while (1);return 0;
}

3.函数调用

/*函数声明的函数在这里进行实现*/
//获取周围存活数量
int getRoundAlive(int map[ROWS][COLS], int i, int j){int num = 0;if (i > 0 && j > 0 && map[i - 1][j - 1]) num++;if (i > 0 && map[i - 1][j]) num++;if (i > 0 && j <COLS-1 && map[i - 1][j + 1]) num++;if (j > 0 && map[i][j - 1]) num++;if (j < COLS - 1 && map[i][j + 1]) num++;if (i < ROWS - 1 && j > 0 && map[i + 1][j - 1]) num++;if (i < ROWS - 1 && map[i + 1][j]) num++;if (i < ROWS - 1 && j < COLS - 1 && map[i + 1][j + 1]) num++;return num;
}
//细胞周期变化
void lifeWeek(int map[ROWS][COLS]){//准备临时数组 用来存储一次周期map数组周围的存活情况int temp[ROWS][COLS] = { 0 };int num;for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){num = getRoundAlive(map, i, j);if (3 == num){//如果细胞周围有3个存活的细胞   temp[i][j] = 1;//存活}else if (2 == num){//如果细胞周围有2个存活的细胞   temp[i][j] = map[i][j];//维持不变}else{//如果是其他情况               temp[i][j] = 0;//不存活}}}//临时数组拷贝到map
#if 0for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){map[i][j] = temp[i][j];}}
#elsememcpy(map, temp, sizeof(int)*ROWS*COLS);
#endif
}//循环不断获取鼠标信息并根据鼠标信息设置map
void getAndSet(int map[ROWS][COLS]){MOUSEMSG msg; while (isContinueSet){//获取鼠标信息msg = GetMouseMsg();//根据鼠标信息设置mapif (msg.mkLButton){//鼠标左键按下 设置为存活if ((ROWS - 1) == (msg.y / SPACE) &&(COLS - 1) == (msg.x / SPACE)){//点击右下角那个点isContinueSet = false;}map[msg.y / SPACE][msg.x / SPACE] = 1;}else{//鼠标左键松开 设置为不存活map[msg.y / SPACE][msg.x / SPACE] = 0;}}
}//绘制整个窗口
void drawMap(int map[ROWS][COLS]){for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){drawRect(j, i, map[i][j]);}}
}void drawRect(int x, int y, int flag){setcolor(RGB(167, 167, 167));//边框是灰色if (flag){//为1  设置存活setfillcolor(WHITE);}else{setfillcolor(BLACK);}fillrectangle(x*SPACE, y*SPACE,x*SPACE + SPACE, y*SPACE + SPACE);
}

总结

提示:这里对文章进行总结:

可以把最初的细胞结构定义为种子,当所有种子细胞按以上规则处理后,可以得到第1代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。上面的生存定律当然可以任意改动,发明出不同的“生命游戏”。

生命游戏【C/C++】相关推荐

  1. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  2. html5 生存游戏,html5版生命游戏

    html5版生命游戏 只有一个.html文件,无任何依赖. 使用canvas 1.[文件] index.html ~ 4KB     下载(206) canvas { background: #eee ...

  3. 康威生命游戏是如何搭建计算机的?

    2020年4月,数学家约翰·康威(John H. Conway)因新冠肺炎去世.大家回顾康威教授平生贡献时,不可避免要提到伟大.深刻的"康威生命游戏"(Conway's Game ...

  4. 生命游戏(Game of Life)描述

    一.生命游戏(Game of Life)描述 生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞.一个细胞在下一 ...

  5. 细胞计算机生命游戏,【图片】【20170108 其它內容】【转】生命游戏【三体吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 有些初始图案最终会得到稳定不变的图形,康威把这些稳定图形叫做"静物"(still life).常见的静物有:方块.小船.面包.蜂巢等( ...

  6. [Leetcode] 第289题 生命游戏

    一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初 ...

  7. 分布与并行计算—生命游戏(Java)

    生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量 ...

  8. [Leedcode][JAVA][第289题][生命游戏]

    [问题描述] 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机.给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞都具 ...

  9. LeetCode 289. 生命游戏(位运算)

    文章目录 1. 题目 2. 解题 2.1 复制数组解法 2.2 原地解法 2.3 位运算 1. 题目 链接:289. 生命游戏 2. 解题 2.1 复制数组解法 很简单,按照题意模拟即可 class ...

  10. Leetcode--289. 生命游戏

    根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初始状态 liv ...

最新文章

  1. 重构与模式:改善代码三部曲中的第三部
  2. django项目学习之QQ登录
  3. 【图像超分辨率】(SPSR)Structure-Preserving SR with Gradient Guidance
  4. lucene索引_在崩溃或断电后测试Lucene的索引耐久性
  5. Dynamics CRM 2015 站点地图公告配置实体显示名称的变更
  6. 95-30-070-java.util-LinkedList
  7. 管理 ciner-volumes
  8. Halcon深度学习超参数
  9. JAVA架构图的设计与画法
  10. 海康硬盘录像机管理员密码初始化方法
  11. 申请license激活F5-LTM步骤
  12. phpmywind 查询结果生成csv文件并下载到本地
  13. IR-61|1895075-34-9|七甲川吲哚类花菁染料near-infrared fluorophore
  14. 客户端在线更新-QT
  15. Python自动化运行合成大西瓜|附小游戏地址
  16. 22KDD : COSTA Covariance-Preserving Feature Augmentation for Graph Contrastive Learning
  17. 简述https的几种加密方式
  18. adb操作提示Read-only file system问题
  19. 单烤FPU怎么操作 单烤FPU多少度可以稳定使用
  20. Juce源码分析(一)Juce的优势

热门文章

  1. linux-系统调用过程
  2. 微信小程序电子签名组件
  3. 儿童护眼灯哪个品牌比较好?适合儿童、青少年的平价护眼灯
  4. 《初识Java 第一章》喵哥原创、欢迎转载
  5. [android] 手机卫士接收打电话广播显示号码归属地
  6. 百度主动推送,百度收录,百度sitemap.xml的标准格式...
  7. m4b格式 android,【资源分享】安卓强大音乐播放器stellio5.5.7(beta)去广告版
  8. 锁锁锁-多线程锁-多进程锁
  9. android手机存储空间猛增,网友实测从安卓升级到鸿蒙2.0:可用内存和机身存储容量都增加了...
  10. 解决 VScode 中 MPE 插件无法渲染各种图的问题