我不知道为什么我的生命游戏的代码不起作用。谁能帮我?

时间:2017-04-07 19:15:46

标签: java conways-game-of-life

问题是,当我启动游戏时,游戏有点运作,但它的表现不像正常的游戏生活游戏。所以我认为检查邻居的逻辑部分不能正常工作。经过长时间的调试,我仍然无法找到错误。 :)

import java.awt.*;

import javax.swing.*;

public class GUI extends JPanel {

private Field field;
private JFrame frame;

public GUI() {
    int width = 800, height = 800;
    frame = new JFrame();
    frame.setSize(width, height);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.add(this);
    field = new Field(this);
}

public static void main(String[] args) {
    new GUI();

}

public void paint(Graphics g) {
    super.paint(g);
    int j = 0;

    for (int i = 0; i < 400; i++) {
        j = 0;
        for (j = 0; j < 400; j++) {
            if (field.getAlive(i, j)) {

                g.drawRect(2 * j, 2 * i, 2, 2);
                g.fillRect(2 * j, 2 * i, 2, 2);
            }
        }

    }
    check();

}

public void check() {
    int j = 0;
    for (int i = 1; i < 399; i++) {
        j = 0;
        for (j = 1; j < 399; j++) {
            if (field.getAlive(i, j)) {

                int x = 0;
                if (field.getAlive(i - 1, j - 1)) {
                    x++;
                }
                if (field.getAlive(i, j - 1)) {
                    x++;
                }
                if (field.getAlive(i + 1, j - 1)) {
                    x++;
                }
                if (field.getAlive(i + 1, j)) {
                    x++;
                }
                if (field.getAlive(i - 1, j)) {
                    x++;
                }
                if (field.getAlive(i - 1, j + 1)) {
                    x++;
                }
                if (field.getAlive(i, j + 1)) {
                    x++;
                }
                if (field.getAlive(i + 1, j + 1)) {
                    x++;
                }

                if (x < 2 || x > 3) {
                    field.setAlive(i, j, false);
                } 

            } else {


                if (!field.getAlive(i, j)) {



                    int x = 0;


                    if (field.getAlive(i - 1, j - 1)) {
                        x++;
                    }
                    if (field.getAlive(i, j - 1)) {
                        x++;
                    }
                    if (field.getAlive(i + 1, j - 1)) {
                        x++;
                    }
                    if (field.getAlive(i + 1, j)) {
                        x++;
                    }
                    if (field.getAlive(i - 1, j)) {
                        x++;
                    }
                    if (field.getAlive(i - 1, j + 1)) {
                        x++;
                    }
                    if (field.getAlive(i, j + 1)) {
                        x++;
                    }
                    if (field.getAlive(i + 1, j + 1)) {
                        x++;
                    }

                    if (x == 3) {
                        field.setAlive(i, j, true);

                    }

                }
            }
        }
    }
    repaint();
   }

  }



   public class Field {
   private GUI gui;
   private int fieldLength = 1;
   private boolean[][] alive;

  public Field(GUI gui) {
    this.gui = gui;
    alive = new boolean[400][400];
    for(int i = 100 ; i<110; i++){alive[100][i] = true;    }
    for(int i = 100 ; i<110; i++){alive[i][100] = true ;   }
  }

 public boolean getAlive(int i, int j) {
    return alive[i][j];
  }

 public void setAlive(int i, int j, boolean alive) {
    this.alive[i][j] = alive;
  }

 }

1 个答案:

答案 0 :(得分:3)

您的问题是由于您使用相同的电路板实例来检查规则和更新而引起的。每次迭代都应该根据旧的板创建一个新的板,而不是重新使用旧的板。

您应该在任何给定时间保留两块板。一个要读取,一个要写入,然后只需在每次迭代结束时复制写入的一个