2007/1/30

圈圈金字塔的AI邏輯

AI如果要能夠學習,就必須先能儲存遊戲過程
這個遊戲過程要怎麼存呢?

我採用以下的資料結構
圖解
   1
   23
  456
  789A
 BCDEF

我用二進位來表示
*FED CBA9 8765 4321 這是每個二進位所代表的意義
0000 0000 0000 0000 就是全部都沒畫
0111 1111 1111 1111 就是全部都畫掉

這個二進位轉成整數介於0 - 32767 之間
而且可以使用 AND (&) 判斷某條線是否可以畫

例如原先的圖是(1246被畫) 玩家畫掉DEF
0000 0000 0010 1011  0111 0000 0000 0000

那麼這兩個值 AND 的結果會是0

既然整數會在0 ~ 32767 之間
就表示這遊戲總共有 32768 種情況 (不考慮旋轉和翻轉)
設計時我比較想做成存 32768 種情況的勝率【勝場數 / 勝場數 + 敗場數】
但是要存勝場和敗場兩個值,或是存一個浮點,比較麻煩
於是我的AI存的是這 32768 種情況的【勝場數-敗場數】

原先想用【勝場數-敗場數】 不設上下限,但是怕溢位所以還是設一下
後來發現上下限的值越小,AI的反應就會越快
因為數字從最大到最小所需要的場次變少

所以我讓AI存的值介於 1 到 -1 之間
選擇邏輯是數字大的先隨機選

所以如果你跟AI玩,只要AI輸了
同一種輸法就不太可能出現第二次

大致上是這個樣子...

目前想改的部分是AI玩一場之後,會影響到所有翻轉、旋轉圖形的勝負值

有想過將AI存到資料庫,並且讓玩家連線到網路上的AI
如此一來智障AI就不需要跟智障AI練習了
讓所有玩家一起訓練AI
還不賴 0.0 (可是我不會寫網路程式,我也不會資料庫 >.< )

2 則留言:

匿名 提到...

喔,我對 AI 的作法也很有興趣,
觀點和你差不多,

覺得只需要作好少量的判別式
和大容量的記憶

就可以利用互聯網大量進行智識教育.
日前剛剛在想利用一下 xml+ajax 來作一個AI,正在想像該如何成立記憶單元.的架構且單元之間如何成立關聯

主要問題出現於單元的設計上.
第二步則需要考慮 判別系統的修訂.

卡卡米 提到...

簡單的遊戲可以把遊戲中所有可能出現的狀況都做定義

但是複雜的遊戲就不能這樣做,因為太消耗記憶空間了

關於AI的書中會講到更深入的做法,但是我看不懂0.0