iT邦幫忙

3

請問想寫遊戲的 AI 該如何入門(例如:麻將、撲克牌之類…)

最近看了一些問題覺得大家都好佛心,所以斗膽來問一下之前想問但不敢問的問題…

本來只是想寫個下黑白棋的程式當練習
寫著寫著就在想要怎麼弄個電腦對手

查了 google 好像要靠有限狀態機、決策樹或路徑搜尋等演算法
但對哪種模式適合用在哪一種情境沒有概念
如果想實作遊戲 AI 的話用什麼遊戲當練習來起手會比較好呢?

想學習這個技術有沒有推薦的教學資源?或是有推薦什麼關鍵字?
能有個小範例或引導的題目是最好的
有沒有文章在寫遊戲 AI 的演進?

(我比較熟悉的程式語言是C#跟javascript,但推薦的資源不限語言~)

runan5678 iT邦新手 1 級 ‧ 2018-09-27 12:14:36 檢舉
外行人隨便講,先決定應對邏輯之後把應對邏輯寫出來就是個基本的電腦對手,以前看過象棋遊戲使用某個棋譜的應對方式做為電腦對手,和一般人的下法明顯有差異就是。 比較進階的可以參考SLG類型遊戲,敵人回合的對應模式
gameboxer iT邦新手 4 級 ‧ 2018-09-27 12:28:48 檢舉
https://goo.gl/ZI6dHy
@runan5678
 我也有試過用 SLG 的邏輯來想,先檢視幾格範圍內的敵人再決定行動之類的 XD
@gameboxer
 這位大大的意思是想寫遊戲先學 C++ 嗎 'A`..
8
fysh711426
iT邦研究生 4 級 ‧ 2018-09-27 21:05:29
最佳解答

以前學習演算法時有碰過

  • 棋類的複雜度
    四子棋 < 黑白棋 < 五字棋 < 西洋棋 < 象棋 < 圍棋

前五種用基本的演算法就可以得到不錯的效果,
而圍棋因為複雜度太高,需要用類似機器學習的方式來訓練,才能達到一定的程度。

那時候我做的是四子棋,用到 遊戲樹Min-Max 搜尋Alpha-Beta 剪枝 這三個演算法,棋類對局相關的 AI 基本上都可以用這三個演算法來實作,這篇有說明:
http://programmermagazine.github.io/201407/htm/focus3.html

遊戲樹:
https://ithelp.ithome.com.tw/upload/images/20180927/20106865Kd8Y7eTJ80.jpg

遊戲樹大概長這樣子,由當前局面開始利用遞迴展開成樹狀圖,每一個節點代表每一個棋步,棋步太多不可能全部展開,因此這裡需要寫一個規則去判斷當前局面棋步的優先順序,照著優先順序展開一個範圍的棋步。

遊戲樹的每一層由敵我交替,到最後一層時會有一個審局函數將葉節點標上分數,審局函數是這個演算法的核心,審局越精準 AI 的效果越佳,Min-Max 搜尋是指,審局函數計算完後,會往根節點傳遞,在敵方層要取分數小的節點去走,在我方時要取分數大的節點走,這樣交替下去就能取得對我方最優的走法。

全部展開的樹狀圖太龐大可以利用 Alpha-Beta 剪枝來優化效能,遊戲樹中的有些分支其實是不用往下走的,大概就是利用 Min-Max 取最小和取最大的特性,將分支中已經出現 大於最小小於最大 的部分砍掉。

遊戲樹的重點在 審局函數遞迴深度,遞迴越深越精準,可以利用不同的深度來控制遊戲難度,但展開遊戲樹非常耗效能,需要在效能和精準度上取得平衡。

這個算是很基礎的 AI,我在學這個的時候深度學習還沒紅起來,如果用深度學習來做應該可以達到更好的效果,不過還沒有機會接觸這塊。


在學遊戲 AI 時,遊戲中 NPC 的反應和 BOSS 的戰鬥 AI 適合用 有限狀態機 來做。

有限狀態機:

https://ithelp.ithome.com.tw/upload/images/20180927/20106865Sj8ZF9CyFU.jpg

有限狀態機大概長這樣子,圓圈代表每個狀態,相連的線為觸發條件,狀態間可以是單向也可以是雙向,AI 就是透過狀態機不斷的循環來完成 NPC 或 BOSS 的動作。

而遊戲的路徑搜尋,比較常用 A 星演算法,之前有用來做過簡單的老鼠走迷宮,這些都是在學時學的,上班後都在做 Web 相關,幾乎沒在接觸這塊,覺得好懷念,我還是喜歡寫遊戲啊。

/images/emoticon/emoticon02.gif

看更多先前的回應...收起先前的回應...
Homura iT邦高手 1 級 ‧ 2018-09-27 23:36:38 檢舉

神人出現了/images/emoticon/emoticon04.gif

好詳細的回應哪 /images/emoticon/emoticon02.gif
看到了好多新(對我來說XD)的關鍵字
非常感謝您的回答 .. 剛加完班才看見
待我精神好一點的時候再重新拜讀一次 <(_ _)>

wwx iT邦好手 1 級 ‧ 2018-09-28 09:49:16 檢舉

其實很像遊戲外掛的邏輯

只是把人會想做的事先安排好

但是參數因人而異,所以要可以設定參數

就像有的人血量40%就想回血,有的人20%才想回血,
又可能因場合有不一樣的想法,戰鬥中還是一般狀態,
吃藥還是術法,還是靠時間自動慢慢恢復...

AI則是加上統計資料作為邏輯,
把各種參數各種行動與相關目標的排列組合下,
進行結果的資料收集,統計勝率/獲益...等數據,
在利用統計結果於相符性高的的條件下選擇較優的對策,
...

說真的,
如果遊戲中的NPC使用Server統計的資料
跑真AI的話,玩家是受不了的...
(玩家的行動被紀錄與統計分析)

最後AI終究是人工智慧,人想多少就有多少,
有了系統後還需持續的調整,增加參數,增加統計項目,
增加行為模式,增加策略...

不僅要精神好,還要很熱衷,不間斷無止盡的觀察各種可能細節...

fysh711426 iT邦研究生 4 級 ‧ 2018-09-28 10:26:46 檢舉

Homura
在學時學的拉,都是比較基礎的東西,後來就去學 Web 了,所以有一點概念但不精。
/images/emoticon/emoticon06.gif

fysh711426 iT邦研究生 4 級 ‧ 2018-09-28 10:50:35 檢舉

rainbowrain
加班到早上 5.00 嗎
/images/emoticon/emoticon17.gif

Homura iT邦高手 1 級 ‧ 2018-09-28 11:56:12 檢舉

rainbowrain
加班到5:00
可以離職了/images/emoticon/emoticon16.gif

有為了跳槽在做準備了,也是準備跳 WEB
只是這次出的包覺得自己也有責任所以才會搞一整晚
平常沒有這麼慘烈 XD

但還是想有機會碰一下有興趣的東西,感覺蠻好玩的
只是一邊上班一邊上課,可能還要過些時間才能摸了 ...
謝謝 fysh711426 提供的教學~
有這些應該已經夠我到時候起步玩好一陣子了/images/emoticon/emoticon12.gif

testh iT邦新手 4 級 ‧ 2018-09-28 16:15:46 檢舉

想到RO外掛吃王

fysh711426 iT邦研究生 4 級 ‧ 2018-09-28 18:53:57 檢舉

wwx
遊戲 AI 不能太聰明,要設計的笨一點,玩家把 BOSS 打死或下棋贏過電腦獲得成就感,才會想要繼續玩下去,哈哈哈。

fysh711426 iT邦研究生 4 級 ‧ 2018-09-28 19:01:24 檢舉

rainbowrain
歡迎再上來交流心得。
/images/emoticon/emoticon01.gif

fysh711426 iT邦研究生 4 級 ‧ 2018-09-28 19:07:58 檢舉

testh
聽你們這麼一說,好像真有點規劃按鍵精靈的感覺。
/images/emoticon/emoticon39.gif

2

謝謝您還特地找了 javascript 跟 C# 版本的資源 @@
井字遊戲我用 javascript 做過了,的確是很好的練習
但我的 code 不像您提供的教學模組的這麼好,還要再加強
我現在進一步想做的是自己一個人玩的話有 AI 對手

如果單由人類玩家進行遊戲
麻將、西洋棋、撲克牌或桌遊之類的話我應該都能做
但如果要由 AI 模仿玩家進行遊戲的話不太有概念…

井字遊戲可能還行,直斜橫線成雙的時候優先阻擋
不需要阻擋的時候優先讓自己成雙
其他複雜遊戲就不知道用什麼樣的思路來設計 orz

其他複雜遊戲就不知道用什麼樣的思路來設計?
無論是複雜還是簡單的遊戲,就是把自身的應對寫成程式,
當對手作了某個動作,會依據這動作的條件做出反應,
而AI的難度取決於應對方式的好壞,這樣想要創造AI應該就不會困難了

可能我之前把這件事想的太複雜結果腦中只剩下一團迷霧…
再想想您說的話確實道理都近似於做井字遊戲
把遇到時候情境下什麼判斷先一一列出就對了
這樣看起來這個部份果然沒有捷徑阿 orz

5
小魚
iT邦高手 1 級 ‧ 2018-09-27 11:59:45

AI要自己寫,
網路上不確定會不會有,
而且撲克牌每個遊戲的AI都不一樣,
每個人寫出來的可能也會不一樣,
之前有自己做了一個撿紅點的,
很簡單的邏輯,
有分三種難度,
到我的網站去抓就可以下載了,
(當然是沒有原始碼)
小魚的個人網站
如果真的想學,
最快的方式就是想辦法進入業界,
很多東西是商業機密不會告訴別人的.

才剛從資策會結業,目前在專案公司上班,正在準備轉職 WEB 開發
現在應該不會走遊戲業 QQ(早十年的話應該就衝了)
想學這個是個人興趣

您的撿紅點還可以選難度,好專業阿…
難度設計也是我覺得蠻難想通的點 XD
是設定某個機率亂下牌這樣嗎?

另外請問您的 QR Code 辨識是使用套件還是自己讀 bitmap?

小魚 iT邦高手 1 級 ‧ 2018-09-27 12:26:29 檢舉

其實沒那麼難,
我都用簡單的邏輯而已,
難度最高的就是全部搜尋一遍,
看手上哪張牌可以拿到最多點就打出來,
最簡單的就是亂數隨便抽一張打出來,
(就是所謂的陪打的就是了)
不過自己玩偶爾也會輸給最簡單層級的...
/images/emoticon/emoticon16.gif
有時候拿到的牌太爛也是無可奈何的,
畢竟我的抽牌是完全亂數的...
如果要像有些麻將要什麼大三元大四喜的牌型的,
那個就需要思考過了,
不過我覺得基本上還是會先洗牌洗完再處理這部份...

QRCode有套件可以用,
現在自己寫的人不多了,
Google一下就可以找得到.

jacky419452
iT邦見習生 0 級 ‧ 2019-06-02 13:39:00
【**此則訊息已被站方移除**】

我要發表回答

立即登入回答