备注:文末有本身用Javascript简单实现的网页版细胞自动机(还挺好玩)javascript
细胞自动机(英语:Cellular automaton),又称格状自动机、元胞自动机,它是由无限个有规律、坚硬的方格组成,每格均处于一种有限状态。每格于t时的态由t-1时的一集有限格(这集叫那格的邻域)的态决定。每一格的“邻居”都是已被固定的。每次演进时,每格均听从同一规矩一齐演进。java
固然这个细胞自动机有一个游戏实现 ------康威生命游戏(英语:Conway's Game of Life)git
生命游戏中,对于任意细胞,规则以下:
每一个细胞有两种状态-存活或死亡,每一个细胞与以自身为中心的周围八格细胞产生互动。(如图,黑色为存活,白色为死亡)github
当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)算法
当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。数组
当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)koa
当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)函数
能够把最初的细胞结构定义为种子,当全部在种子中的细胞同时被以上规则处理后, 能够获得第一代细胞图。按规则继续处理当前的细胞图,能够获得下一代的细胞图,周而复始。spa
有了核心的算法(游戏规则),康威生命就是一个具备生命的自由游戏。你能够在游戏中创造出本身的细胞世界。周而复始。koa2
生命游戏其实并非很复杂,本身实现一个仍是挺好玩的。因此本身就用Vue实现了一个小小的生命游戏
下一步要作什么,生命游戏最重要就是下一步,无论游戏规则是如何,下一步状态是这个游戏发展的动力。
function nextStep(map) { let newMap; //@TODO对newMap进行核心算法的编写 return newMap; }
此函数就是游戏的生命,将游戏规则编写进这个函数,Vue只负责渲染这个newMap
就行了。
因此咱们有如下函数
function nextStep(map) { let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0)); let countAlive = 0; for (let i = 1; i < 51; i++) { for (let j = 1; j < 51; j++) { countAlive = map[i + 1][j] + map[i - 1][j] + map[i][j + 1] + map[i][j - 1] + map[i + 1][j + 1] + map[i + 1][j - 1] + map[i - 1][j + 1] + map[i - 1][j - 1]; if (map[i][j] === 0 && countAlive < 3) { new_map[i][j] = 0; } if (map[i][j] === 1 && 2 <= countAlive && countAlive <= 3) { new_map[i][j] = 1; } if (map[i][j] === 1 && (countAlive > 3 || countAlive < 2)) { new_map[i][j] = 0; } if (map[i][j] == 0 && countAlive === 3) { new_map[i][j] = 1; } countAlive = 0; } } return new_map; }
地图扩展,咱们的Map默认定了一个50*50的二位数组,但是考虑到边界对细胞算法影响,咱们扩展地图,将地图做为52*52的二位数组。这样然这个50*50的二位数组最外面包多一层,看控制边界对细胞算法影响。细胞只在内层50*50数组内繁衍。
let new_map = Array(52).fill(Array(52).fill(0)).map((i) => i.map((j) => 0));
文件导出导入 固然加了扩展功能,保存本身喜欢的细胞自动机成文件。
速度的调整 扩展功能,调整下一步的速度。
戳=>>>>>>>>>>细胞自动机
最新版本的细胞自动机用了koa2进行了重构噢!