今天我想要分享一下我做五子棋ai的思路。因為在做這個之前,我沒有接觸過任何像這種類似的東西。通過這一次,我也算是有所了解,我的思路也是來自很多網路上的部落格,看了很多,最終總結出了自己的這樣乙個。
那我的五子棋是15*15的大小(一般也就是這樣的乙個大小)。我的ai演算法要求每一次落子之後都要去計算每乙個空暇的位置的「分值」,簡單的說,我們需要乙個存放棋子的陣列,表示是否存放了棋子,還要乙個計算每乙個空格的陣列來記錄「分數」,這個分數是後期ai用來運算的基礎,也是你ai難度控制的點。
我現有的思路就是分兩部分。首先是如果是玩家先落子,那麼要求電腦ai隨即在你落子的地方的任意乙個方向,隨機落子,這是第一步。接下來以後就正式進入到演算法中去。
首先初始化你的分數陣列,讓他們全部為零。然後在每一次落子之後進行全盤的遍歷,如果發現該處為空白,於是檢查其四周www.cppcns.com八個方向(當然如果是邊緣位置就相對修改,判斷是否出了邊界)。若在空白處,且發現在某一對角線方向發現有乙個其他顏色的棋子,那麼相對的給這個空白區域的分數陣列加上一定的分值,然後繼續往這個方向檢測是否還有連續的同一顏色的棋子,若沒有則檢查其他方向或者檢測下乙個空白位置。若是還在同一方向上面找到了相同顏色的棋子,那麼第二個棋子的出現,你可以給改空白處加上雙倍的分值,表明這個空白位置更加重要。一次類推,繼續檢測。(ps:因為最終ai棋子落在什麼地方,依靠的是最後遍歷整個分數陣列,然後根據分數的高低來進行判斷落子落在**的,在下面講)。
經過上一遍的遍歷,每一次落子都會使得分數陣列得到一些變化,每一次都會導致ai判斷的變化。在這個基礎上,每一次落子還要進行一次對自己本身棋子顏色的乙個遍歷,判斷自己的情況,同時加分加在分數陣列之中,這樣一來,電腦就會根據自己的棋子的情況以及玩家的落子情況進行判斷,哪乙個地方更加適合落子。
因為我是第一次做ai,網路上搜到的一些思想一般也是這種類似的遍歷思想。理解了以後寫**就比較方便。最後可能會有一些點的分數程式設計客棧是相同的,所以還有設定一下隨機落子。把分數相同的地點隨機落子。
個人感覺ai的強弱是根據你每一次給他增加分數的多少來確定的。這個我的ai有時候也會抽風,不過一般情況比較正常,可能運氣也佔了一部分,當初設計加分的時候其實沒想那麼多,現在卻發現好像還不錯。
大家要多去實踐練習,多改改分數可能就會出來不錯的ai了,o(^▽^)o。
下面貼上我的**!
void gamescene::robot(int *x, int *y, int *sum)
} ch[*x][*y] = tp; //記錄這個點
printpart(*x, *y, tp); //列印出電腦ai第一次落子
istouch = true;
tp++;
tp = tp % 2;
} else //從第2步開始,使用評分系統
}
void gamescene::findscore(int &x, int &y) //查詢評分最高的座標
} }
x2 = x1; y2 = y1;
for (i = 0; i<15; i++) //可能的話,有評分相同的多個點
} }
} if (x2 != x1 || y2 != y1) //棋盤上有2個最高分
else
} else //棋盤上只有乙個最高分
max = 0; //清空最大值
程式設計客棧ch[x][y] = tp; //記錄這個點
printpart(x, y, tp); //列印出電腦ai落子
if (winervalue==2)
tp++;
tp = tp % 2; }
inline void gamescene::chessone(int &x, int &y) //玩家走第1步時的落子
} else if (lx == 1)
} else if (lx == 2)
} else if (lx == 3)
} else if (lx == 4)
} else if (lx == 5)
} else if (lx == 6)
} else
} }
} } }
void gamescene::chessscore()
else if (ch[x + k*i][y + k*j] == 2) //這點是個空點,+1後退出
else //否則是牆或者對方的棋子了
} for (k = -1; k >= -4; k--) //向它的相反方向判斷
else if (ch[x + k*i][y + k*j] == 2) //這點是個空點,+1後退出
else
} if (number2 == 1) //2個棋子
else if (number1 == 2) //3個棋子
else if (empty == 2)
} else if (number1 == 3) //4個棋子
else if (empty == 2)
} else if (number1 >= 4)
empty = 0; //統計空點個數的變數清零
//對電腦落點評分
for (k = 1; i <= 4; k++) //迴圈4次
else if (ch[x + k*i][y + k*j] == 2)
else
} for (k = -1; k >= -4; k--) //向它的相反方向判斷
else if (ch[x + k*i][y + k*j] == 2)
else
} if (number2 == 0)
else if (number2 == 1)
else if (number2 == 2) //3個棋子
else if (empty == 2)
} else if (number2 == 3) //4個棋子
else if (empty == 2)
} else if (number2 >= 4)
number1 = 0; //清零,以便下次重新統計
number2 = 0;
empty = 0;
} }
} }
} }
}本文標題: 基於c++實現五子棋ai演算法思想
本文位址:
五子棋AI演算法簡易實現(五)
這個部分我把它分成了兩個函式 1.找出雙方所有可能下子的位置 generateallnextpossiblemove函式 2.在這些位置中進行挑選,選出能夠產生更大優勢的下子位置,減少博弈樹搜尋節點的次數 pointsfilter函式 2.2 落子位置的篩選這一部分主要參考了 這篇部落格上的寫法,這...
Python實現AI五子棋
開發工具 python版本 3.6.4 graphics模組。環境搭建 安裝python並新增到環境變數即可。注 graphics模組在相關檔案中已經提供,就是乙個py檔案,直接放在當前路徑或者放到python安裝資料夾下的site packages資料夾內均可。原理簡介 對於五子棋這樣的博弈類ai...
基於 剪枝演算法實現的AI五子棋遊戲
一 對抗問題 對抗問題 顧名思義,博弈雙方是帶有對抗性質的。博弈的任何一方都希望局面盡量對自己有利,同時局面也應該盡量令對方不利。通常這一類問題可以通過 minimax 演算法解決。minimax 演算法又名極小化極大演算法,是一種找出失敗的最大可能性中的最小值的演算法。minimax 演算法常用於...