java 五子棋之人機對戰思路詳解

2021-09-08 09:37:02 字數 1026 閱讀 5434

最近做了五子棋,記錄下自己完成五子棋的人機對戰的思路。

首先,思路是這樣的:每當人手動下一顆棋子(黑子)的時候,應當遍歷它周圍棋子的情況,並賦予周圍棋子一定的權值,當在機器要下棋子(白子)守護之前,會遍歷整個棋盤的權值情況(棋盤的權值存在乙個二維陣列中),從中找出權值最大的點座標,並下子(白子)。

這樣的話,問題就集中在兩個方面了,乙個是:如何遍歷黑子周圍的棋子情況? 另乙個是:如何設定權值?

首先,是設定權值。這個沒有固定的設定方案,可以先試著設定,然後,嘗試效果後(主要是白子的攻防情況是否合理),再調整。

以下是我的設定方案:

接著,是相對困難的部分,就是如何遍歷黑子周圍的棋子情況。 從之前權值方案中可以看到,設定權值的乙個很重要的目的是為了進行防守,所以應當在連續黑子的兩端(下面圖中的橙色區域)設定權值,這樣就有利於白子填充在連續黑子的兩端,從而達到防守的目的,下面這張圖可以說明:

中心的黑子:表示當前所下的黑子,周圍的棋子表示是之前下的。

紅色箭頭:表示需要遍歷的八個方向,因為中心黑子的座標(i, j)是已知的,所以很容易得到周圍的棋子座標(i+n, j+m)。

橙色方框:表示連續黑子的末端,可能是空白(表示還沒有棋子填充),也可能是白子。

接著是演算法思想:

首先,應當先判斷敵方棋子(黑子)第一次下的時候(敵方棋子先下),此時,周圍八個棋子都是空的,於是應當對周圍八個點賦予相同的權值(活一),當遍歷整個棋盤後,便在這八個點中隨機選擇乙個(用隨機數),填上黑子。

接著,敵方繼續下子,如果敵方當前所下棋子與之前的棋子連續,則會構成活二或者眠二(以此類推,會構成活三眠三~~

),這時,根據權值表,會賦予周圍棋子更大的權值(權值應當是累加的,也就是說,當前權值 

+= 之前權值),最後遍歷後,下白子。

JS五子棋之人機對戰

文章目錄 1.效果圖 2.ui篇 3.ai篇 先來看看最終實現的效果吧!勝利顯示 主要是使用canvas繪製棋盤以及棋子 canvas繪製棋盤 for var i 0 i 9 i canvas繪製棋子部分 var onestep function i,j,me i,j表示棋盤索引,me表示黑棋或白棋...

五子棋人機對戰

參考 人機對戰 填子遊戲的攻防策略 關於機器的應對策略,在前文中有所表述,不一一解釋,本文進行了修繕和補強,但漏銅依然存在。增加了乙個倒計時功能,測試了一下,感覺一般,還是留在那裡,表明曾經研究過,供今後完善 增加了棋譜儲存功能和回放功能 增加了悔棋功能,這個還是有些用處的。另外策略中增加了禁手。如...

Java五子棋 人人對戰

五子棋是國內受到普遍歡迎的一款遊戲,規則簡單,趣味不俗。作為一名程式設計師,自然也希望將它移植到電腦上。這篇我們要講的主要就是實現簡單的人人對戰,ai演算法放到以後單獨說。我們先來整理一下脈絡,看看實現五子棋需要哪些內容 按鈕的監聽我們新增在actionperformed方法 使用這個方法需要新增a...