2013-03-15 6 views
1

Я строю игру жизни CA на C++ (openFrameworks). Поскольку я новичок в C++, мне было интересно, может ли кто-нибудь сообщить мне, правильно ли я настроил векторы в следующем коде. CA не обращается к экрану, и я не уверен, что это связано с тем, как я создал векторы. Я должен использовать 1D-векторы, поскольку я намерен отправлять данные в Pure Data, которые обрабатывают только 1D-структуры.игра жизни клеточных автоматов с использованием векторов C++ в openframeworks

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' является 'станд :: VECTOR' вы будете писать на амбулаторном индекс границ, всегда. Помните, что индекс идет от нуля до размера минус один. Таким образом, после первого «push_back» вы можете получить доступ к нулевому индексу, после вторых индексов нуль и один и т. Д. В вашем коде первая итерация будет иметь доступ к индексу 'cols + j', что явно недействительно. –

+0

Как вы управляете краем чехлов на стойке в соседней проверке? Ах модуль - ваш обертывание вашего доски в порядке. –

+0

Спасибо. Я переводю это из эскиза Processing (java), который использует 2D-массивы. Сейчас я ушел от своей машины, я еще раз посмотрю на обе программы, учитывая ваши советы. –

ответ

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 После этого, вы получаете доступ к значение платы [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)); 
    } 

} 

Это, как вы бы получить доступ к каждому элементу в позиции х, у в вашем векторе:

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

Это означает, что в недействительном ГОЛ :: генерировать() вы не имеет доступа к правильной позиции, когда вы это делаете:

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

Я думаю, что вы хотите сделать это:

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

так х * строки + у вместо х * смещ_по_столбцам + у