2011-12-06 19 views
-3

こんにちは皆、これらはゲームのルールです:未満2ライブ近隣諸国との- 人生のゲーム私は人生のシンプルなコンウェイのゲームをシミュレートしようとしています

任意の生細胞が死にます、過少人口によって引き起こされるように。 2つまたは3つのライブネイバーを持つすべてのライブセルは、次世代に存在します。 混雑しているかのように、4つ以上のライブネイバーが存在するすべてのライブセルが消滅します。 正確に3つのライブネイバーを持つ死んだセルは、まるで再生によって生きているセルになります。

問題は、印刷するために実際のグリッドを変更してからルールを適用する前に以前の値に変更する必要がありますが、このタスクを達成するためのシステムを見つけることができないことです誰かが私を助けることができます。ここ 私のコード:

import java.util.Scanner; 
import java.io.*; 

class LifeGrid 
{ 
private int[][] grid, newGrid; 
private int generation = 0; 

public LifeGrid(int x, int y, String filename) throws FileNotFoundException 
{ 
    grid = new int[x][y]; 
    newGrid = new int[x][y]; 

    int j = 0; 

    Scanner scanner = new Scanner(new File(filename)); 

    while(scanner.hasNextLine() && j < x) 
    { 
     String line = scanner.nextLine(); 

     for(int i=0; i<line.length() && i<y; i++) 
     { 
      if(line.charAt(i) == '*') 
       grid[j][i] = 1; 
      else 
       grid[j][i] = 0; 
     } 
     j++; 
    } 
    scanner.close(); 
} 

public void show() 
{ 

    for(int i=0; i<grid.length; i++) 
    { 
     for(int j=0; j<grid[i].length; j++) 
     { 
      if(grid[i][j] == 1) 
       System.out.print("*"); 
      else 
       System.out.print(" "); 
     } 
     System.out.println(); 
    } 
    System.out.println("Generation:" + generation); 
} 

//Getter methods 

public int getWidth()    { return grid[0].length; } 
public int getHeight()   { return grid.length;  } 
public int getGeneration()  { return this.generation; } 
public int getCell(int x, int y) { return grid[x][y];  } 


public static void main(String[] args)throws FileNotFoundException 
{ 
    LifeGrid life = new LifeGrid(6, 10, args[0]); 
    life.run(); 
    } 

//Check neighbours 

    public int neighbours(int x, int y) 
    { 
     int neighbours = 0; 

     if(x == 0 && y == 0) 
     { 
     if(grid[x][y+1] == 1)  {neighbours++;} 
     if(grid[x+1][y] == 1)  {neighbours++;} 
     if(grid[x+1][y+1] == 1)  {neighbours++;} 
     } 
     else if(x == 0 && y >= 1 && y < getWidth() -1) 
     { 
     if(grid[x][y+1] == 1)  {neighbours++;} 
     if(grid[x][y-1] == 1)  {neighbours++;} 
     if(grid[x+1][y] == 1)  {neighbours++;} 
     if(grid[x+1][y+1] == 1)  {neighbours++;} 
     if(grid[x+1][y-1] == 1)  {neighbours++;} 
     } 
     else if(x >= 1 && x < getHeight() -1 && y == 0) 
     { 
     if(grid[x][y+1] == 1)  {neighbours++;} 
     if(grid[x+1][y] == 1)  {neighbours++;} 
     if(grid[x+1][y+1] == 1)  {neighbours++;} 
     if(grid[x-1][y+1] == 1)  {neighbours++;} 
     } 
     else if(x == getHeight()-1 && y >= 1 && y < getWidth() - 1) 
     { 
     if(grid[x][y+1] == 1)  {neighbours++;} 
     if(grid[x][y-1] == 1)  {neighbours++;} 
     if(grid[x-1][y-1] == 1)  {neighbours++;} 
     if(grid[x-1][y+1] == 1)  {neighbours++;} 
     } 
     else if(x >=1 && x < getHeight() - 1 && y == getWidth()-1) 
     { 
     if(grid[x][y-1] == 1)  {neighbours++;} 
     if(grid[x+1][y] == 1)  {neighbours++;} 
     if(grid[x+1][y-1] == 1)  {neighbours++;} 
     if(grid[x-1][y-1] == 1)  {neighbours++;} 
     } 
     else if(x == 0 && y == getWidth()-1) 
     { 
     if(grid[x][y-1] == 1)  {neighbours++;} 
     if(grid[x+1][y] == 1)  {neighbours++;} 
     if(grid[x+1][y-1] == 1)  {neighbours++;} 
     } 
     else if(x == getHeight()-1 && y == 0) 
     { 
     if(grid[x-1][y] == 1)  {neighbours++;} 
     if(grid[x][y+1] == 1)  {neighbours++;} 
     if(grid[x-1][y+1] == 1)  {neighbours++;} 
     } 
     else if(x == getHeight()-1 && y == getWidth()-1) 
     { 
     if(grid[x][y-1] == 1)  {neighbours++;} 
     if(grid[x-1][y] == 1)  {neighbours++;} 
     if(grid[x-1][y-1] == 1)  {neighbours++;} 
     } 
     else 
     { 
        if(grid[x][y+1] == 1)   {neighbours++;} 
        if(grid[x][y-1] == 1)   {neighbours++;} 
        if(grid[x+1][y] == 1)   {neighbours++;} 
        if(grid[x+1][y+1] == 1)   {neighbours++;} 
        if(grid[x+1][y-1] == 1)   {neighbours++;} 
        if(grid[x-1][y-1] == 1)   {neighbours++;} 
        if(grid[x-1][y+1] == 1)   {neighbours++;} 
       } 
     return neighbours; 
    } 
    public void run() 
    { 
     int n; 
     int[][] old; 

     for(int i=0; i<grid.length; i++) 
     { 
      for(int j=0; j<grid[i].length; j++) 
      { 
       n = neighbours(i,j); 

       if(grid[i][j] == 1) 
       { 
        if(n < 2 || n > 3)  {generation = 0;} 
        if(n == 2 || n == 3) {generation = 1;} 
       } 
       else 
       { 
        if(n == 3)   {generation = 1;} 
        else   {generation = 0;} 
       } 

       if(generation == 1) 
       { 
        old = grid; 
        newGrid[i][j] = 1; 
        grid = newGrid; 
        show(); 
        grid = old; 
       } 
       else 
       { 
        old = grid; 
        newGrid[i][j] = 0; 
        grid = newGrid; 
        show(); 
        grid = old; 
           } 

      } 
     } 
     } 
}  

