Chapter 8 遊戲人工智慧
本章重點
移動型遊戲AI
行為型遊戲 AI
策略型遊戲 AI
移動型遊戲 AI
人工智慧就是我們常聽到的 AI (Artificial Intelligence) ,主要目的是要讓電腦本身可以依循著某些法則來模擬出類似人類般的思考與預測能力,並結合電腦具有快速數學運算能力的優點,創造出電腦在各方面的有效應用。
追逐移動
凡是在遊戲中會移動的物體,事實上幾乎都
牽扯到移動型的遊戲 AI ,像是遊戲中怪物追
逐或者躲避玩家,以及電腦角色的移動都是
移動型 AI 的例子。
追逐移動 以電腦怪物追逐玩家的例子來看看追逐移動
基本的演算法:
if( 怪物 X> 玩家 X) 怪物 X--;else 怪物 X++; if( 怪物 Y> 玩家 Y) 怪物 Y--;else 怪物 Y++;
修改怪物追逐玩家演算法 依照怪物生命值的多寡來決定是否追逐
追逐方向正確性的機率:if( 怪物 HP>200){ p=rand()%3; if(p>0) { if( 怪物 X> 玩家 X) 怪物 X--; else 怪物 X++; if( 怪物 Y> 玩家 Y) 怪物 Y--; else 怪物 Y++; }}
範例:三隻小鳥追逐飛機
全域變數宣告
紀錄三隻小鳥的貼圖座標
MyPaint
依實際滑鼠游標的位置 (x,y)設定飛機的貼圖座標 (nowx,nowy)並進行飛機的貼圖
MyPaint ( 續 )
進行小鳥追逐移動座標計算及貼圖動作
Exercise 12
下載並改寫 ch23_01.cpp 程式,將小鳥改為 5 隻,追逐飛機的機率改為 2/5 。
專案名稱為『學號 _13 』 ( 例: 8223582_13)
編譯及執行無誤後,使用 ftp 將『學號 _13.cpp 』上傳至 192.192.155.217 的 EX13目錄下,帳號: student5 ,密碼: student5
人工智慧理論
類神經網路
以多個連結處理器負責不同單元的處理,模
擬人類大腦思考與學習能力的人工智慧理論。
基因演算法
利用模擬自然界物競天澤的進化原理,對於
問題產生最佳化解決方案的人工智慧理論。
模糊邏輯
以一種判斷推理 (if-else) 的方式來產生最佳猜
測的決定,有別於一般以數學運算為基礎的
人工智慧理論 。
躲避移動 以電腦怪物躲避玩家的例子來看看躲避移動
基本的演算法:
if( 怪物 X> 玩家 X) 怪物 X++;else 怪物 X--; if( 怪物 Y> 玩家 Y) 怪物 Y++;else 怪物 Y--;
模式移動
追逐 隨機 躲避
怪物移動模式
怪物強 怪物與玩家一樣強
玩家強
行為型遊戲 AI
行為型遊戲 AI 主要是關於電腦角色本身的判
斷思考,而後產生對應行為的 AI 。在設計行
為型的遊戲 AI 時,通常我們會利用到一連串
的 if-else 判斷、數學運算,或者一些資料結
構的概念。
遊戲中怪物行為的例子
假設某一個怪物在對戰時具有以下幾種行為 普通攻擊 施放攻擊魔法 使盡全力攻擊 補血 逃跑
模擬怪物在對戰時的行為模式if( 生命值 > 20) // 生命值大於 20{
if(rand()%10 != 1) // 普通攻擊
else // 施放攻擊魔法
}else // 生命值小於 20{
switch(rand()%5){
case 0:// 普通攻擊break;
case 1: // 施放攻擊魔法
break;case 2:
// 使盡全力攻擊break;
case 3:// 補血break;
case 4:// 逃跑break;
}}
電腦角色的思考與行為
對戰訊息顯示
玩家部份下達攻擊指令
迷宮出口搜尋
在迷宮出口搜尋的過程當中,電腦必須對於接下
來該往那一個方向移動做思考判斷。
在迷宮搜尋問題中,除了下一時刻移動目的的判
斷之外,電腦角色還必須能夠對於走過的迷宮路
徑做記錄
在迷宮中移動搜尋出口的範例程式,其中用
到了行為型 AI 及地圖拼接的概念,並利用堆
疊 (stack) 資料結構來儲存搜尋迷宮時所經過
的每個迷宮方格編號。
迷宮拼接貼圖
以一個一維陣列來定義迷宮內容
迷宮拼接貼圖
出口
在定義迷宮陣列時,我們將代表牆的陣列元素值設為 0 ,其原因是因為這樣可以很容易的利用下面的判斷式來判斷某一方格是否可通過:
if(mapIndex[ 編號 ]) // 可通過,元素值為 1 或 2 或 3
else // 不可通過,元素值為 0
迷宮搜尋規則
堆疊結構的使用
14
8
2
11
14
8
2
末端指標
原堆疊
加入編號 11
新堆疊
末端指標
底下以圖示說明從記錄搜尋路徑堆疊中刪除方格編號的動作及其內容的變化
11
14
8
2
14
8
2
末端指標
原堆疊
刪除元素
新堆疊
末端指標
策略型遊戲 AI
最常見運用策略型 AI 的遊戲便是棋盤式遊戲。這類型的遊戲通常電腦必須依目前的狀況來判斷所有可走的棋步與可能的獲勝狀況,並在每一回合計算盤面電腦或者玩家的可能獲勝機率,以決定出一個最佳的走法。
求得所有獲勝組合
範例中使用了 10x10 大小的五子棋盤,底下
先以圖示說明棋盤上可能獲勝的組合並計算
這些組合的總數:
1. 水平方向上的獲勝組合 水平方向上的獲勝組合數: 6 x 10 = 60
共10列
1 2 … 6
2. 垂直方向上的獲勝組合 垂直方向上的獲勝組合數: 6 x 10 = 60
共 10 行1
2
6
3. 正對角方向上的獲勝組合
正對角方向上的獲勝組合數: 6 + ( 5 + 4 + 3 + 2 + 1 ) x 2 = 36
1 種組合2 種組合3 種組合
5 種組合6 種組合
4 種組合
4. 反對角方向上的獲勝組合
6 種組合
4 種組合
2 種組合1 種組合
反對角方向上的獲勝組合數: 6 + ( 5 + 4 + 3 + 2 + 1 ) x 2 = 36
5 種組合
3 種組合
建立與使用獲勝表
列編號
行編號
計算棋格獲勝分數 1. 在可達成連線的獲勝組合上擁有越多棋子的
棋格分數值越高。
獲勝組合中已放置 2 顆棋子
獲勝組合中已放置 3 顆棋子
獲勝組合中已放置 4 顆棋子
下圖是當獲勝組合中已填入兩顆棋子,對於未被對手佔走棋格位置以及被對走佔走棋格位置的兩種情況在獲勝分數設定上的比較:
對手棋子
2. 依棋格所在位置上可達成連線的獲勝組合總數與進行分數加總
簡單的利用一個 5x5 大小的棋盤來解釋這樣的計算方式:
0 1 2 3 40
1
2
3
4
全域變數宣告
玩家獲勝表電腦獲勝表
儲存玩家與電腦的棋子圖案
儲存棋盤上所有棋格的狀態
函式宣告
起始函式
InitGame
InitGame ( 續 )
WndProc
WndProc ( 續 )