2011-05-15 101 views
1

我想根據「遊戲人生」模擬概念編寫源代碼。我所做的是創建一個類來表示遊戲環境狀態,但將後繼函數的邏輯分離到不同的類中。遊戲的狀態保存在一個簡單的多維布爾數組中。對象克隆和知道參考中的底層對象(JAVA)

繼承函數應該做的是將當前狀態保存在新數組中作爲原始副本,並將其作爲整個過程的基礎。然後它將遊戲的當前狀態作爲參考,並使用遊戲邏輯對其進行修改。我的問題是我將原始文件克隆到一個新的變量中,但即使這個克隆也會被後繼函數修改。

我不太確定發生了什麼,所以我無法正確調試。我更習慣於C#處理基本類型克隆。

這裏是我的繼任者函數包裝類代碼:在世界人口類

公共類繼任{

boolean[][] current_state; 
public void next(WorldPopulation worldState){ 
    int dim_x = worldState.get_width(); 
    int dim_y = worldState.get_height(); 
    boolean[][] nextstate = worldState.get_state(); 
    current_state = worldState.get_state().clone(); 
    for(int i=0; i<dim_y; i++){ 
     for(int j=0; j<dim_x; j++){ 
      int neighbors = 0; 
      neighbors = countThyNeighbors(i, j); 
      if((neighbors>3 || neighbors<3) && current_state[i][j]){ 
       nextstate[i][j] = false; 
      } else if(!current_state[i][j] && neighbors>=3) { nextstate[i][j] = true; } 
     } 
    } 
} 
private int countThyNeighbors(int y, int x) { 
    int[] grid_x = { x-1, x, x+1, x-1, x+1, x-1, x, x+1}; 
    int[] grid_y = { y-1, y-1, y-1, y, y, y+1, y+1, y+1}; 
    int neighbors = 0; 
    for(int i=0; i<8; i++){ 
     try{ 
     if(current_state[grid_y[i]][grid_x[i]]) 
      neighbors++; 
     } catch(Exception e) { continue;} 
    } 
    return neighbors; 
} 

}

的get()和set()函數僅僅是分配和返回操作。

我對C#背景下的克隆(深層和淺層克隆)有一些細微的瞭解,但我在Java範例中是全新的。

任何改善我的代碼的建議都非常感謝,但我想知道發生了什麼以及我做錯了什麼。非常感謝你! :D

回答

1

多維數組表示爲數組數組。 Java中的克隆方法很淺。這意味着多維數組不會被深度克隆。

您可以實現自己的深拷貝方法或使用序列作爲descibed here

+0

謝謝。我覺得我更好理解它! :d – 2011-05-15 06:23:02