-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