我正在用Java编写Conway的《人生游戏》,并且在我的代码中遇到逻辑错误。如果您不熟悉游戏,请遵循以下基本规则:
生命游戏是在细胞网格中进行的简单模拟。每个单元可以是存活的也可以是死亡的,并且可以与其邻居(水平,垂直或对角线)交互。在每次迭代中,将做出决定以查看活细胞是否仍存活,或死细胞是否存活。算法如下:
如果一个单元还活着:
如果居住的邻居少于两个,它会因孤独而死亡。
如果它有两个或三个活着的邻居,它就可以活到下一代
如果居住的邻居超过三个,则死于人口过多。
如果一个单元已死:
如果它恰好有三个活着的邻居,它会因繁殖而变得活着。
到目前为止,我用于计数死细胞和活细胞的代码如下:
// Go through each dead cell and check all neighboring cells to see if it
// will be revived
// reviveDeadCells()
neighborCount = 0;
for (y = 0; y , 15; y++ ) {
for (x = 0; x < 15; x++) {
if (board[x][y] = 0 ) {
for ( i = x - 1; i = x + 1; i ++ ) {
for (j = y - 1; j = y + 1; j ++) {
if (board[i][j] = 1 ) {
neighborCount = neighborCount + 1;
}
}
if (neighborCount = 4) {
board[i][j] = 1;
}
}
}
}
}
// Go through each live cell and see if it should be executed
// killLiveCell()
for (y = 0; y , 15; y++ ) {
for (x = 0; x < 15; x++) {
if (board[x][y] = 1 ) {
for ( i = x - 1; i = x + 1; i ++ ) {
for (j = y - 1; j = y + 1; j ++) {
if (board[i][j] = 1 ) {
neighborCount = neighborCount + 1;
}
}
if (neighborCount < 3) || (nieghborCount > 4) {
board[x][y] = 0;
}
}
}
我现在意识到该代码的问题是存在逻辑错误。首先,我计算死细胞的所有相邻细胞,然后计算存活的细胞数。然后,如果正好有3个活邻居,我将他们复活。唯一的问题是它现在将影响活动单元中相邻单元的计数器。如何在不影响对方的计数器的情况下,同时改变死者和邻居的活细胞?我有所有代码的感觉,但是我可能不得不将其围绕for循环移动到某个地方。我只是不知道确切地需要在哪里放置它来纠正此错误。任何帮助将不胜感激,谢谢。
最佳答案
与其在某个地方杀死/恢复该单元,不如将要改变状态的单元的坐标存储为新列表中的元组。有很多方法可以做到这一点,但仅举一个例子。
// Create a simple tuple class for the co-ordinates
Class CoordPair(){
int x;
int y;
CoordPair(int x, int y){
this.x = x;
this.y = y;
}
}
// In your code, use Hash Set to prevent having two copies of the Coordinates
HashSet<CoordPair> changeSet = new HashSet<CoordPair>();
...
if (neighborCount = 4) {
CoordPair changePair = new CoordPair(i,j);
changeSet.add(changePair);
}
...
// After identifying all the changing pairs on the board
for(CoordPair pair : changeSet){
board[pair.x][pair.y] ^= 1; //XOR to flip the value
}
关于java - 您如何杀死活细胞并恢复活细胞而不弄乱柜台?康威生命游戏中的逻辑错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53094715/