我的(康威的游戏)生活出了什么问题?
What's wrong with my (Conway's Game Of) life?
我试图在处理中编写康威生命游戏的 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;
}
怎么了?另外,关于我不小心创建的自动机的任何信息都会很酷,它会创建一些漂亮的图案。
让我们看看您的这部分代码:
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
和 return 一个死细胞。同样,这可能不是您想要做的。像这样的静默捕获块是导致错误的秘诀,在您看到无法解释的行为之前,您不会检测到这些错误。
退一步说,你真的需要养成debugging your code的习惯。您可以通过创建一个较小的示例(例如,一个 3x3 的单元格网格)并使用一张纸和一支铅笔或 Processing 编辑器附带的调试器逐步完成上述所有操作。这应该永远是你做的第一件事。
我试图在处理中编写康威生命游戏的 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;
}
怎么了?另外,关于我不小心创建的自动机的任何信息都会很酷,它会创建一些漂亮的图案。
让我们看看您的这部分代码:
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
和 return 一个死细胞。同样,这可能不是您想要做的。像这样的静默捕获块是导致错误的秘诀,在您看到无法解释的行为之前,您不会检测到这些错误。
退一步说,你真的需要养成debugging your code的习惯。您可以通过创建一个较小的示例(例如,一个 3x3 的单元格网格)并使用一张纸和一支铅笔或 Processing 编辑器附带的调试器逐步完成上述所有操作。这应该永远是你做的第一件事。