本文為系列第二部分,涵蓋地圖區塊儲存/載入、巢穴與食物隨機配置、螞蟻初始化、世界狀態更新主循環、螞蟻移動調度與信息素釋放邏輯。
home.xxx, home.yyy, food.xxx, food.yyy(各 1 byte)block[MAXX+1][MAXY+1] 逐字節寫入/讀出。Ant.ant,使用者可自訂。四象限對角佈局確保距離最遠:
| 案例 | 巢穴區域 | 食物區域 |
|---|---|---|
| 1 | 左上 (1..MAXX/3, 1..MAXY/3) | 右下 (2MAXX/3..MAXX, 2MAXY/3..MAXY) |
| 2 | 左下 | 右上 |
| 3 | 右上 | 左下 |
| 4 | 右下 |
食物量 2/3 MAX_FOOD .. MAX_FOOD,目標食物量 min(food.amount, TARGET_FOOD)。座標合法性檢查失敗直接退出程式。
2 * (random(INI_SPEED/2) + 1)(偶數,2, 4, 6...),螞蟻 0 固定 INI_SPEED(特殊螞蟻)。food=0(空身)、SmellAmount[FOOD]=0、SmellAmount[HOME]=MAX_SMELL(滿巢穴信息素)、IQ=1、軌跡陣列歸零。參見上一文 WorldChange 詳細邏輯。
SpeedTimer,到期執行 AntOneStep。AntOneStep、繪製新位(螞蟻 0 特殊顏色、攜帶食物不同字符)。antx = ant[AntNow].xxx; anty = ant[AntNow].yyy;
if (ant[AntNow].food) { // 攜帶食物 → 釋放食物信息素
if (SmellAmount[FOOD] > 0) {
drop = SmellAmount[FOOD] * SMELL_DROP_RATE;
if (drop > Smell[FOOD][antx][anty]) Smell[FOOD][antx][anty] = drop;
SmellAmount[FOOD] -= drop; if (SmellAmount[FOOD] < 0) = 0;
}
} else { // 空身 → 釋放巢穴信息素
if (SmellAmount[HOME] > 0) {
drop = SmellAmount[HOME] * SMELL_DROP_RATE;
if (drop > Smell[HOME][antx][anty]) Smell[HOME][antx][anty] = drop;
SmellAmount[HOME] -= drop; if (SmellAmount[HOME] < 0) = 0;
}
}
關鍵機制:信息素量隨距離遞減(每步釋放當前攜帶量的固定比例),形成濃度梯度引導其他螞蟻。