for (int i = 0; i < cells.length; i++) { 对数组中的每个细胞 ...... int left = cell[i-1]; 获取邻人的状态 int middle = cell; int right = cell[i+1]; int newstate = rules(left,middle,right); 根据先前设定的规则查询新的状态 cell = newstate; 把细胞的状态设为新值}3、怎样处理处罚没有左右邻人的界限细胞?
为了让代码尽可能地易读易明确,我们采取第一种方案:直接略过界限细胞,让它们的状态保持常量。这种方案的实现很简朴,只须要让循环从下标1开始,并提前一个元素竣事:
for (int i = 1; i < cells.length-1; i++) { 忽略第一个和最后一个细胞 int left = cell[i-1]; int middle = cell; int right = cell[i+1]; int newstate = rules(left,middle,right); cell = newstate;}4、使用两个数组
上面代码看起来并没有错误:一旦我们得到新状态,确实须要将它赋给当前细胞。但在下一次迭代中,你会发现一个严峻的毛病。会覆盖当前代的状态。
这个标题标办理方案是:使用两个数组,一个数组用于生存当前代的状态,另一个数组用于生存下一代的状态。
int [] newcells = new int[cells.length]; 用另一个数组生存下一代状态for (int i = 1; i < cells.length-1; i++) { int left = cell[i-1]; 从当前数组获取细胞状态 int middle = cell; int right = cell[i+1]; int newstate = rules(left,middle,right); newcells = newstate; 在新数组中生存新状态}处理处罚完数组的每个元素后,我们就可以抛弃旧的数组,让它的值便是新数组。
cells = newcells; 新一代状态变成了当前代状态
5、rules()函数
int rules (int a, int b, int c) { if (a==1 && b == 1 && c == 1) return ruleset[0]; else if (a == 1 && b == 1 && c == 0) return ruleset[1]; else if (a == 1 && b == 0 && c == 1) return ruleset[2]; else if (a == 1 && b == 0 && c == 0) return ruleset[3]; else if (a == 0 && b == 1 && c == 1) return ruleset[4]; else if (a == 0 && b == 1 && c == 0) return ruleset[5]; else if (a == 0 && b == 0 && c == 1) return ruleset[6]; else if (a == 0 && b == 0 && c == 0) return ruleset[7]; return 0; 为了让函数的定义正当,必须加上这个返回值,固然我们知道不可能出现不符合这8种情况}
另一种办理方案有点难以明确,就是把邻人状态的组合(3位二进制数)转换成一个寻常整数,并把该值作为规则数组的下标。实现方式如下:
int rules (int a, int b, int c) { String s = "" + a + b + c; 将3位转化为字符串 int index = Integer.parseInt(s,2); 第二个参数“2”告诉parseInt()函数要把s当成二进制数 return ruleset[index];}7、CA类
class CA { int[] cells; 我们须要两个数组,一个用来存放细胞,另一个用来存放规则 int[] ruleset; CA() { cells = new int[width]; ruleset = {0,1,0,1,1,0,1,0}; 随意选取规则90 for (int i = 0; i < cells.length; i++) { cells = 0; } cells[cells.length/2] = 1; 除了中央的细胞以状态1开始,别的所有细胞都从状态0开始 } void generate() { int[] nextgen = new int[cells.length]; 计算下一代状态 for (int i = 1; i < cells.length-1; i++) { int left = cells[i-1]; int me = cells; int right = cells[i+1]; nextgen = rules(left, me, right); } cells = nextgen; } int rules (int a, int b, int c) { 在规则会集查询新状态 String s = "" + a + b + c; int index = Integer.parseInt(s,2); return ruleset[index]; }}