生物细胞繁衍介绍

康威生命游戏,又称康威生命棋,是英国数学家约翰•何顿•康威在1970年发明的细胞自动机。 它最初于1970年10月在《科学美国人》杂志上马丁•葛登能的“数学游戏”专栏出现。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。对于生成的形状和秩序我们称作 pattern。或者在这里,我们也把它称作 creature。“生命游戏”并不是通常意义上的游戏,它没有游戏玩家之间的竞争,也谈不上输赢,甚至可以说游戏的一开始就注定了结果。
开发生命游戏,让“仿真生物”生存于计算机上,在计算机上生存、死亡,从而模拟生命的演化,通过计算机的模拟,了解生命在一定规则下,开始条件对最终结果的影响,突发事件对最终结果的影响。

本游戏是小组共同开发的课程设计项目,实现了基础的康威生命游戏规则,能够模拟生命繁殖演化的基本过程,实现了必要的图形界面。

生物细胞繁衍生存模拟仿真实现

制作用户图形界面,使得游戏在运行时,用户能在图形界面上进行操作和直观的看到演化过程与结果。
按钮,重新开始、大小、剩余生命、进化次数,用来控制繁衍进程。
用户界面的要求:一个N*N的二维格子界面和对应重新开始、大小、剩余生命、进化次数,每一个格子代表一个生命,亮为生、暗为死,每一次格子的生与死都显示在屏幕上。
一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。用代码实现生命游戏中的规则,通过算法控制,计算格子在每一刻的生死状态。
在一个二维矩形世界中,每个方格里居住着一个活着的或死了的细胞,每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量,模拟生命繁衍。

细胞过少:当周围低于2个(不包含2个)存活细胞时, 本单元活细胞死亡
稳定:当周围有3个或4个存活细胞时, 本单元细胞保持原样
细胞过剩:当周围有4个以上的存活细胞时,本单元活细胞死亡
繁殖:当周围有3个存活细胞时,本单元细胞存活/活化

HTML用到的背景图片

HTML代码

<!DOCTYPE html>
<html><head><title>细胞生命</title><meta charset='utf-8'><script  type="text/javascript" src="细胞生命.js"></script></head><body background="细胞生命.jpeg"><center><h2>细胞生命仿真模拟</h2><canvas id="canvas" width="602" height="602"></canvas><script  type="text/javascript" src="fabric.min.js"></script><div style="margin:20px 50px 20px;padding-bottom:10px;border-bottom:1px solid #c1c1c1;text-align:center;width:502px"><input type="button" value="重新开始" style="width:70px;" onclick="javascript:restartLifeGame()">大小:<input type="text" value="50" id="lifeSize" style="width:50px;margin-right:20px;">剩余生命:<span id="remainLifes" style="display:inline-block;width:50px;">0</span>进化次数:<span id="period" style="display:inline-block;width:40px;">0</span></div></center><script>var life;var lifeTimer = 0;var canvas = new fabric.Canvas('canvas');canvas.renderOnAddRemove = false;var lifes = [];restartLifeGame();function initLifeGame(){var rect = new fabric.Rect({top : 0,left : 0,width : 600,height : 600,fill : 'white',selectable: false, strokeWidth: 1,stroke: '#C1C1C1'});canvas.add(rect);canvas.renderAll();}function restartLifeGame(){var size = parseInt(document.getElementById('lifeSize').value);if (isNaN(size) || size <= 0) {alert('请输入正确数值');return;}if (lifeTimer != 0)clearInterval(lifeTimer);canvas.clear();initLifeGame();beginLife(size, size);}function beginLife(row,col){life = new LifeGame(row,col);life.initRandom(20);var width  = 600/life.col;var height = 600/life.row;for(var i=0;i<life.row;i++) {lifes[i] = [];for(var j=0;j<life.col;j++) {lifes[i][j] = new fabric.Rect({top:    i*height,left:   j*width,width:  width,height: height,fill:   'black',selectable: false,stroke: 'rgba(100,200,200,0.5)',strokeWidth: 1,visible:    false});canvas.add(lifes[i][j]);}}refreshLife(); lifeTimer = setInterval(refreshLife, 300);}function refreshLife(){drawLife();document.getElementById('remainLifes').innerText = life.remainLifes;document.getElementById('period').innerText = life.period;life.nextAround();}function drawLife(){for(var i=0;i<life.row;i++) {for(var j=0;j<life.col;j++) {if (life.isAlive(i,j))  {lifes[i][j].visible = true;} else {lifes[i][j].visible = false;}}}canvas.renderAll();}function pauseLife(){clearInterval(lifeTimer);}</script>
</body>
</html>

