本文為系列第三部分,涵蓋世界狀態更新(信息素揮發)、螞蟻單步移動 AntOneStep、按鍵處理 DealKey、信息素顯示 DispSmell/ClearSmellDisp、下一步方向決策 AntNextDir 核心邏輯。
SmellGoneTimer 累積 timer10ms,達 SMELL_GONE_SPEED 觸發一次揮發週期。Smell[k][i][j] -= 1 + Smell[k][i][j] * SMELL_GONE_RATE(基礎衰減 + 比例衰減)。SmellDispFlag 時同步更新螢幕字符(數字 0-9、# 代表高濃度)。F、巢穴 H 字符。MAX_ANT 隻螞蟻,各自獨立計時器 SpeedTimer 依 speed 決定移動頻率。AntOneStep 計算新位置,繪製新位置(攜帶食物顯示不同字符)。tracex[]/tracey[] 記錄最近 TRACE_REMEMBER 步座標。// 攜帶食物 → 尋找巢穴,釋放食物信息素
if (ant[AntNow].food) {
if (SmellAmount[FOOD] > 0) {
drop = SmellAmount[FOOD] * SMELL_DROP_RATE;
if (drop > current_cell_smell) update_cell(drop);
SmellAmount[FOOD] -= drop;
}
}
// 空身 → 尋找食物,釋放巢穴信息素
else {
if (SmellAmount[HOME] > 0) { ...同理... }
}
MAX_SMELL(強化源頭濃度)。AntNextDir 決定下一步方向。(xxx, yyy)。home.amount++、重置螞蟻 AntInitial()。MAX_SMELL。food=1、food.amount--、食物信息素量 MAX_SMELL、巢穴信息素量歸零、掉頭 TurnBack、清空軌跡記憶、設定 CanFindFood=1。MAX_SMELL。輸入:當前座標 (xxx, yyy)、當前朝向 ddir。輸出:下一步朝向 testdir。
CanGoState = CanGo(xxx, yyy, ddir) → 解碼出 cangof, cangol, cangor 三布林值。HOME);空身 → 尋食物信息素 (FOOD)。msf, msl, msr = GetMaxSmell(type, xxx, yyy, 當前/左/右方向)。maxms = MaxLocation(msf, msl, msr)。maxms=0(無信息素)→ testdir=NULL,進入隨機選擇。maxms=1(前方最大)→ 若可通行選前方,否則比較左右較大者。maxms=2(左最大)→ 若可通行選左,否則比較前/右。maxms=3(右最大)→ 若可通行選右,否則比較前/左。SMELL_DROP_RATE 或 testdir==NULL 觸發隨機選擇。CanGoState 以不同權重隨機:State=0(全通):90% 直行、5% 左、5% 右。State=1(前阻):50% 左、50% 右。State=7(死胡同):100% 掉頭。DealKey:p 暫停顯示耗時、t 切換信息素顯示、1/2/3 顯示食物/巢穴/雙重信息素、s/l 存檔/讀檔地圖。DispSmell:將信息素濃度映射為字符(0-9、#),支援單一/雙重類型顯示。