игра жизненных клеточных автоматов с использованием векторов с ++ в openframeworks

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

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

1

Решение

это выглядит странно в вашем коде:

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 (value)» означает «добавить значение в конец этого вектора», см. ссылка std :: vector :: push_back
После этого вы получаете доступ к значению 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;
}
}

Это означает, что в void GOL :: generate () вы не получаете доступ к правильной позиции, когда делаете это:

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

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

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

так что x * rows + y вместо x * cols + y

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]