2011-01-08 50 views
1

我試圖在java中實現生命遊戲,作爲學習這種語言的練習。Java和條件(生命遊戲)的問題

不幸的是我有一個問題,因爲我似乎無法讓這個程序正常運行。

我實現了一個torodial總和(面是油炸圈餅)沒有問題:

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

如果a)格式化了您的代碼,那麼回答您會容易得多; b)你提出了一個* short *的例子。我敢肯定,這裏有更多的代碼比你需要證明這個問題。 – 2011-01-08 17:35:39

+0

我重新格式化了... StackOverflow編輯器出現了問題...條件運算符標記存在,因爲當我添加ifs時,代碼會中斷... – Mascarpone 2011-01-08 17:38:39

回答

2

我認爲,問題出在陣列中分配。你在這裏做什麼?

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

您應該創建新陣列[row][column]然後根據世界上的數據填充它。

而且更

    在Java中,你可以做SMT像 anArray.lengthanArray[0].length,所以你不需要的行和列變量
  • 你應該命名你的方法開始低信,像sumNeighbours()代替
  • SumNeighbours()

UPD:有錯字在第二提醒:固定