我正在尝试基于“生命游戏”模拟概念来编写源代码。我所做的是创建一个表示游戏环境状态的类,但将后继函数的逻辑分离到另一个类中。游戏的状态保存在一个简单的多维布尔数组中。
后继函数应该做的是将当前状态保存在新数组中作为原始克隆,并在整个过程中将其作为基础。然后,它将游戏的当前状态作为参考,并使用游戏逻辑对其进行修改。我的问题是我将原始文件克隆到一个新变量中,但即使是这个克隆也会被后继函数修改。
我不太确定发生了什么,所以我无法正常调试。我更习惯于C#对原始类型克隆的处理。
这是我的后继函数包装类的代码:
公共类继承人{
boolean[][] current_state;
public void next(WorldPopulation worldState){
int dim_x = worldState.get_width();
int dim_y = worldState.get_height();
boolean[][] nextstate = worldState.get_state();
current_state = worldState.get_state().clone();
for(int i=0; i<dim_y; i++){
for(int j=0; j<dim_x; j++){
int neighbors = 0;
neighbors = countThyNeighbors(i, j);
if((neighbors>3 || neighbors<3) && current_state[i][j]){
nextstate[i][j] = false;
} else if(!current_state[i][j] && neighbors>=3) { nextstate[i][j] = true; }
}
}
}
private int countThyNeighbors(int y, int x) {
int[] grid_x = { x-1, x, x+1, x-1, x+1, x-1, x, x+1};
int[] grid_y = { y-1, y-1, y-1, y, y, y+1, y+1, y+1};
int neighbors = 0;
for(int i=0; i<8; i++){
try{
if(current_state[grid_y[i]][grid_x[i]])
neighbors++;
} catch(Exception e) { continue;}
}
return neighbors;
}
}
WorldPopulation类中的get()和set()函数仅仅是赋值和返回操作。
我从C#背景中了解了克隆(深度和浅层克隆)的细微差别,但我在Java范例中是全新的。
非常感谢任何改进我的代码的建议,但我想知道发生了什么以及我做错了什么。非常感谢你! :d