生命游戏算法无法正常运行

时间:2019-05-19 16:46:19

标签: java

我有一个任务,用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();
}

1 个答案:

答案 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循环。