js代码

function LifeGame(row, col) {this.row = row;this.col = col;this.grid = [];this.remainLifes = 0;this.nextRemainLifes = 0;this.period = 1;
}//随机初始化生命,按百分比随机生成生命数量
LifeGame.prototype.initRandom = function(percent) {this.remainLifes = 0;this.period = 1;for(var i=0;i<this.row;i++) {this.grid[i] = [];for(var j=0;j<this.col;j++) {if (Math.random() * 100 <= percent) {this.grid[i][j] = {'state':1, 'nextState':1};this.remainLifes++;this.nextRemainLifes = this.remainLifes;} else {this.grid[i][j] = {'state':0, 'nextState':0};}}}
};//计算某个生命的邻居生存个数
LifeGame.prototype.aliveCountAround = function(x,y) {return this.grid[this.mapX(x-1)][this.mapY(y-1)].state + this.grid[this.mapX(x-1)][y].state + this.grid[this.mapX(x-1)][this.mapY(y+1)].state + this.grid[x][this.mapY(y-1)].state + this.grid[x][this.mapY(y+1)].state + this.grid[this.mapX(x+1)][this.mapY(y-1)].state + this.grid[this.mapX(x+1)][y].state + this.grid[this.mapX(x+1)][this.mapY(y+1)].state;
};//左右边界的映射,超出左边界则认为是右边界关联,如-1会映射为是最右侧,这样会让游戏的宽度是无限延展的
LifeGame.prototype.mapX = function(x) {return (x >= this.row || x < 0 ) ? (x%this.row + this.row) % this.row : x;
};//上下边界的映射,参见mapX
LifeGame.prototype.mapY = function(y) {return (y >= this.col || y < 0 ) ? (y%this.col + this.col) % this.col: y;
};//计算某个生命的下一回合的生存状态
LifeGame.prototype.nextState = function(x,y) {var aliveCountAround = this.aliveCountAround(x,y);if (aliveCountAround >= 4) {return 0;} else if(aliveCountAround === 3) {return 1;} else if(aliveCountAround >= 2) {return this.grid[x][y].nextState;} else {return 0;}
};//计算所有生命的下一回合的生存状态
LifeGame.prototype.calcNextState = function() {this.nextRemainLifes = 0;for(var i=0;i<this.row;i++) {for(var j=0;j<this.col;j++) {this.grid[i][j].nextState = this.nextState(i, j);if (this.grid[i][j].nextState === 1) {this.nextRemainLifes++;}}}
};//转换到下一回合的生存状态
LifeGame.prototype.changeNextState = function() {for(var i=0;i<this.row;i++) {for(var j=0;j<this.col;j++) {this.grid[i][j].state = this.grid[i][j].nextState;}}this.remainLifes = this.nextRemainLifes;this.period++;
};//下一回合
LifeGame.prototype.nextAround = function() {this.calcNextState();this.changeNextState();
};//某个生命是否存活
LifeGame.prototype.isAlive = function(x,y) {return this.grid[x][y].state === 1;
};

结果实现

