2011-01-08 24 views
1

私はこの言語を学ぶ練習として、The Game of LifeをJavaで実装しようとしています。Javaと条件付きの問題

残念ながら、私はこのプログラムを正しく動かすことができないように私は問題があります。

私は問題はないとのトロイダル合計(プレーンドーナツです)実装:

int SumNeighbours (int i, int j) { 

    int value = 0; 


    value = world[(i - 1 + row ) % row][(j - 1 + column ) % column]+world[(i - 1 + row ) % row][j]+world[(i - 1 + row ) % row][(j + 1) % column]; 

    value = value + world[i][(j - 1 + column ) % column] + world[i][(j + 1) % column]; 

    value = value + world[(i + 1) % row][(j - 1 + column ) % column] + world[(i + 1) % row][j]+world[ (i+1) % row ][(j + 1) % column]; 


    return value; 
} 

をそして、私はそれをテストするとき、それは正しく合計:

残念ながら
void NextWorldTest() { 

    int count; 

    int [][] nextWorld = new int[row][row]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " ");  


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

私はの条件を追加します(生まれた/死んだ)生命のゲームは、プログラムが正しく動作しなくなり、もはや近隣の生存細胞を正確に数えることができなくなったように見えます。それは何も存在しない場合を数え、いくつかある場合はカウントしません。例:いくつかの生きている細胞の下のものを数えません。

これは非常に奇妙な動作で、3日間頭痛を与えています...変数について何か基本的なものがありませんか?

ここでクラスを見つけることができます。

void NextWorld() { 

    int count; 

    int [][] nextWorld = new int[row][column]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " "); 


    if ( (world[i][j] == 0) && (count == 3) ) { 

    nextWorld[i][j] = 1; 

    } else if ((world[i][j] == 1) && ((count == 3) || (count == 2))) { 

    nextWorld[i][j] = 1; 

    } else { 

    nextWorld[i][j]=0; 

    } 


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

} 

私は何か間違っていますか?

以下は、完全なパッケージです。

package com.GaOL; 

public class GameWorld { 

int [][] world; 

int row; 

int column; 

public int GetRow() { 

    return row; 
} 

public int GetColumn() { 

    return column; 
} 

public int GetWorld (int i, int j) { 


    return world[i][j]; 

} 

void RandomGen (int size, double p1) { 

    double randomCell; 

    row = size; 
    column = size; 

    world = new int[row][column]; 

    for (int i = 0; i<row; i++) { 
    for (int j = 0; j<column; j++) { 

    randomCell=Math.random(); 

    if (randomCell < 1-p1) { 

    world[i][j] = 0; 

    } else { 

    world[i][j] = 1; 

    } 



    } 

    } 

} 

void printToConsole() { 

    double test = 0; 

    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    if (world[i][j] == 0) { 

    System.out.print(" "); 

    } else { 
    System.out.print(" * "); 

    test++; 

    } 

    } 

    System.out.println(""); 

    } 


    System.out.println("ratio is " + test/(row*column)); 


} 

int SumNeighbours (int i, int j) { 

    int value = 0; 


    value = world[(i - 1 + row ) % row][(j - 1 + column ) % column]+world[(i - 1 + row ) % row][j]+world[(i - 1 + row ) % row][(j + 1) % column]; 

    value = value + world[i][(j - 1 + column ) % column] + world[i][(j + 1) % column]; 

    value = value + world[(i + 1) % row][(j - 1 + column ) % column] + world[(i + 1) % row][j]+world[ (i+1) % row ][(j + 1) % column]; 


    return value; 
} 

void NextWorldTest() { 

    int count; 

    int [][] nextWorld = new int[row][row]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " ");  


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 


void NextWorld() { 

    int count; 

    int [][] nextWorld = new int[row][column]; 

    nextWorld = world; 


    for (int i=0; i<row; i++) { 
    for (int j=0; j<column; j++) { 

    count = SumNeighbours(i,j); 

    System.out.print(" " + count + " "); 


    if ( (world[i][j] == 0) && (count == 3) ) { 

    nextWorld[i][j] = 1; 

    } else if ((world[i][j] == 1) && ((count == 3) || (count == 2))) { 

    nextWorld[i][j] = 1; 

    } else { 

    nextWorld[i][j]=0; 

    } 


    } 

    System.out.println(); 

    } 

    world=nextWorld; 



} 

} 

、ここでテストクラス:

package com.GaOL; 

public class GameTestClass { 


public static void main(String[] args) { 

    GameWorld prova = new GameWorld(); 

    prova.RandomGen(10, 0.02); 

    for (int i=0; i<3; i++) { 

    prova.printToConsole(); 

    prova.NextWorld(); 

    } 



} 

} 
+2

あなたがあなたのコードを書式化した場合、あなたに答えるほうがずっと簡単です。 b)何が間違っているかの短い例を提示した。あなたが問題を実証する必要があるよりもはるかに多くのコードがここにあります、私は確信しています。 –

+0

私は再フォーマットされました... StackOverflowエディタに問題がありました...条件付き演算子タグがあるのは、ifsを追加するとコードが破損するためです。 – Mascarpone

+0

条件演算子に問題はないと思います。だから私はこのタグを削除しました。 –

答えて

2

私はこの問題は、配列の割り当てである、と思います。あなたはここで何をしているの?

int [][] nextWorld = new int[row][row]; 
nextWorld = world; 

新しい配列[row][column]を作成し、worldのデータに従って入力する必要があります。 Javaで

そして、もっと

  • あなたはSMTに同様anArray.lengthanArray[0].lengthを行うことができ、あなたが行と列の変数
  • を必要としないので、あなたが方法がsumNeighbours()代わりのように、低文字で始まるすべての名前を付ける必要がありますSumNeighbours()

UPD

固定:第アドバイスにミスがありました
+0

はい、その部分が間違っていますが、配列が正方形であるので問題はありません.... help: – Mascarpone

+0

@ Muad'Dib、あなたは 'nextWorld = world;'に行こうと思いますか? –

+0

それはnextWorldで世界のコピーを作っていますので、私はその価値を変更することができますが、元々の参照を持っています...私は間違っていますか? – Mascarpone

関連する問題