Re: [請益] 關於一些遊戲的AI
演算法真的很重要.....
如果想用隨機落子去算完五子棋所有可能的話
迴圈總共要跑 (15*15)! 次
其實,只要稍微加上一點方式去計算一下
就可以知道哪些是廢步,那些是可能棋步,那些是必要的步數(不下那邊就會輸)
http://i.imgur.com/NMOWU.jpg
![](https://i.imgur.com/NMOWU.jpg)
最左上角是相鄰判斷
判斷方式很簡單,就是
100010001
021121120
013232310
012444210
1234棋4321
012444210
013232310
021121120
100010001
不論黑白、權重都一樣
這樣可以把可能的走法壓縮到25步之內
右上角是棋型評分判斷
簡單來講,就是假設落子到那點後
會生成怎麼樣的棋型......
這部分先擱著
來講一下勝負判斷
五子棋因為是「棋子連在一起」才能得勝
也就是說,所有勝負、威脅都只跟落子那一點有關
因此,我判斷勝負時
會指定某點(落子點),以那一點向外(上下左右、以及四個斜向)去找看看棋型種類
最後找到的可能棋型,會是這21種之一
落子點 → 向外
O O O O O
O O O O X
O O O O 。
O O O 。 。
O O O X *
O O O 。 X
O O X * *
O O 。 X *
O O 。 。 *
O X * * *
O 。 X * *
O 。 。 * *
O O O 。 O
O O 。 O O
O 。 O O O
O O 。 O 。
O O 。 O X
O 。 O O 。
O 。 O O X
O 。 O X *
O 。 O 。 *
X是異色或是牆壁
。是空格
*是任意,代表是什麼都不會有影響
然後再去找對稱的位置,看另外一邊的棋型是什麼
就能知道,這一條線上是連成五子,或是單四、跳格四、活三....
***OXX。O* 0
***OXX。。* 21 單二
***OXO*** 0 沒有
**O。XXXXX 50 五子
**O。XXXXO 41 單四
**O。XXXX。 42 雙四
(略)
兩邊組合一下,可能性有 21*20/2+21=231種 (兩邊可以互換,所以不是21*21)
因為才231種而已,就手動判斷一下棋型,做成列表
在跑程式時讓程式去查表,判斷棋型
回到右上角的棋型評分判斷
只要能知道落子後會生成什麼棋型
就可以給每種棋型一種分數,然後去計算那個點的分數
這實質上跟判斷勝負是一樣的
/*
link[0][5]=0; //直接獲勝 (五子)
link[0][4]=0; //單四、活四
link[0][3]=0; //活三
link[0][2]=0; //活二、單二
link[0][1]=0; //被完全堵死
link[0][0]=0; //block數 block越多越糟糕
*/
//評價公式
int ans= k[0][4]*50+k[0][3]*30+k[0][2]*2-k[0][1]*3-k[0][0]*2
+k[1][4]*35+k[1][3]*10+k[0][2]*1-k[1][1]*2+k[1][0]*1;
這邊就只是調整參數而已
我不期望每次都能算出最佳解答
我寫這個只是,想用暴力去找出必勝棋步時,比較有效率一點而已
是期望將正確棋步壓縮在十五步之內,最好在十步之內就能找出來。
至於下面那張圖是把距離跟相鄰判斷做一下相加
因為有時候AI會下到遠的地方去
目前是想把算過的棋步記錄在資料庫中
這樣可以省下很多重覆計算的步驟
例如,同樣的盤面,不論落子順序為何,都不會影響判斷出來的棋步
還有,在存棋步時,其實可以旋轉一下、鏡射一下
這樣馬上就能做出其他8張棋譜的數據了。(三次旋轉、一次鏡射)
是想問.....
算完這些步數後,怎麼抓出必勝棋譜的路徑樹出來?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.75.195
推
12/07 00:10, , 1F
12/07 00:10, 1F
推
12/07 01:08, , 2F
12/07 01:08, 2F
推
12/07 01:10, , 3F
12/07 01:10, 3F
→
12/07 01:11, , 4F
12/07 01:11, 4F
推
12/07 01:38, , 5F
12/07 01:38, 5F
→
12/07 01:48, , 6F
12/07 01:48, 6F
→
12/07 01:49, , 7F
12/07 01:49, 7F
→
12/07 01:50, , 8F
12/07 01:50, 8F
→
12/07 01:51, , 9F
12/07 01:51, 9F
→
12/07 01:52, , 10F
12/07 01:52, 10F
→
12/07 01:52, , 11F
12/07 01:52, 11F
→
12/07 01:53, , 12F
12/07 01:53, 12F
→
12/07 01:53, , 13F
12/07 01:53, 13F
推
12/07 04:36, , 14F
12/07 04:36, 14F
→
12/07 04:37, , 15F
12/07 04:37, 15F
→
12/07 04:37, , 16F
12/07 04:37, 16F
→
12/07 04:38, , 17F
12/07 04:38, 17F
→
12/07 04:38, , 18F
12/07 04:38, 18F
→
12/07 04:39, , 19F
12/07 04:39, 19F
→
12/07 04:40, , 20F
12/07 04:40, 20F
→
12/07 04:40, , 21F
12/07 04:40, 21F
→
12/07 04:41, , 22F
12/07 04:41, 22F
推
12/07 09:40, , 23F
12/07 09:40, 23F
→
12/07 09:44, , 24F
12/07 09:44, 24F
推
12/07 09:51, , 25F
12/07 09:51, 25F
→
12/07 09:53, , 26F
12/07 09:53, 26F
→
12/07 09:53, , 27F
12/07 09:53, 27F
→
12/07 11:41, , 28F
12/07 11:41, 28F
推
12/07 12:45, , 29F
12/07 12:45, 29F
→
12/07 12:45, , 30F
12/07 12:45, 30F
→
12/07 12:50, , 31F
12/07 12:50, 31F
→
12/07 12:51, , 32F
12/07 12:51, 32F
→
12/07 18:08, , 33F
12/07 18:08, 33F
推
12/07 20:37, , 34F
12/07 20:37, 34F
推
12/07 20:43, , 35F
12/07 20:43, 35F
→
12/07 21:04, , 36F
12/07 21:04, 36F
→
12/07 21:05, , 37F
12/07 21:05, 37F
→
12/07 21:10, , 38F
12/07 21:10, 38F
推
12/07 21:35, , 39F
12/07 21:35, 39F
→
12/08 02:29, , 40F
12/08 02:29, 40F
→
12/08 02:35, , 41F
12/08 02:35, 41F
→
12/08 02:36, , 42F
12/08 02:36, 42F
→
12/08 02:37, , 43F
12/08 02:37, 43F
→
12/08 02:37, , 44F
12/08 02:37, 44F
→
12/08 02:38, , 45F
12/08 02:38, 45F
→
12/08 02:38, , 46F
12/08 02:38, 46F
→
12/08 02:39, , 47F
12/08 02:39, 47F
→
12/08 02:40, , 48F
12/08 02:40, 48F
→
12/08 02:40, , 49F
12/08 02:40, 49F
→
12/08 02:41, , 50F
12/08 02:41, 50F
→
12/08 02:41, , 51F
12/08 02:41, 51F
→
12/08 02:42, , 52F
12/08 02:42, 52F
→
12/08 02:42, , 53F
12/08 02:42, 53F
→
12/08 02:42, , 54F
12/08 02:42, 54F
→
12/08 02:43, , 55F
12/08 02:43, 55F
→
12/08 02:43, , 56F
12/08 02:43, 56F
→
12/08 02:44, , 57F
12/08 02:44, 57F
→
12/08 02:45, , 58F
12/08 02:45, 58F
→
12/08 02:46, , 59F
12/08 02:46, 59F
推
12/08 02:49, , 60F
12/08 02:49, 60F
→
12/08 02:49, , 61F
12/08 02:49, 61F
討論串 (同標題文章)