我有一个任务,用Java编写生活游戏。如果您不熟悉游戏规则,请遵循以下规则: https://sv.wikipedia.org/wiki/Game_of_Life。我正在遵循老师给我们的伪代码指南。我在最后一步,必须编写杀死并产生新生命细胞的实际算法。
我觉得我所做的一切都正确,但是它无法正常工作,而且由于找不到任何错误,我也不知道应该如何进行。我使用的是2D布尔数组,在计算板的新状态时会更新一次。计算邻居的方法和其他使用的方法正确运行。
public class Life {
LifeBoard brade, next;
Life(LifeBoard board) {
this.brade = board; //the actual board
this.next = brade; //copy of the board to use temporarily
for (int a = 0; a < brade.length(); a++) { // Make all values false just to be shure)
for (int b = 0; b < brade.length(); b++) {
next.put(a, b, false);
}
}
}
void newGeneration() {
for (int a = 0; a < brade.length(); a++) {
for (int b = 0; b < brade.length(); b++) {
int grannar=brade.getGrannar(a, b);
if(brade.get(a, b)) { //check is cell is alive
if(grannar>=4) {
next.put(a, b, false); //kills if neighbours >= 4
} else {
if(grannar<=1) {
next.put(a, b, false); //kills if neighbours <= 1
} else {
next.put(a, b, true); //lets live
}
}
} else { //if cell is dead
if(grannar==3) {
next.put(a, b, true); //spawns if neighbours is 3
} else {
next.put(a, b, false); //keeps it dead
}
}
}
}
brade = next; //updates the array
brade.increaseGeneration();
}
答案 0 :(得分:0)
您可能要创建对象的实际副本。 Brad,board和next都指向同一参考。
this.brade = board; //the acctual board
this.next = brade; //copy of the board to use temporarly
编辑:
您说过将boardState存储在2d布尔数组中。让我们假设它的调用板,并且LifeBoard类具有一个名为getBoard()的方法。
为next创建一个新的对象实例,并对该布尔数组进行深拷贝。例如,使用System.arraycopy(),但这只会处理一维数组,因此您需要遍历“外部”数组。
Ps .: 如果布尔数组的维数不同,则当前代码也不起作用。在这种情况下,请调整您的for循环。