-1
问题是,当我开始代码游戏有点作品,但它不像普通的生活游戏。所以我想我的逻辑部分邻居检查不工作,因为我应该。经过长时间的调试,我仍然无法找到错误。 :)我不明白为什么我的游戏人生这个代码不起作用。谁能帮我?
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;
}
}
这是很多转储代码。如果你调试过它,你应该设法缩小它的范围。你是否确保邻居被正确计算?您是否验证过实时/死亡逻辑? – Carcigenicate
你在检查你正在更新的同一块电路板吗?那会导致腐败。 – Carcigenicate
您必须在每一代创建一个新的Field。您无法更新您正在检查的相同字段。 – Carcigenicate