基於C 實現五子棋AI演算法思想

2022-10-04 00:21:23 字數 3253 閱讀 8072

今天我想要分享一下我做五子棋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 演算法常用於...