2016-05-02 2 views
1

私はJavaのConways Game of Lifeで作業していますが、少し問題があります。コンウェイゲーム・オブ・ライフ - 第1回目の突然変異後にグライダー・パターンが機能しない?

私のテストケースはグライダーパターンですが、プログラムを実行しようとすると、グライダーは第2世代で初めて正しく突然変異します。最初の突然変異の後のそれぞれの世代は間違っており、私は理由を理解することができません。 (私の方法の大部分が存在する)

Glider Should Mutate like this

This is what I get from running the code, the Glider shouldn't be stuck with a repeating pattern.

World.class

public class World extends Patterns 
{ 

    private char [][] world; 
    private char [][] tempWorld; 
    private int numRows; 
    private int numCols; 

//World Constructor 
    public World (int r, int c) 
    { 
     this.numRows = r; 
     this.numCols = c; 
     world = new char [r][c]; 
     tempWorld = new char [r][c]; 
     initalizeWorld(); 

    } 

//Initializes the world and fills array with blank spaces 
    private void initalizeWorld() 
    { 
     // Initialize all indexes to ' ' 
     for(int i = 0; i < numRows; i++) 
     { 
      for(int j = 0; j < numCols; j++) 
      { 
       world[i][j] = ' '; 
      } 
     } 
    } 


//Creates and stores data in a temp world for the next Generation 
    public void nextGen() 
    { 
     for(int i = 0; i < numRows; i++) 
     { 
      for(int j = 0; j < numCols; j++) 
      { 
       changeCell(i,j); 
      } 
     } 
     world = tempWorld;  
    } 

    //Prints world with *'s as Cells and O's as dead cells 
    public void printWorld() 

    { 
     // Print every value inside array 
     for(int i = 0; i < numRows; i++) 
     { 
      for(int j = 0; j < numCols; j++) 
      { 
       if(world[i][j] == '*') 
        System.out.print(" "); 

       System.out.print(world[i][j]); 

       if(world[i][j] != '*') 
       { 
        System.out.print("O"); 
       } 

      } 
      System.out.println(" "); 
     } 
    } 

    //Method check's for neighbors of a cell 
    public int getNeighbors(int x, int y) 
    { 
     int numNeighbors = 0; 

     for(int i = x - 1; i <= x + 1; i++) 
     { 
      for(int j = y - 1; j <= y + 1; j++) 
      { 

       if((i >= 0) && (i < numRows) && (j < numCols) && (j >= 0)) 
       {     

        if (world[i][j] == '*') 
        { 
         numNeighbors++; 
        } 

       } 

      } 
     } 

     //don't count the cell itself 
     return numNeighbors-1; 

    } 

    //Method uses getNeighbors to check whole array for every cells # of Neighbors 
    public void checkAllNeighbors() 
    { 
     for(int i = 0; i < numRows; i++) 
     { 
      for(int j = 0;j < numCols; j++) 
      { 

       //if(world[i][j] == '*') 
       { 
        int neighbors = getNeighbors(i, j); 
        System.out.println("The cell at (" + i + ", " + j + ") has " + neighbors + " neighbors"); 
       } 

      } 
     } 


    } 

    //Method changes cell based on Neighbor Counts 
    public void changeCell (int r, int c) 
    { 
     int count = getNeighbors(r,c); 

     if (count == 3) 
     { 
      tempWorld [r][c] = '*'; 
     } 
     else if (count >= 2 && count <= 3) 
     { 
      tempWorld [r][c] = '*'; 
     } 
     else 
     { 
      tempWorld [r][c] = ' '; 
     } 

    } 

    //Gets world 
    public char [][] getWorld() 
    { 
     return world; 
    } 

    public void putGlider(int r, int c) 
    { 
     char pattern[][] = getGlider(); 


     for (int i = 0; i < pattern.length; i++) 
     { 
      for (int j = 0; j < pattern[0].length; j++) 
      { 

       if ((i + r < numRows) && (j + c < numCols)) 
       { 
        world[i + r][j + c] = pattern[i][j]; 

       } 
      } 
     } 
    } 

} 

Patterns.class(現在グライダーパターンを保持し、より多くの後に収容する)

public class Patterns 
{ 
    private char[][] gliderArray = {{' ','*',' '}, 
            {' ',' ','*'}, 
            {'*','*','*'}}; 

    //private char [][] 

