經典「螞蟻-螞蟻獅」網格模擬:20×20 網格,螞蟻繁殖週期 3、不餓死;Doodlebug 繁殖週期 8、餓死週期 3、優先吃螞蟻。每個 Time Step 先處理 Doodlebug 再處理螞蟻。
Animal (抽象基類)
├── Ant
└── Doodlebug
Cell (網格單元)
Grid (網格世界,含 Cell[20][20])
Simulation (主循環)
class Animal {
protected:
int breedTime = 0, starveTime = 0;
int maxBreedTime, maxStarveTime;
Cell* cell = nullptr;
Animal *next = nullptr, *prior = nullptr; // 雙向鏈表節點
public:
virtual ~Animal() { unlink(); }
virtual Animal* breedChild() = 0;
virtual bool canEat(AnimalType) = 0;
virtual bool eat() = 0;
bool breed(); // 通用繁殖邏輯
bool move(); // 通用移動邏輯
void step(); // 統一步進:breed/eat/move/starve
};
void Grid::OneStep() {
// 1. 重置 moved 標記
for (auto a : allAnimals) a->moved = false;
// 2. Doodlebug 行動
for (auto a : doodlebugs) if (!a->moved) a->step();
// 3. Ant 行動
for (auto a : ants) if (!a->moved) a->step();
// 4. 清理餓死的 Doodlebug (在 step 內已處理)
}
void Grid::Display() {
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
Animal* a = cells[x][y]->animal;
if (!a) cout << '.';
else if (a->type == IsAnt) cout << 'o';
else cout << 'X';
}
cout << '\n';
}
}
見最佳回答中的 SOURCE.H / SOURCE.CPP,包含:
Steps[4] 統一四鄰域查找。srand(0)) 保證結果可復現。while(true) 配合 system("pause") 逐步演示。sfml/SDL2 繪製圖形化界面。