今天我想要分享一下我做五子棋AI的思路。因為在做這個之前,我沒有接觸過任何像這種類似的東西。通過這一次,我也算是有所了解,我的思路也是來自很多網(wǎng)絡(luò)上的博客,看了很多,最終總結(jié)出了自己的這樣一個。
那我的五子棋是15*15的大小(一般也就是這樣的一個大小)。我的AI算法要求每一次落子之后都要去計算每一個空暇的位置的“分值”,簡單的說,我們需要一個存放棋子的數(shù)組,表示是否存放了棋子,還要一個計算每一個空格的數(shù)組來記錄“分數(shù)”,這個分數(shù)是后期AI用來運算的基礎(chǔ),也是你AI難度控制的點。
我現(xiàn)有的思路就是分兩部分。首先是如果是玩家先落子,那么要求電腦AI隨即在你落子的地方的任意一個方向,隨機落子,這是第一步。接下來以后就正式進入到算法中去。
首先初始化你的分數(shù)數(shù)組,讓他們?nèi)繛榱恪H缓笤诿恳淮温渥又筮M行全盤的遍歷,如果發(fā)現(xiàn)該處為空白,于是檢查其四周八個方向(當然如果是邊緣位置就相對修改,判斷是否出了邊界)。若在空白處,且發(fā)現(xiàn)在某一對角線方向發(fā)現(xiàn)有一個其他顏色的棋子,那么相對的給這個空白區(qū)域的分數(shù)數(shù)組加上一定的分值,然后繼續(xù)往這個方向檢測是否還有連續(xù)的同一顏色的棋子,若沒有則檢查其他方向或者檢測下一個空白位置。若是還在同一方向上面找到了相同顏色的棋子,那么第二個棋子的出現(xiàn),你可以給改空白處加上雙倍的分值,表明這個空白位置更加重要。一次類推,繼續(xù)檢測。(PS:因為最終AI棋子落在什么地方,依靠的是最后遍歷整個分數(shù)數(shù)組,然后根據(jù)分數(shù)的高低來進行判斷落子落在哪里的,在下面講)。
經(jīng)過上一遍的遍歷,每一次落子都會使得分數(shù)數(shù)組得到一些變化,每一次都會導致AI判斷的變化。在這個基礎(chǔ)上,每一次落子還要進行一次對自己本身棋子顏色的一個遍歷,判斷自己的情況,同時加分加在分數(shù)數(shù)組之中,這樣一來,電腦就會根據(jù)自己的棋子的情況以及玩家的落子情況進行判斷,哪一個地方更加適合落子。
因為我是第一次做AI,網(wǎng)絡(luò)上搜到的一些思想一般也是這種類似的遍歷思想。理解了以后寫代碼就比較方便。最后可能會有一些點的分數(shù)是相同的,所以還有設(shè)置一下隨機落子。把分數(shù)相同的地點隨機落子。
個人感覺AI的強弱是根據(jù)你每一次給他增加分數(shù)的多少來確定的。這個我的AI有時候也會抽風,不過一般情況比較正常,可能運氣也占了一部分,當初設(shè)計加分的時候其實沒想那么多,現(xiàn)在卻發(fā)現(xiàn)好像還不錯。
大家要多去實踐練習,多改改分數(shù)可能就會出來不錯的AI了,o(^ 主站蜘蛛池模板: 襄汾县| 鹿邑县| 巴东县| 娄底市| 行唐县| 托里县| 淮安市| 霸州市| 文山县| 满洲里市| 湘潭县| 武鸣县| 特克斯县| 张家口市| 伊通| 海口市| 洛宁县| 滁州市| 巴里| 嵊州市| 沙田区| 自治县| 大洼县| 呈贡县| 古交市| 汾西县| 莱西市| 万载县| 凤冈县| 六盘水市| 台北县| 虎林市| 湘乡市| 长兴县| 韩城市| 团风县| 平和县| 海南省| 昭平县| 山西省| 富川|