“人工智能”(Artificial Intelligence)簡稱AI,在游戲里是必不可缺的,
請教一般在哪些地方會使用什么樣的AI算法,比如尋路、戰斗等等。
游戲編程中的尋路算法
在游戲關卡中常常會放置一些怪物(即NPC),這些怪物通常在一個區
域內走來走去,這個區域被稱為“巡邏區域”;一旦玩家的角色進入怪物的
“視 野”,怪物就會發現玩家角色,並主動向其所在的位置移動,這個區
域稱為“警戒區域”;當玩家角色和怪物更加靠近時,會進入到怪物的“攻
擊區域”,這時怪物 會對玩家角色進行傷害。在某些RPG(Real-Time
Strategy Game,即時戰略游戲)中,NPC 在不利的情況下還會選擇
主動逃跑。如何模擬這些行為邏輯,目前游戲業已經有一些比較成熟的方法。
1 隨機尋路算法
隨機尋路算法適合模擬游戲中那些沒有什么頭腦的生物,它們總是在場
景中漫無目的地走來走去。可以用以下的代碼進行模擬:
- npc_x_velocity = -5 + rand() %10;
- npc_y_velocity = -5 + rand() %10;
- int npc_move_count=0;
- while(++npc_move_count<num){
- npc_x+ = npc_x_velocity;
- npc_y+ = npc_y_velocity;
- } //end while
在上例中,N P C 會選取一個隨機方向和速率運動一會兒,然后再選
取另一個。當然,還可以加上更多的隨機性,如,改變運動方向的時
間不是固定的n u m個周期,或者更傾向於朝某個方向等。實際編程
中還必須考慮到碰撞檢測,當NPC 遇到障礙物后,會隨機選取一個前
進的方向,繼續行走。
2 跟蹤算法
當游戲中的主角進入到NPC 的“警戒區域”后,游戲的A I 可輕易獲得
目標的位置,然后控制N P C 對象移向被跟蹤的對象。跟蹤算法可以
模擬這一行為:
- void Bat_AI(void)
- {
- if(ghost.x > bat.x)
- bat.x++;
- else
- if(ghost.x < bat.x)
- bat.x--;
- if(ghost.y > bat.y)
- bat.y++;
- else
- if(ghost.y < bat.y)
- bat.y--;
- //其他代碼
- } // end Bat_AI
這段代碼放到程序中實際運行時不難發現,N P C會迅速地追蹤到目
標。這種跟蹤非常精確,但是在游戲中過於精確卻不一定是一件好事,
因為這會使N P C的行為看上去顯得有點假。一種更自然的跟蹤方式
是使跟蹤者的方向矢量與從跟蹤目標的中心到跟蹤者的中心所定義的
方向矢量靠攏。
這個算法可以這樣設計:假設AI 控制的對象稱作跟蹤者(tracker)
並有以下屬性:
- Position:(tracker.x,tracker.y)
- Velocity:(tracker.xv,tracker.yv)
被跟蹤對象稱作跟蹤目標(target),有如下屬性:
- Position:(target.x,target.y)
- Velocity:(target.xv,target.yv)
基於上面的定義,下面是調整跟蹤者的速度向量的常用邏輯循環:
1)計算從跟蹤者到跟蹤目標的向量:TV = (target.x -tracker.x, target.y-tracker.y) = (tvx, tvy)
,
規格化TV——也就是說 (tvx, tvy)/ Vector_Length(tvx,tvy)
使得
最大長度為1.0,記其為TV*
。記住Vector_Length()
只是計算從原點
(0,0)開始的矢量長度。
2)調整跟蹤者當前的速度向量,加上一個按rate比例縮放過的TV*
:
- tracker.x += rate*tvx;
- tracker.y += rate*tvy;
注意:當rate >1.0
時,跟蹤向量會合得更快,跟蹤算法對目標跟蹤
得更緊密,並更快地修正目標的運動。
3)跟蹤者的速度向量修改過之后,有可能向量的速度會溢出最大值,
就是說,跟蹤者一旦鎖定了目標的方向,就會繼續沿着該方向加速。
所以,需要設置一個上界,讓跟蹤者的速度從某處慢下來。可做如下改進:
- tspeed = Vector_Length(tracker.xv, tracker.yv);
- if(tspeed>max_SPEED){
- tracker.xv*=0.7;
- tracker.yv*=0.7;
- }
也可以選擇其它的邊界值0.5 或0.9 等均可。如果追求完美,甚至可以
計算出確切的溢出,並從向量中縮去相應的數量。追蹤過程中同樣也會
遇到障礙物,因此,碰撞檢測是必不可少的。程序員可以根據不同
的游戲類型設計碰撞后的行為邏輯。
3 閃避算法
這個技術是讓游戲的N P C 能避開玩家角色的追擊,跟前面的跟蹤代碼
很相似,跟蹤算法的對立面就是閃避算法,只要把上例中的等式翻轉
,閃避算法就成了,下面是轉換后的代碼:]
- if(ghost.x > bat.x)
- bat.x--;
- else
- if(ghost.x < bat.x)
- bat.x++;
- if(ghost.y > bat.y)
- bat.y--;
- else
- if(ghost.y < bat.y)
- bat.y++;
- ......
以上介紹的3 個算法可以模擬NPC 的一些簡單的尋路、跟蹤和閃避行為,
在小游戲中會經常用到。但是,在較大型的游戲中使用這樣簡單的算法就
會大大影響游戲效果了。因此,大型游戲的人工智能算法都較復雜。
內容節選自《游戲編程中的尋路算法研究》
可以看看《AI for Game Developers》這本書:
·使用基於勢函數的單一技術處理追趕、躲避、聚集和避障等問題。
·使用包括路徑點和經典a*算法解決尋徑問題。
·利用ai腳本擴充ai引擎的功能,讓設計者和玩家更好地設計和玩游戲。
·給你的游戲角色賦予基於規則的ai推理能力,包括模糊邏輯和有限狀態機。
·使用概率分析和諸如貝葉斯推理的高級技術處理不確定性問題。