1

我正在用 java 制作康威的生命游戏程序,并试图将其从命令行版本更改为 GUI。从命令行我刚刚打印了一个显示世代的数组(块和闪烁器等对象显示为一系列 1 和 0,其中它是空白的,在 GUI 中我将它显示为正方形(白色正方形作为空白和蓝色方块,它不是)。但是我遇到困难的地方是当我制作另一种方法(它替换打印数组的方法)检查​​网格数组时,如果有一个零,那么正方形从白色到蓝色,反之亦然。康威的生活规则在一个独立的类中处理,这个方法所做的只是在规则改变了数组之后,这个方法检查它。

规则在一个类的方法中完成,而 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();
        }
    }
}

这就是我现在将其更改为的内容,但是在编译时它说“grid不能从静态上下文引用非静态变量”和“不能从静态上下文引用非静态方法runGUI()”。尝试运行该方法时。

4

1 回答 1

0

创建一个单独的线程来执行生命游戏并更新 GUI。

像这样的东西

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) {}
    }
  }

}

在启动时在线程中启动它并将其传递给您的 gui。不要忘记在正确的 Swing 线程中更新 gui。

显然,您也需要添加一些代码来阻止它:)

于 2012-01-04T16:46:45.657 回答