ファイル:

* * * 

予想される出力:

* 
* 
* 

新しいrun()メソッドは次のとおりです。

public void run() 
{ 
    int n; 

    for(int i=0; i<grid.length; i++) 
    { 
     for(int j=0; j<grid[i].length; j++) 
     { 
      n = neighbours(i,j); 

      if(grid[i][j] == 1) 
      { 
       if(n < 2 || n > 3) {generation = 0;} 
       if(n == 2 || n == 3) {generation = 1;} 
      } 
      else 
      { 
       if(n == 3)  {generation = 1;} 
       else   {generation = 0;} 
      } 

      newGrid[i][j] = generation; 
     } 
    } 
    grid = newGrid.clone(); 
    show(); 
} 

今の代わりになって出力として:

* 
* 
* 

私が手:

* 
* 

誰かが私はなぜ把握するのに役立つことはできますか?

+0

これは何らかの宿題ですか? – xmoex

+0

少しきれいにする必要があります。 1つの反復に対する期待される出力の例と実際の出力の例が与えられます。 – AHungerArtist

+0

グリッドを印刷する方法を解説します。キーボード入力を使用して次のライフサイクルを生成するだけです。 –

答えて

1

ようこそ!

たぶん私は(読み:新しいゲームの状態が残っている古い細胞を算出するために使用される?)あなたは誤解しますが、グリッドが早期に更新される問題で、私はあなたがそのためold = gridとのトラブルに遭遇すると思う

単に配列のshallow copyを生成します。あなたがArrayが継承したclone methodを使用して達成できる深いコピーを探している可能性は非常に高いです。

さらにコードを読むと、新しいゲームの状態を計算しながら、グリッドを既に更新しているような気がします。 「gridTemp」のような作業グリッドに新しいゲームの状態を割り当て、forループの外に出たとき、あなたのような何かを行う必要がありますのみ:

grid = gridTemp.clone() 
gridTemp.clear() //purge, trash whatever, just make it empty 

だけの擬似コードだということを覚えておいてください!私はそれがとにかく役立つといいですね。 :)

編集:

if(generation == 1) 
       { 
        old = grid; 
        newGrid[i][j] = 1; 
        grid = newGrid; 
        show(); 
        grid = old; 
       } 
       else 
       { 
        old = grid; 
        newGrid[i][j] = 0; 
        grid = newGrid; 
        show(); 
        grid = old; 
           } 
[OK]を、私はここので、私はそれがあなたの問題を解決だ場合は100%わからないが、このコードブロックは間違っているように見えるあなたのコードを実行することはできません代わりに私は小さな再構成をお勧めします。

上記のコードを次のように置き換えてください:

newGrid[i][j] = generation 

さらに、繰り返しの直後に次のコードを追加してください。

grid = newGrid.clone(); 
show(); 

新しいゲームを計算中に常にグリッドを更新して表示する代わりに、キスを(Keep It Sweet and Simple!)してください。まず、新しいゲームの状態を決定し、newGridのような一時的なグリッドに保存します。 最後に、ゲームの状態を古いグリッドにコピーして、ディスプレイを更新することができます。 おそらく、そこではclone()メソッドを呼び出す必要はありませんが、ちょっと夢中になりましょう:)

+0

私はあなたが何を意味するかをよく理解しているとは確信していません。私はプログラムを次のように変更しました:if(世代== 1) { newGrid [i] [j] = 1; gridTemp = newGrid; grid = gridTemp.clone(); show(); gridTemp.clear();しかし、私はgridTempを初期化する方法がわかりません。 – user1078406

+0

"gridTemp"は気にしないでください。私は自分の答えを更新し、より明確にしようとしました。 – yoshi

+0

お返事ありがとうございますが、まだ動作しません。なぜなら、今では、2つの「アスタリスク」を1つの列に入れてしまいますが、3つ目の行が見つからないからです。 – user1078406

関連する問題