调试生活游戏,Java
我正试图复制这个模型,但我有一个bug。细胞是按照设计出生的,但不会死亡。这让我很困惑,因为我杀死细胞的策略和生下细胞的策略是一样的。这是控制台输出的一段,“x”代表活细胞,“-”代表死细胞调试生活游戏,Java,java,eclipse,debugging,logic,conways-game-of-life,Java,Eclipse,Debugging,Logic,Conways Game Of Life,我正试图复制这个模型,但我有一个bug。细胞是按照设计出生的,但不会死亡。这让我很困惑,因为我杀死细胞的策略和生下细胞的策略是一样的。这是控制台输出的一段,“x”代表活细胞,“-”代表死细胞 --------- --------- --------- ---xx---- ----x---- ----x---- ----xx--- --------- --------- --------- --------- --------- ---xx---- ----xx--- ---xx---- ---
---------
---------
---------
---xx----
----x----
----x----
----xx---
---------
---------
---------
---------
---------
---xx----
----xx---
---xx----
----xx---
---------
---------
---------
---------
---------
---xxx---
----xx---
---xx----
---xxx---
---------
---------
以及相关的代码:
public class Life {
final static int WIDTH = 9, HEIGHT = 9;
void start(){
// scanning input file
char[][][] board = new char[WIDTH][HEIGHT][maxAllowedGenerations];
board = getInitialBoard(initialBoardString, maxAllowedGenerations, board);
for (int generation = 1; generation < maxAllowedGenerations; generation++){
for (int y = 0; y < HEIGHT; y++)
for (int x = 0; x < WIDTH; x++){
int numberOfNeighbours = getNumberOfNeighbours(x, y, generation - 1 , board);
if (board[x][y][generation - 1] == '-' && numberOfNeighbours == 3)
board[x][y][generation] = 'x';
else if (board[x][y][generation - 1] == 'x' && numberOfNeighbours < 2)
board[x][y][generation] = '-';
else board[x][y][generation] = board[x][y][generation - 1];
if (board[x][y][generation] == 'x')
ui.place(x, y, LifeUserInterface.ALIVE);
else
ui.place(x, y, LifeUserInterface.DEAD);
out.print(board[x][y][generation]);
}
out.println();
}
}
out.println("Max number of generations reached");
System.exit(0);
}
公共阶级生活{
最终静态整型宽度=9,高度=9;
void start(){
//扫描输入文件
char[][]board=新字符[WIDTH][HEIGHT][maxallowedgegenerations];
board=getInitialBoard(initialBoardString,MaxAllowGenerations,board);
对于(int generation=1;generation
我同意@elyashiv-如果你将char[][][]]board
更改为SomeEnum[][]]board
,使用SomeEnum
定义值LIVE_CELL
和DEAD_CELL
,这将使事情更具可读性
此外,不存在空字符“”。空的字符串
只是长度为零(即没有字符)的字符串,但“”没有任何意义。您可以使用null
,但是您必须离开原语char
声明,而使用Character
,因为原语不能null
也就是说,使用枚举表示数据要好得多。如果需要,您甚至可以将枚举设置为如下所示,以便表示X和空字符,如下所示:
public enum SomeEnum {
LIVE_CELL("X"),
DEAD_CELL("");
public final displayString;
SomeEnum(String displayString) {
this.displayString = displayString;
}
}
然后,对于您的显示,您可以在代码中引用SomeEnum.LIVE\u CELL.displayString
,发现两个bug!其中一个是你无法发现的,因为我没有发布包含它的代码:我是[x][y][g]的一个手机。我曾考虑将[x][y][g-1]作为邻居,但那当然是我!我不是自己的邻居
另一个bug实际上有点尴尬。我遗漏了第2条规则…>
我也意识到我应该发布生活游戏的规则,而不是假设你们都知道它们或者你们会费心去研究它们。现在当然有点晚了,不过如果你有兴趣的话,我还是会把它们发出去的。另外,我真的为所有对自组织感兴趣的人推荐了这个方法
规则:
有<2个活邻居的活细胞死亡,就好像是因为孤独
有超过3个活邻居的活细胞死亡,就好像是由于人口过剩李>
有2 | | 3个活邻居的活细胞存活到下一代
死亡的细胞与3个活的邻居一起复活,就像通过繁殖一样
谢谢大家的意见 你应该使用-这将增加代码的可读性。你所说的“细胞死亡不会被存储到下一代”是什么意思?你能把范围缩小到你认为问题所在的代码部分吗?问题会根据要求进行修改。请不要破坏你自己的问题。如果要删除问题,请将其删除,否则请将其保持在可读/可理解的状态。我同意使用enum将使我的代码更具可读性,并且在任何意义上都优于enum。但是如果我理解正确,无论我使用char还是enum,程序的功能都无关紧要。对吗?你的意思是问题是我用了空字符。我没有,它们是空间。是['',不是[''。抱歉,我看错了你原来的问题。你能公布你的具体错误吗?我想我们大多数人都知道。。。我的意思是,谁没有把生命的游戏编码好?谁能抗拒?:)