1
我在C++(openFrameworks)中構建了一個生命CA遊戲。由於我是C++的新手,我想知道如果我在下面的代碼中正確地設置了矢量,有人可以讓我知道。 CA不會畫到屏幕上,我不確定這是否是由於我如何設置矢量而導致的。因爲我打算將數據發送到僅處理一維結構的純數據,所以我必須使用一維向量。在openframeworks中使用C++向量的生命元胞自動機遊戲
GOL::GOL() {
init();
}
void GOL::init() {
for (int i =1;i < cols-1;i++) {
for (int j =1;j < rows-1;j++) {
board.push_back(rows * cols);
board[i * cols + j] = ofRandom(2);
}
}
}
void GOL::generate() {
vector<int> next(rows * cols);
// Loop through every spot in our 2D array and check spots neighbors
for (int x = 0; x < cols; x++) {
for (int y = 0; y < rows; y++) {
// Add up all the states in a 3x3 surrounding grid
int neighbors = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
neighbors += board[((x+i+cols)%cols) * cols + ((y+j+rows)%rows)];
}
}
// A little trick to subtract the current cell's state since
// we added it in the above loop
neighbors -= board[x * cols + y];
// Rules of Life
if ((board[x * cols + y] == 1) && (neighbors < 2)) next[x * cols + y] = 0; // Loneliness
else if ((board[x * cols + y] == 1) && (neighbors > 3)) next[x * cols + y] = 0; // Overpopulation
else if ((board[x * cols + y] == 0) && (neighbors == 3)) next[x * cols + y] = 1; // Reproduction
else next[x * cols + y] = board[x * cols + y]; // Stasis
}
}
// Next is now our board
board = next;
}
你在你的'init'功能相關的問題:如果'board'是'的std :: VECTOR'你會寫一個OUT-越界指數,總是。請記住,索引從零到大小減1。因此,在第一個'push_back'之後,您可以訪問索引0,在第二個索引爲0和1之後等等。在您的代碼中,第一次迭代將訪問索引cols + j,這顯然是無效的。 – 2013-03-15 18:23:42
你如何處理你的鄰居支票上的案例邊緣?模數 - 你的包裝好了。 – 2013-03-15 18:26:40
謝謝。我從使用二維數組的Processing(Java)草圖中翻譯出來。我現在離開了我的機器,稍後我會再看看這兩個程序,並將您的建議考慮在內。 – 2013-03-15 18:46:15