Как мне сделать эту программу Conways Life в Java - PullRequest
1 голос
/ 04 января 2012

Я делаю программу Conway's Game of Life на Java и пытаюсь изменить ее версию командной строки на GUI.Из командной строки я только что распечатал массив, который показал поколения (такие объекты, как блоки и мигалки, показаны в виде серии из 1 и 0, где он пуст, а в графическом интерфейсе я показываю его в виде квадратов (белые квадраты какпустые и синие квадраты, где это не так.) Но я застреваю, когда я делаю другой метод (который заменяет метод, который печатает массив), который проверяет массив сетки, если есть ноль, то квадрат меняется сот белого к синему и наоборот. Правила жизни Конвея рассматриваются в отдельном классе, который является независимым, и все, что делает этот метод, - это после того, как правила изменили массив, этот метод проверяет его.

Правилавыполняются в методах в одном классе, а компоненты GUI - в другом. Но так как мне нужен экземпляр того и другого, как бы я это сделал ?, объедините два класса (все классы GUI в Life, вставьте их какЯ полностью застрял на том, что делать

public void runGUI() {
    int x = getX(), y = getY();

    x /= squareSize;
    y /= squareSize;
    for (int i = 0; i < LifeData.grid.length; i++) {
        for (int j = 0; j < LifeData.grid[i].length; j++) {
            if (LifeData.grid[i][j] == 0)
                l.setCell(x, y, l.getCell(x, y) + 1);
            else
                l.setCell(x, y, l.getCell(x, y) - 1);
            this.repaint();
        }
    }
}

Это то, что я изменил на нетw, но при компиляции говорится, что «на нестатическую переменную grid нельзя ссылаться из статического контекста» и «на нестатический метод runGUI() нельзя ссылаться из статического контекста».При попытке запустить метод.

1 Ответ

0 голосов
/ 04 января 2012

Создайте отдельный поток, который запустит игру в жизнь и обновит графический интерфейс.

Примерно так

public class GameExecutor implements Runnable {

  private static final int DELAY = 1000;

  private GameOfLife game;
  private boolean stop = false;
  private Gui gui;

  public GameExecutor(Gui gui, GameOfLife game) {
    this.gui = gui;
    this.game = game;
  };

  public void run(){
    game.start();

    while (!stop) {
      game.step(); //execute a step
      gui.update(game.getState());
      try {
        Thread.sleep(DELAY);
      } catch (InterruptedException e) {}
    }
  }

}

Запустите это в ветке при запуске и передайте его своему графическому интерфейсу. Не забудьте обновить графический интерфейс в правильной ветке Swing.

Очевидно, что вам также понадобится добавить код, чтобы остановить его:)

...