Основной класс в Game Of Life не работает

Я пытался решить проблему Игры жизни для учителя. Правила этой игры:

Любая живая клетка с менее чем двумя живыми соседями умирает, как если бы она была вызвана недостаточным населением. Любая живая клетка с двумя или тремя живыми соседями переходит к следующему поколению. Любая живая клетка с более чем тремя живыми соседями умирает, как будто из-за переполненности. Любая мертвая клетка с ровно тремя живыми соседями становится живой клеткой, как будто путем размножения.

С моим кодом есть две проблемы - во-первых, мой основной класс, похоже, не работает. Во-вторых, я выполнил задачу с помощью многих, если еще утверждений. Существуют ли более краткие способы написания исключений для моего метода getNeighbors()?

Спасибо!

import java.util.Random;

public class GameOfLife {
final static int ROWS = 6;
final static int COLUMNS = 7;
String[][] simulator;
private Random randomGenerator;

public GameOfLife() {
    simulator = new String[ROWS][COLUMNS];
    randomGenerator = new Random();
}

public void fillSpot (int row, int column) {
    simulator [row][column] = "O";
} 
private void deleteSpot (int row, int column) {
    simulator[row][column] = "";
}
// Do I need the above methods? really?
public void randomSimulation() {
    for (int i = 0; i <= ROWS; i++) {
        for (int j = 0; j <= COLUMNS; j++) {
            int random = randomGenerator.nextInt(1);
            if (random == 1) {
                fillSpot(i,j);
            }
        }
    }
}

private void getNeighbors (int row, int column) {
    int neighbors = 0;
    if (row < ROWS && row > 0 && column < COLUMNS && column > 0) {
        for (int i = row - 1; i <= row + 1; i++) {
            for (int j = column - 1; j <= column + 1; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }

    if (row > ROWS || column > COLUMNS || row < 0 || column < 0) {
    }

    else if (row == ROWS && column < COLUMNS && column != 0) {
        for (int i = row - 1; i <= ROWS; i++) {
            for (int j = column - 1; j <= column + 1; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    else if (row < ROWS && column == COLUMNS && row != 0) {
        for (int i = row - 1; i <= row + 1; i++) {
            for (int j = column - 1; j <= COLUMNS; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    else if (row == 0 && column < COLUMNS && column != 0) {
        for (int i = 0; i <= row + 1; i++) {
            for (int j = column - 1; j <= COLUMNS + 1; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    else if (row == 0 && column == COLUMNS) {
        for (int i = row; i <= row + 1; i++) {
            for (int j = column - 1; j <=COLUMNS; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    else if (column == 0 && row < ROWS && row != 0) {
        for (int i = row - 1; i <= row + 1; i++) {
            for (int j = column; j <= COLUMNS + 1; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    else { 
        for (int i = row; i <= row + 1; i++) {
            for (int j = column; j <= column + 1; j++) {
                String temp = simulator[i][j];
                if (temp.contains("O")) {
                    neighbors++;
                }
            }
        }
    }
    // for row == 0 && column == 0
    if (simulator [row][column].contains("O")) {
        neighbors--;
    }
    simulator[row][column] += " " + neighbors;
}
//There are wayyy too manyy clauses here for me to be comfortable. There's got to be    a way to do this cleaner

private void nextGenPlanning() {
    for (int i = 0; i <= ROWS; i++) {
        for (int j = 0; j <= COLUMNS; j++) {
            getNeighbors(i,j);
        }
    }
}

private void nextGen() {
    nextGenPlanning();
    for (int i = 0; i <= ROWS; i++) {
        for (int j = 0; j <= COLUMNS; j++) {
            String temp = simulator[i][j];
            if (temp.charAt(temp.length()) <= 1 ||  temp.charAt(temp.length()) >= 4) {
                deleteSpot(i,j);
            }
            else {
                fillSpot (i,j);
            }
        }
    }
}

public String toString() {
    String string = "";
    for (int i = 0; i < ROWS; i++) {
        string = string + "|";
        for (int j = 0; j < COLUMNS; j++) {
            String temp = simulator[i][j];
            string = string + temp.charAt(0);
        }
        string = string + "|\n";
    }
    return string;
}

public String simulate (int numOfTrials) {
    String string = "";
    for (int i = 0; i <= numOfTrials; i++) {
        nextGen();
        string += toString();
    }
    return string;
}

public void main (String [] args) {
    randomSimulation();
    System.out.println(simulate(2));
}   
}

2 ответа

Во-первых, у вас есть:

public void main (String [] args) {
    randomSimulation();
    System.out.println(simulate(2));
}   

У тебя должно быть:

public static void main (String[] args) {
    GameOfLife game = new GameOfLife();
    game.randomSimulation();
    System.out.println(game.simulate(2));
}   

Во-вторых, для getNeighbors, сначала учтите, что метод 'get' обычно возвращает значение. Если вы считаете количество соседей, подумайте:

public int getNeighbors(int x, int y) {
  int neighbors = 0;
  int leftX = Math.max(x-1, 0); 
  int rightX = Math.min(x+1, COLUMNS); 
  int topY = Math.max(y-1, 0); 
  int bottomY = Math.min(y+1, ROWS); 

  for (int i=leftX; i < rightX; i++) {
    for (int j=topY; j < bottomY; j++) {
      if (simulator[i][j].contains('O')) { // Notice I'm using a char here, see my next comment
        neighbors++;
      }
     }
   }

   return neighbors;
}

В-третьих, я рекомендую использовать char[][] вместо String[][] для вашего симулятора, если каждый пробел в симуляторе содержит только одно символьное значение. В Java есть некоторые вещи, с которыми вам не нужно споткнуться - например, в Java вы не можете сравнить значение Strings с помощью == (вам нужно использовать String equals() метод).

Во-первых, ваш основной класс должен быть Public static void main(String[] args) и вы можете использовать регистр переключателя, кроме if else, если вы действительно уверены в том, что если вы еще можете использовать if ( blabla == blablabla &(это означает и) blaba == babalaba)

Другие вопросы по тегам