最近看了一些問題覺得大家都好佛心,所以斗膽來問一下之前想問但不敢問的問題…
本來只是想寫個下黑白棋的程式當練習
寫著寫著就在想要怎麼弄個電腦對手
查了 google 好像要靠有限狀態機、決策樹或路徑搜尋等演算法
但對哪種模式適合用在哪一種情境沒有概念
如果想實作遊戲 AI 的話用什麼遊戲當練習來起手會比較好呢?
想學習這個技術有沒有推薦的教學資源?或是有推薦什麼關鍵字?
能有個小範例或引導的題目是最好的
有沒有文章在寫遊戲 AI 的演進?
(我比較熟悉的程式語言是C#跟javascript,但推薦的資源不限語言~)
以前學習演算法時有碰過
四子棋
< 黑白棋
< 五字棋
< 西洋棋
< 象棋
< 圍棋
前五種用基本的演算法就可以得到不錯的效果,
而圍棋因為複雜度太高,需要用類似機器學習的方式來訓練,才能達到一定的程度。
那時候我做的是四子棋,用到 遊戲樹
、Min-Max 搜尋
、Alpha-Beta 剪枝
這三個演算法,棋類對局相關的 AI 基本上都可以用這三個演算法來實作,這篇有說明:
http://programmermagazine.github.io/201407/htm/focus3.html
遊戲樹:
遊戲樹大概長這樣子,由當前局面開始利用遞迴展開成樹狀圖,每一個節點代表每一個棋步,棋步太多不可能全部展開,因此這裡需要寫一個規則去判斷當前局面棋步的優先順序,照著優先順序展開一個範圍的棋步。
遊戲樹的每一層由敵我交替,到最後一層時會有一個審局函數將葉節點標上分數,審局函數是這個演算法的核心,審局越精準 AI 的效果越佳,Min-Max 搜尋是指,審局函數計算完後,會往根節點傳遞,在敵方層要取分數小的節點去走,在我方時要取分數大的節點走,這樣交替下去就能取得對我方最優的走法。
全部展開的樹狀圖太龐大可以利用 Alpha-Beta 剪枝來優化效能,遊戲樹中的有些分支其實是不用往下走的,大概就是利用 Min-Max 取最小和取最大的特性,將分支中已經出現 大於最小
或 小於最大
的部分砍掉。
遊戲樹的重點在 審局函數
和 遞迴深度
,遞迴越深越精準,可以利用不同的深度來控制遊戲難度,但展開遊戲樹非常耗效能,需要在效能和精準度上取得平衡。
這個算是很基礎的 AI,我在學這個的時候深度學習還沒紅起來,如果用深度學習來做應該可以達到更好的效果,不過還沒有機會接觸這塊。
在學遊戲 AI 時,遊戲中 NPC 的反應和 BOSS 的戰鬥 AI 適合用 有限狀態機
來做。
有限狀態機:
有限狀態機大概長這樣子,圓圈代表每個狀態,相連的線為觸發條件,狀態間可以是單向也可以是雙向,AI 就是透過狀態機不斷的循環來完成 NPC 或 BOSS 的動作。
而遊戲的路徑搜尋,比較常用 A 星演算法,之前有用來做過簡單的老鼠走迷宮,這些都是在學時學的,上班後都在做 Web 相關,幾乎沒在接觸這塊,覺得好懷念,我還是喜歡寫遊戲啊。
神人出現了
好詳細的回應哪
看到了好多新(對我來說XD)的關鍵字
非常感謝您的回答 .. 剛加完班才看見
待我精神好一點的時候再重新拜讀一次 <(_ _)>
其實很像遊戲外掛的邏輯
只是把人會想做的事先安排好
但是參數因人而異,所以要可以設定參數
就像有的人血量40%就想回血,有的人20%才想回血,
又可能因場合有不一樣的想法,戰鬥中還是一般狀態,
吃藥還是術法,還是靠時間自動慢慢恢復...
AI則是加上統計資料作為邏輯,
把各種參數各種行動與相關目標的排列組合下,
進行結果的資料收集,統計勝率/獲益...等數據,
在利用統計結果於相符性高的的條件下選擇較優的對策,
...
說真的,
如果遊戲中的NPC使用Server統計的資料
跑真AI的話,玩家是受不了的...
(玩家的行動被紀錄與統計分析)
最後AI終究是人工智慧,人想多少就有多少,
有了系統後還需持續的調整,增加參數,增加統計項目,
增加行為模式,增加策略...
不僅要精神好,還要很熱衷,不間斷無止盡的觀察各種可能細節...
Homura
在學時學的拉,都是比較基礎的東西,後來就去學 Web 了,所以有一點概念但不精。
rainbowrain
加班到早上 5.00 嗎
rainbowrain
加班到5:00
可以離職了
有為了跳槽在做準備了,也是準備跳 WEB
只是這次出的包覺得自己也有責任所以才會搞一整晚
平常沒有這麼慘烈 XD
但還是想有機會碰一下有興趣的東西,感覺蠻好玩的
只是一邊上班一邊上課,可能還要過些時間才能摸了 ...
謝謝 fysh711426 提供的教學~
有這些應該已經夠我到時候起步玩好一陣子了
想到RO外掛吃王
wwx
遊戲 AI 不能太聰明,要設計的笨一點,玩家把 BOSS 打死或下棋贏過電腦獲得成就感,才會想要繼續玩下去,哈哈哈。
謝謝您還特地找了 javascript 跟 C# 版本的資源 @@
井字遊戲我用 javascript 做過了,的確是很好的練習
但我的 code 不像您提供的教學模組的這麼好,還要再加強
我現在進一步想做的是自己一個人玩的話有 AI 對手
如果單由人類玩家進行遊戲
麻將、西洋棋、撲克牌或桌遊之類的話我應該都能做
但如果要由 AI 模仿玩家進行遊戲的話不太有概念…
井字遊戲可能還行,直斜橫線成雙的時候優先阻擋
不需要阻擋的時候優先讓自己成雙
其他複雜遊戲就不知道用什麼樣的思路來設計 orz
其他複雜遊戲就不知道用什麼樣的思路來設計?
無論是複雜還是簡單的遊戲,就是把自身的應對寫成程式,
當對手作了某個動作,會依據這動作的條件做出反應,
而AI的難度取決於應對方式的好壞,這樣想要創造AI應該就不會困難了
可能我之前把這件事想的太複雜結果腦中只剩下一團迷霧…
再想想您說的話確實道理都近似於做井字遊戲
把遇到時候情境下什麼判斷先一一列出就對了
這樣看起來這個部份果然沒有捷徑阿 orz
AI要自己寫,
網路上不確定會不會有,
而且撲克牌每個遊戲的AI都不一樣,
每個人寫出來的可能也會不一樣,
之前有自己做了一個撿紅點的,
很簡單的邏輯,
有分三種難度,
到我的網站去抓就可以下載了,
(當然是沒有原始碼)
小魚的個人網站
如果真的想學,
最快的方式就是想辦法進入業界,
很多東西是商業機密不會告訴別人的.
才剛從資策會結業,目前在專案公司上班,正在準備轉職 WEB 開發
現在應該不會走遊戲業 QQ(早十年的話應該就衝了)
想學這個是個人興趣
您的撿紅點還可以選難度,好專業阿…
難度設計也是我覺得蠻難想通的點 XD
是設定某個機率亂下牌這樣嗎?
另外請問您的 QR Code 辨識是使用套件還是自己讀 bitmap?
其實沒那麼難,
我都用簡單的邏輯而已,
難度最高的就是全部搜尋一遍,
看手上哪張牌可以拿到最多點就打出來,
最簡單的就是亂數隨便抽一張打出來,
(就是所謂的陪打的就是了)
不過自己玩偶爾也會輸給最簡單層級的...
有時候拿到的牌太爛也是無可奈何的,
畢竟我的抽牌是完全亂數的...
如果要像有些麻將要什麼大三元大四喜的牌型的,
那個就需要思考過了,
不過我覺得基本上還是會先洗牌洗完再處理這部份...
QRCode有套件可以用,
現在自己寫的人不多了,
Google一下就可以找得到.