Игра жизни Конвея: проверка и подсчет соседей для определения следующего поколения - PullRequest
0 голосов
/ 23 сентября 2019

Проблема, которая возникла у меня, связана с методом «aliveNextTime».Я включил весь код файла класса, чтобы лучше понять, как это настроить.

Метод aliveNextTime должен подсчитывать количество соседей, которые имеет ячейка, учитывать текущий статус ячейки (живой или несуществующий) и использовать правила игры жизни, чтобы определить, является ли ячейка или нетбудет жив в следующем поколении.Новая клетка рождается, если соседствует с тремя клетками, и клетка умирает, если соседствует с 0,1,4,5,6,7 или 8 соседями.

Я пробовал различные методы.Мой разум тост прямо сейчас, я работаю над этим, кажется, навсегда.

Я пытался использовать индивидуальные операторы if, я пытался использовать индивидуальные циклы for и пробовал что-то вроде всего, но я, скорее всего, упускаю простое решение.

Как вы можете сказать, яЯ относительно новичок в программировании на Java.

package assignment04;

import java.util.ArrayList;

public class Cell {
    private boolean alive;
    private int myRow;
    private int myCol;
    private ArrayList<Cell> neighbors;

    public Cell(int row, int col) {
        alive = false;
        myRow = row;
        myCol = col;
        neighbors = new ArrayList<>();
    }

    public void populateNeighbors(Cell[][] cells) {
         int limitHoriz = cells[0].length;
         int limitVert = cells.length;
         // above left
    if(myRow > 0 && myRow < limitVert-1) {
        if(myCol > 0 && myCol < limitHoriz - 1) {
            // ADD 8 cells to neighbors 
            neighbors.add(cells[myRow-1][myCol-1]);
            neighbors.add(cells[myRow-1][myCol]);
            neighbors.add(cells[myRow-1][myCol+1]);
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow][myCol+1]);
            neighbors.add(cells[myRow+1][myCol-1]);
            neighbors.add(cells[myRow+1][myCol]);
            neighbors.add(cells[myRow+1][myCol+1]);
        }
        if(myCol == 0) { // left edge not corner
            // ADD 5 cells to neighbors 
            neighbors.add(cells[myRow+1][myCol]);
            neighbors.add(cells[myRow-1][myCol]);
            neighbors.add(cells[myRow][myCol+1]);
            neighbors.add(cells[myRow-1][myCol+1]);
            neighbors.add(cells[myRow+1][myCol+1]);
        }
        if(myCol == limitHoriz - 1) { // right edge not corner
            // ADD 5 cells to neighbors 
            neighbors.add(cells[myRow-1][myCol]);
            neighbors.add(cells[myRow+1][myCol]);
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow+1][myCol-1]);
            neighbors.add(cells[myRow-1][myCol-1]);
        }
    }
    if(myRow == 0) { 
        if(myCol > 0 && myCol < limitHoriz - 1) { // top edge not corner
            // ADD 5 cells to neighbors 
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow+1][myCol-1]);
            neighbors.add(cells[myRow+1][myCol]);
            neighbors.add(cells[myRow+1][myCol+1]);
            neighbors.add(cells[myRow][myCol+1]);
        }
        if(myCol == 0) { // top left corner
            // ADD 3 cells to neighbors 
            neighbors.add(cells[myRow+1][myCol]);
            neighbors.add(cells[myRow+1][myCol+1]);
            neighbors.add(cells[myRow][myCol+1]);
        }
        if(myCol == limitHoriz - 1) { // top right corner
            // ADD 3 cells to neighbors 
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow+1][myCol-1]);
            neighbors.add(cells[myRow+1][myCol]);
        }
    }
    if(myRow == limitVert-1) { 
        if(myCol > 0 && myCol < limitHoriz - 1) { // bottom edge
            // ADD 5 cells to neighbors 
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow][myCol+1]);
            neighbors.add(cells[myRow-1][myCol+1]);
            neighbors.add(cells[myRow-1][myCol]);
            neighbors.add(cells[myRow-1][myCol-1]);
        }
        if(myCol == 0) { // bottom left corner
            // ADD 3 cells to neighbors
            neighbors.add(cells[myRow-1][myCol]);
            neighbors.add(cells[myRow-1][myCol+1]);
            neighbors.add(cells[myRow][myCol+1]);
        }
        if(myCol == limitHoriz - 1) { // bottom right corner
            // ADD 3 cells to neighbors
            neighbors.add(cells[myRow][myCol-1]);
            neighbors.add(cells[myRow-1][myCol-1]);
            neighbors.add(cells[myRow-1][myCol]);
        }
    }
}

public boolean isAlive() {
    return alive;
}

public void setAlive(boolean alive) {
    this.alive = alive;
}

public boolean aliveNextTime() {
    Boolean[][] currentGen = new Boolean[90][90];
    int count = 0;
    for(int i = myCol-1; i < myCol+1; i++) {
        for(int j = myRow-1; j < myRow+1; j++) {
            if(i != myCol && j != myRow) {
                if(i >= 0 && j >= 0) {
                    if(currentGen[j][i]) {
                        count++;
                    }
                }
            }
        }
    }

    if(count > 1 && count < 4) {
        if(count == 3) {
            setAlive(true);
        }
        return true;
    }else {
        return false;
    }
}
}

Окно отображается с областью ячейки 90x90.Я ожидал, что клетки погибнут и будут созданы новые, но когда я рандомизирую живые клетки и нажимаю «запустить», абсолютно ничего не происходит.Все ячейки остаются неизменными, несмотря на количество соседей.

...