其他分享
首页 > 其他分享> > 细胞自动机与数据与表现分离

细胞自动机与数据与表现分离

作者:互联网

  细胞自动机的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