Я строю игру жизни 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;
}
У вас есть проблемы в вашем 'init' функции: Если' board' является 'станд :: VECTOR' вы будете писать на амбулаторном индекс границ, всегда. Помните, что индекс идет от нуля до размера минус один. Таким образом, после первого «push_back» вы можете получить доступ к нулевому индексу, после вторых индексов нуль и один и т. Д. В вашем коде первая итерация будет иметь доступ к индексу 'cols + j', что явно недействительно. –
Как вы управляете краем чехлов на стойке в соседней проверке? Ах модуль - ваш обертывание вашего доски в порядке. –
Спасибо. Я переводю это из эскиза Processing (java), который использует 2D-массивы. Сейчас я ушел от своей машины, я еще раз посмотрю на обе программы, учитывая ваши советы. –