Итак.
1. В играх очень хорош объектный подход — что-то вроде
class World {
public:
bool wasStarPlaced = false;
bool wasStaircasePlaced = false;
std::vector<std::vector<char>> map;
unsigned long long tick = 0; // пригодится ещё
void update(); // стандартное название для функции «исполнить игровой такт»
};
Тут даже не нужны все каноны ООП, достаточно что-то вроде «поле X принадлежит объекту Y».
2. Многопоточка чревата гонками по данным, и если в многопоточку не стоит — пожалуйста, не делайте! В данном случае вы хотите что-то вроде: каждую секунду выполнять дополнительную ветку.
Как я понял, игра динамичная, и расчёты в ней достаточно простые, чтобы вести их с постоянной частотой (например, 60 тактов/с).
constexpr int TICKS_PER_SEC = 60;
void World::update()
{
++tick;
if (tick % TICKS_PER_SEC == 0) {
// происходит каждые 60 тактов
}
}