我试图在处理过程中编写Conway的生命游戏的OOP实现。然而,它似乎是一些其他类型的自动机。有趣,但不是我想要的。我无法发现我的代码存在任何问题,这是我希望您可以提供的帮助。
class Cell {
int state;
int x;
int y;
Cell update()
{
try {
int neighbors = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
neighbors += currentBoard[x+i][y+j].state;
}
}
if ((state == 1) && (neighbors < 2))return new Cell(x, y, 0);
else if ((state == 1) && (neighbors > 3))return new Cell(x, y, 0);
else if ((state == 0) && (neighbors == 3))return new Cell(x, y, 1);
else return new Cell(x, y, state);
}
catch(ArrayIndexOutOfBoundsException exception) {
return new Cell(x, y, 0);
}
}
Cell( int _x, int _y, int _s)
{
state = _s;
x = _x;
y = _y;
}
}
Cell[][] currentBoard;
Cell[][] newBoard;
void setup() {
fullScreen();
//frameRate(100);
currentBoard = new Cell[width][height];
newBoard = new Cell[width][height];
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
currentBoard[i][j] = new Cell(i, j, int(random(2)));
}
}
}
void draw() {
print(frameCount);
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
try {
newBoard[i][j] = currentBoard[i][j].update();
}
catch(ArrayIndexOutOfBoundsException exception) {
}
}
}
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color setCol = color(255, 0, 0);
if (newBoard[i][j].state == 1)
{
setCol = color(0, 0, 0);
} else if (newBoard[i][j].state == 0)
{
setCol = color(255, 255, 255);
}
set(i, j, setCol);
}
}
currentBoard = newBoard;
}
出了什么问题?此外,我意外创建的自动机的任何信息都很酷,它会产生一些漂亮的图案。
答案 0 :(得分:3)
让我们看一下代码的这一部分:
try {
int neighbors = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
neighbors += currentBoard[x+i][y+j].state;
}
}
if ((state == 1) && (neighbors < 2))return new Cell(x, y, 0);
else if ((state == 1) && (neighbors > 3))return new Cell(x, y, 0);
else if ((state == 0) && (neighbors == 3))return new Cell(x, y, 1);
else return new Cell(x, y, state);
}
catch(ArrayIndexOutOfBoundsException exception) {
return new Cell(x, y, 0);
}
这里有一些看似错误的事情。首先,当i
和j
都是0
时会发生什么?您将计算每个单元格作为其自己的邻居,这是不正确的。
其次,如果你处于边缘,会发生什么?你将遇到一个ArrayIndexOutOfBoundsException
,并返回一个死细胞。同样,这可能不是你想要做的。像这样的无声捕获块是一个错误的配方,除非你看到无法解释的行为,否则你无法检测到这些错误。
退一步,你真的需要养成debugging your code的习惯。您可以通过创建一个较小的示例(例如,一个3x3的单元格网格)并使用一张纸和一支铅笔,或者处理编辑器附带的调试器来逐步完成上述所有操作。这应该是你做的第一件事。