我正在用Java制作一个Conway的生命游戏程序,我正在尝试将它从命令行版本更改为GUI。从命令行我刚刚打印出一个显示代数的数组(块和闪烁的对象显示为一系列的1和0是空白的,在GUI中我将它显示为正方形(白色方块为它不是空白和蓝色方块。但我陷入困境的是当我制作另一个方法(它取代了打印数组的方法)来检查网格数组时,如果有零则则方形从Conway的Life规则在一个独立的类中处理,并且所有这个方法都是在规则改变了这个方法检查它的数组之后。
白色到蓝色,反之亦然。规则在一个类中的方法中完成,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()
无法引用来自静态背景“。尝试运行该方法时。
答案 0 :(得分: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。
显然你还需要添加一些代码来阻止它:)