Что не так с моей (игрой Конвея) жизнью?
Я пытался написать ООП реализацию игры жизни Конвея в процессе обработки. Однако, похоже, это какой-то другой автомат. Интересно, но не то, что я собирался. Я не могу найти никаких проблем с моим кодом, это то, что я надеюсь, вы можете помочь с.
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;
}
В чем дело? Кроме того, любая информация об автомате, который я случайно создал, будет крутой, она создает некоторые красивые узоры.
1 ответ
Давайте посмотрим на этот раздел вашего кода:
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
и вернуть мертвую клетку. Опять же, это, вероятно, не то, что вы хотите сделать. Подобные блоки тихого улова - это рецепт ошибок, которые вы не обнаружите, пока не увидите необъяснимое поведение.
Сделав шаг назад, вам действительно нужно привыкнуть к отладке кода. Вы могли бы разобраться во всем вышеперечисленном, создав меньший пример (скажем, сетку ячеек 3х3) и пройдясь по нему с помощью листа бумаги и карандаша, или отладчика, который поставляется с редактором обработки. Это всегда должно быть первым, что вы делаете.