    public char[][] getGlider() 
    { 
     return gliderArray; 
    } 

} 

test.class(Wここで私の方法をテストしています)

import java.util.Scanner; 

public class test 
{ 
    public static void main(String[] args) 
    { 
     World test = new World (5,5); 

     test.getWorld(); 
     test.putGlider(0,0); 
     test.printWorld(); 

     System.out.println("Press enter to start generations!"); 
     new Scanner(System.in).nextLine(); 

     for(int i=0; i<10; i++) 
     { 
      test.nextGen(); 
      System.out.println(" "); 
      test.printWorld(); 
      try 
      { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

    } 

} 

私はこのプロジェクトをしばらくは続けてきましたが、私は本当にこの時点で固執しています。私は何が間違っていて、どうやって修正するのか分からず、ちょっと怒っています。どんな助けでも大歓迎です!

ありがとうございました!

Sci Progの提案に基づく新しいnextGenメソッドは、ループ内のループを正しく実装しているかどうかはわかりません。

public void nextGen() 
{ 
    for(int i = 0; i < numRows; i++) 
    { 
     for(int j = 0; j < numCols; j++) 
     { 
      changeCell(i,j); 
     } 
    } 

    for (int r=0; r < this.numRows; r++) 
      for (int c=0; c < this.numCols; C++) 
      world[r][c] = tempWorld[r][c]; 
} 

私のchangeCellメソッドも変更されましたが、新しい出力はこれまでのものより大きくなりました。あなたはそれをsubstracting、セル自体を含むすべてのネイバーを数えているgetNeighbours方法で

+0

第1位の後に各突然変異が「間違っている」と言うと、それが正確ではないという理由で詳しく説明できますか? –

+0

'getNeighbors'メソッドで'(i bezmax

+0

"Even Bechtol"へ私は、突然変異が間違っていることについて、私が何を意味するかについて、いくつかの写真を上に追加しました。 – TheDingo

答えて

0

return numNeighbors-1; 

あなたがチェックしているセルが空である場合は、無効なカウントを取得します。あなたはこれらの座標にセルをチェックしようとするとそれは、次のとおりです。

* * * 
* O * 
* * * 

あなたは7の代わりに、実際の数8を(それが中央に空の)を取得します。

方法checkAllNeighborsを見ると、あなたが//if(world[i][j] == '*')を使用して、その説明するために試みたが、それは生命の規則のゲームに応じて間違っているとして、あなたがそれをコメントアウトしているようです。

これは、changeCellメソッドが空のセルに対して隣接カウントを正しく取得しないことを意味します。

+0

ポインタのおかげで、コードを修正する方法はありますか? – TheDingo

+0

また、_italic_ ** bold ** 'getNeighbours'メソッドの私のxとyに関して、私はそれを間違っていると確信していますが、私はそれを変更することで問題を解決するとは思わないでしょう。 – TheDingo

1

まず問題

world = tempWorld;コピーworldからtempWorldアレイの参照。したがって、両方の変数はメモリ内の同じオブジェクトを参照します。最初の反復後に、tempWorldの要素を変更するたびに、同じ要素がworldに変更されます。

手動で、それはあなたのchangeCell方法で長いコード

for (int r=0; r < this.numRows; r++) 
    for (int c=0; c < this.numCols; C++) 
    world[r][c] = tempWorld[r][c]; 

第二の問題

場合でも、それぞれの要素をコピーする必要があり、あなたは現在のセル「は」または「かどうかをチェック*ありません' (生細胞= 2または3、死んだ細胞= 3)

+0

私はこれを正しくしたのかどうかは分かりませんが、編集されたnextGenメソッドは上に示したようになりました。また、私のchangeCellメソッドを編集して、現在の出力を完全に消したように編集しました。任意のヒント?また、私の理解が不足して申し訳ありません、私はプログラミングとJava一般的に新しいです。 – TheDingo

+0

この行は、私のchangeCellメソッド 'else if((current == '*')&&(count <= 2)||(count <= 3) )&&(count == 3)) 'うまくいくようです。私の問題は、世界と温度の世界のために完全に別々の配列を必要とすることに似ているようですが。 – TheDingo

+0

おっと! 2番目の条件では '||'の代わりに '&&'でなければなりません(私はポストして間違ったものをコピーしました)。私は私の答えを編集しました。それが機能するかどうか確認してください。 –

関連する問題