2017-04-07 5 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

世代ごとに新しいフィールドを作成する必要があります。チェックしている同じフィールドを更新することはできません。 – Carcigenicate

答えて

3

ルールを確認して更新するために同じボードインスタンスを使用しているために問題が発生しています。すべての反復では、古いボードを再使用するのではなく、古いボードに基づいて新しいボードを作成する必要があります。

いつでも2つのボードを維持する必要があります。 1つは読んでからもう1つは書いてから各イタレーションの最後に書かれたものをコピーする

+0

ああ、感謝しました:) – Claudio

関連する問題