2013-03-15 40 views
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; 
} 
+2

你在你的'init'功能相關的問題:如果'board'是'的std :: VECTOR'你會寫一個OUT-越界指數,總是。請記住,索引從零到大小減1。因此,在第一個'push_back'之後,您可以訪問索引0,在第二個索引爲0和1之後等等。在您的代碼中,第一次迭代將訪問索引cols + j,這顯然是無效的。 – 2013-03-15 18:23:42

+0

你如何處理你的鄰居支票上的案例邊緣?模數 - 你的包裝好了。 – 2013-03-15 18:26:40

+0

謝謝。我從使用二維數組的Processing(Java)草圖中翻譯出來。我現在離開了我的機器,稍後我會再看看這兩個程序,並將您的建議考慮在內。 – 2013-03-15 18:46:15

回答

0

這看起來在你的代碼怪異:

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); 
    } 
    } 
} 

「vector.push_back(值)」是指「附加價值,這個矢量的結束」看到std::vector::push_back reference 這樣做後,您可以訪問Board [i * cols + j]的值並將其改爲隨機值。我認爲你要做的是:

void GOL::init() { 
    // create the vector with cols * rows spaces: 
    for(int i = 0; i < cols * rows; i++){ 
     board.push_back(ofRandom(2)); 
    } 

} 

這是你如何會在位置x訪問的每一個元素,Y在您的載體:

for (int x = 0; x < cols; x++) { 
    for (int y = 0; y < rows; y++) { 
     board[x * cols + y] = blabla; 
    } 
    } 

這意味着無效GOL ::生成()你是不是訪問正確的位置,當你這樣做:

 neighbors += board[((x+i+cols)%cols) * cols + ((y+j+rows)%rows)]; 

我想你想這樣做:

 neighbors += board[((x+i+cols)%cols) * rows + ((y+j+rows)%rows)]; 

所以X *行+ Y代替X *的cols + Y