2017-04-07 79 views
-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; 
    } 

} 
+0

這是很多轉儲代碼。如果你調試過它,你應該設法縮小它的範圍。你是否確保鄰居被正確計算?您是否驗證過實時/死亡邏輯? – Carcigenicate

+0

你在檢查你正在更新的同一塊電路板嗎?那會導致腐敗。 – Carcigenicate

+0

您必須在每一代創建一個新的Field。您無法更新您正在檢查的相同字段。 – Carcigenicate

回答

3

您的問題是由於您使用相同的板實例來檢查規則和更新造成的。每次迭代都應該創建一個基於舊版本的新版本,而不是重新使用舊版本。

您應該在任何給定的時間維護兩塊電路板。一個讀取,一個寫入,然後在每次迭代結束時複製寫入的文件

+0

啊,謝謝我了:) – Claudio

相關問題