细胞自动机与数据与表现分离
作者:互联网
细胞自动机的Java实现
一丶
先说说这个题目吧,还是第一次接触这种类型的题目:生命游戏中,对于任意细胞,规则如下:
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。
1.看到这个题目的第一反应是将整个生命环境看作一个矩阵,其中的每一个细胞以二维坐标的形式存在于环境中,那么这个细胞类就有三个属性在生命游戏中的:x坐标,y坐标,生命状态。但是,这样做了以后发现两个问题:
1)环境边界处的细胞生命状态判断实现很难。
2)细胞之间的生命状态无法实现关联关系。
2.之后是将单个细胞单独做一个(BasicUnit类),还是以3*3九宫格的方式判段我们抽象出来的单元细胞的生命状态,再将其放入生命游戏沙盘(LifeGame类)中演变,当然,还是写一个细胞信息类(Cell类)将从BasicUnit类中判断得来的细胞生命状态和在LifeGame类中的坐标两个信息存储起来。
3.到此,整个生命游戏的实现逻辑就构建好了,接下来就是编码实现的事情了。
4.编码过程中遇到很多坑,这里就不多提了,碰到的坑都是为了以后少进坑做贡献。
5.下面讲这三个类代码贴出来(不能直接跑,用了单元测试,测试每个类的逻辑是否实现,要跑的话需要自己写一个run类)
BasicUnit类:
package org.coach.tdd.template; /** * Created by lzy on 17-6-3. */ /** * BasicUnit类判断单元细胞的生命状态。 */ public class BasicUnit { private static final int DEATH = 0; private static final int LIVE = 1; private int[][] testUnit = new int[3][3]; //将一个细胞及其周围相邻细胞看作一个基本单元 private int status = DEATH; public void setTestUnit(int[][] testUnit) { this.testUnit = testUnit; } /** * . * 获得单元细胞生命状态 * * @param basicUnit 该细胞周围细胞生命状态 * @return 该细胞生命状态 */ public int getUnitCelltatus(int[][] basicUnit) { int numberofcell = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (1 == basicUnit[i][j]) { if (1 == i && 1 == j) { } else { numberofcell += 1; } } } } if (3 == numberofcell) { return 1; } else if (2 == numberofcell) { return basicUnit[1][1]; } return 0; } }
标签:状态,生命,int,BasicUnit,分离,细胞,存活,自动机 来源: https://www.cnblogs.com/x3449/p/16407106.html