首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 課程設計:螞蟻與 Doodlebug 生態模擬完整框架代碼

     編輯:程式設計綜合問答

設計概覽

經典「螞蟻-螞蟻獅」網格模擬:20×20 網格,螞蟻繁殖週期 3、不餓死;Doodlebug 繁殖週期 8、餓死週期 3、優先吃螞蟻。每個 Time Step 先處理 Doodlebug 再處理螞蟻。

核心類圖

Animal (抽象基類)
├── Ant
└── Doodlebug

Cell (網格單元)
Grid (網格世界,含 Cell[20][20])
Simulation (主循環)

關鍵實現片段

Animal 基類(含鏈表管理自身)

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

Grid::OneStep 處理順序

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 內已處理)
}

Display 輸出

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,包含:

  • 雙向鏈表管理動物集合,O(1) 刪除餓死個體。
  • 方向向量 Steps[4] 統一四鄰域查找。
  • 隨機種子固定 (srand(0)) 保證結果可復現。
  • 主循環 while(true) 配合 system("pause") 逐步演示。

擴展建議

  • 引入 sfml/SDL2 繪製圖形化界面。
  • 增加統計圖表:種群數量隨時間變化曲線。
  • 參數化配置文件 (JSON/INI) 支援不同規則集。
  • 並行化:網格劃分為無衝突區域,多線程並行 Step。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved