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
謝謝。我覺得我更好理解它! :d – 2011-05-15 06:23:02