生物细胞繁衍生存模拟仿真相关推荐

  1. 生物细胞繁衍生存模拟仿真实验

    生物细胞繁衍生存模拟仿真实验 原定题目给的以5为界,我们为方便算法实现依据的是简单生命游戏,对于其周围数目以3为界 约束条件 (1)如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡: (2 ...

  2. 【元胞自动机】元胞自动机交通流模拟仿真【含Matlab源码 1252期】

    ⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...

  3. SolidWorks 动画模拟仿真

    SolidWorks 动画模拟仿真 动画是一种传递设计思想,记录仿真的良好的载体,它的特点就是形象和直观.在某些场合下,例如产品的内部结构非常复杂,仅仅依靠文字或者叙述往往不易讲解清楚,而使用动画就能 ...

  4. 程序模拟抽奖流程图_一道与联欢会相关的概率统计题目的模拟仿真

    继续昨天的问题,回顾一下相应的规则. 1. 同学按座位号依次进行抽签: 2. 抽签过程中抽到的同学不能为之前已经抽到的同学: 3. 按照昨天的规则,为了计算简便,可以抽到自己. 那么根据昨天的分析,我 ...

  5. 【基于MATLAB的火灾疏散模拟仿真】——安全隐患提前发现,疏散方案优化

    [基于MATLAB的火灾疏散模拟仿真]--安全隐患提前发现,疏散方案优化 随着城市化进程的不断加速,人口密度越来越大,特别是在高层建筑中.万一发生火灾,往往会对人的生命和财产造成严重损失.因此,火灾疏 ...

  6. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】

    一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...

  7. Ardupilot固件之Flightgear模拟仿真

    Ardupilot固件之Flightgear模拟仿真 一直想做gazebo的无人机仿真,截至目前,ardupilot的gazebo总是跑不出来,偶然看到了Flightgear,装了下感觉还可以. 首先 ...

  8. comsol 超声声场模拟_基于COMSOL的声悬浮声场模拟仿真

    龙源期刊网 http://www.qikan.com.cn 基于 COMSOL 的声悬浮声场模拟仿真 作者:黄健宇 来源:<中国科技纵横> 2019 年第 03 期 摘 要:本文大致介绍了 ...

  9. 网络作战训练模拟仿真管理系统软件

    网络作战训练模拟仿真管理系统软件 战术对抗训练系统主要由"想定编辑分系统"."辅助决策分系统"."方案推演分系统"."自主对抗分系 ...

  10. 【Python与数学建模】蒙特卡洛模拟仿真(附完整详细代码)

    [Python与数学建模]蒙特卡洛模拟&仿真 零.前言 引例:投针实验 试验描述: 试验分析: 代码实现 蒙特卡洛模拟&仿真的基本介绍 应用实例 实例一.三门问题 问题描述 问题分析与 ...

最新文章

  1. Control~Kalman filter
  2. 精通Server Core系列之二 ---Server Core安装与基本配置
  3. linux下var权限是什么?,linux – 在/ var / www中处理Apache 2用户www-data权限的最佳方法是什么?...
  4. vue -- 动态加载组件 (tap 栏效果)
  5. 7.4.1 矩阵低秩近似、矩阵范数
  6. 2016年广东省电子设计大赛健康电子专题——健康养殖远程监控系统(环境监控系统V1.0版本)
  7. drool 7.x 属性 : lock-on-active
  8. 桌面整理工具不显示文件夹_Win10桌面图标显示不正常变成了白色
  9. 毕业从事汽车行业,转行测试工程师,3个月完成了蜕变,我很满意...
  10. 文档级关系抽取方法,EMNLP 2020 paper
  11. django chart mysql,docker Django+mysql+ECharts+AngularJS简单搭建数据可视化
  12. Intel BIGDL 探索
  13. 联想电脑linux显卡驱动,哪里下载独立显卡驱动 急急急!!联想y470如何在linux下安装显卡驱动啊?你好...
  14. 知乎App加密流量分析初探
  15. 你不可不知的Java引用类型之——SoftReference源码详解
  16. ERROR: Error in Log_event::read_log_event(): ‘Sanity check failed‘, data_len: 67, event_type: 35
  17. HBase命令行基本操作
  18. sphinx全文检索之PHP使用教程
  19. AdaptivePose: 人体姿态估计新思路,将人体部位表示为自适应点
  20. ps怎样给图片加logo

热门文章

  1. mysql文件上传漏洞_文件上传漏洞
  2. 2021年广东省安全员A证第三批(主要负责人)及广东省安全员A证第三批(主要负责人)证考试
  3. 云编程那些事4 - 不造巴比伦塔
  4. 三维空间刚体变换:欧拉角、旋转向量、四元数
  5. 安装pip的三种方法
  6. 全球四大会计师事务所
  7. 密码学基础(数学理论)
  8. 【python算法】算法之线性增长与二次方增长小实验举例
  9. [51nod1457]小K vs. 竹子
  10. 苹果CMS自动定时采集教程