1. 程式人生 > >五子棋(人機對弈)——Java權值法五子棋博弈

五子棋(人機對弈)——Java權值法五子棋博弈

五子棋人機博弈

五子棋,人與人之間博弈,我們不用考慮太多,都是玩家自動思考。
但是如果我們要玩一個單機的五子棋,實現人機的對戰,那麼我就得“幫”電腦考慮下走哪步了。
實現的方法大概有三種:

  1. 最大權值法
  2. 決策樹法
  3. 機器學習訓練

這裡我們主要針對第一種方法討論下,大致思路如下:

  1. 我們繪製好一個棋盤後,假定大小為 15*15;
  2. 下棋之前,對於棋盤中的每個空位,我們每都替電腦人“掂一掂”下在哪裡合算;(估權過程)
  3. 對每個空位按照規則都計算完權重,我們找出權重最大的位置,此位置就是npc落子位置

那麼現在的問題就是,這個權重的計算規則是怎樣的呢?
首先,我們思考一下人是怎麼下子的。

  1. 當該位置四周為空時,這個位置落子可能就不是那麼有意義;
  2. 我們最大可能地去實現將棋子相連,若該位置四周已出現一條連線,則連子數越多,該子越重要
  3. 就算一條線有很多子已經相連,如果該線的一端被堵住,那麼該線的重要程度降低,我們稱之為眠連,otherwise,兩端都沒堵住我們稱之為活連。

現在我們來將棋子相連的情況進行下歸類賦權

空子位置我們用 “0” 表示,白子用“2”表示,黑子用“1”表示;
我們主要分為以下幾種情況:

定義 棋子相連情況 權值
活一連 010、020 40
活二連 0110、0220 400
活三連 01110、02220 3000
活四連 011110、022220 10000
眠一連 012、021 20
眠二連 0112、0221 200
眠三連 01112、02221 500
眠四連 011112、022221 3000

主要被分為了以上幾類,當然可以考慮更多以使你的npc更加“智慧”;

現在考慮演算法

對於每個空位,我們從四個方向進行考察:

  • 水平
  • 豎直
  • 左斜
  • 右斜

我們以水平方向為例進行程式碼考察:

    int go[row][column];   //記錄每個點的落子情況
    int weightarr[row][column];  //記錄每個空位的權值 

    for piece in chessboard{
        if(piece為空){
            key1="0";    //記錄空位左邊連子情況
            key2="0";    //記錄空位右邊連子情況
            (i,j)為空位座標
            ux=i;uy=j;   //(ux,uy)記錄左邊連子邊界
            dx=i;dy=j;   //(dx,dy)記錄右邊邊界
            first1=0;
            first2=0;    
            //first1 記錄空位左邊第一個子顏色,first2記錄右邊第一個顏色
            //while的目的在於找到最多的顏色相同的連線
            while(左邊不越界){
                int first=go[i-1][j].color;
                first1=first;
                if(first==0) break;   //如果空位相鄰也為空,退出
                else {      //如果不為空位
                    --ux;
                    if(顏色和first相同) {
                        key1+=go[ux][uy].color;
                    }
                    else {
                        key1+=go[ux][uy].color;
                        break;
                    }
                }   
            }
            while(右邊不越界){
                    ...   //和上面同理
            }
            value1=左邊連線權值;
            value2=右邊連線權值;
            if(左右連線顏色相同) 權值翻倍;
            weightarr[i][j]+=該方向權值;

            //同理,依此計算 左斜,右斜,豎直情況;
        }   
    }

要注意的是,因為對於每個大方向,比如說水平方向,我們以該空位做間斷點分了水平左和水平右,當水平左和水平右的顏色相同時,權值注意要加強,因為比如說隔開的2個黑子和1個黑子填上空位可以變成4個黑子;

相關推薦

五子棋(人機對弈)——Java五子棋博弈

五子棋人機博弈 五子棋,人與人之間博弈,我們不用考慮太多,都是玩家自動思考。 但是如果我們要玩一個單機的五子棋,實現人機的對戰,那麼我就得“幫”電腦考慮下走哪步了。 實現的方法大概有三種: 最大權值法 決策樹法 機器學習訓練 這裡我們主要針對第

五子棋人機對弈程式碼——java

演算法是窮舉遞迴法,只不過用java重新寫了一遍 import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.event.ActionEvent

java五子棋實現---博弈

花了很多天學習的一個關於五子棋的博弈樹,記錄一下。先講一下五子棋的基本實現過程:一、介面實現Gobang.javashow(){}main(){}paint(){}視窗使用Border佈局,寫倆JPanel,一個畫棋盤,一個做動作按鈕。這裡要注意的有兩點:一是重繪機制,直接把

基於PyQt5的五子棋程式設計(人機對弈

這篇部落格主要是為了學習Python和PyQt,因為對棋類遊戲比較熱衷,所以從規則較簡單的五子棋入手,利用PyQt5實現圖形介面,做一個可以進行人機對弈的指令碼,最後打包成應用程式。AI的演算法打算用神經網路來完成,正在苦學TensorFlow中。 本來我以為

java五子棋人機對戰演算法分析

        五子棋人機對戰採用的演算法,目前大都是搜尋樹演算法,用一棵樹來表示棋局發展的 種種可能性,這種樹叫做博弈樹(對局樹)。根節點表示對局的開始狀態,每一種可 能的走法造成的結果作為其子節點,而對每一個這樣的子節點,考慮另一方的各種 可能應對,作為下一層的子節點,這

D. Powerful array 離線+莫隊算 給定n個數,m次查詢;每次查詢[l,r]的計算方法:區間某個數x的個數cnt,那麽貢獻為cnt*cnt*x; 所有貢獻和即為該區間的

code ++ 計算方法 equal ati contains tdi ces sum D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input st

poj3565 Ants km算求最小完美匹配,浮點

相交 else 浮點數 獲取 外部 ring 找不到 cst 如果能 /** 題目:poj3565 Ants km算法求最小權完美匹配,浮點權值。 鏈接:http://poj.org/problem?id=3565 題意:給定n個白點的二維坐標,n個黑點的二維坐標。 求是

POJ-2195 Going Home---KM算求最小匹配(存負邊)

for 二分圖 ostream lse ons nod esp 範圍 預處理 題目鏈接: https://vjudge.net/problem/POJ-2195 題目大意: 給定一個N*M的地圖,地圖上有若幹個man和house,且man與house的數量一致。man每移動

樣條插Java

Coding trace 算法 top writer 檢查 block 技術分享 iter 該程序包含:樣條插值法、讀取文件,寫入文件,字符型轉double型方法等; 適合初學Java的人學習; 在cmd中執行, 在Linux中執行 完整代碼如下: 樣條插值法:

JAVA實現簡單控制檯五子棋遊戲

GobangMain這個類是遊戲的主方法,主要用於控制遊戲的執行,值得注意的是輸入的座標的格式是3,4的樣式,不能是其他的格式,也不能出現空格。 package com.qf.Gobang; import java.util.Scanner; import org.omg.COR

為什麼在神經網路裡面使用梯度下降對模型的矩陣進行調整

我們都知道,神經網路是先將模型引數的調整問題轉換為一個求某個損失函式的極小值問題,然後通過梯度下降演算法讓引數選擇合適的值使得該損失函式取得極小值。那麼為什麼梯度下降演算法可以完成這個任務呢? 假設一個

java實現牛頓插

本程式碼經過本人優化後可直接執行,感謝支援! import java.util.Scanner; public class Newton_interpolation { /*拷貝向量*/ private static void copy_ve

Java GUI 單機版五子棋

  前言   剛開始學java時接觸到GUI,一時興起寫了個五子棋,五子棋的關鍵點在於判斷輸贏,其他的都沒什麼,現在翻出來整理並記錄下來,不足之處還望各位路過的大佬多多指教。   程式碼實現   程式碼不多,四百多行,全都在這個類裡面,直接執行main函式就可以看到效果,JDK用的是1.7 @

中國象棋人機對弈搜尋演算法學習-極大極小,負極大值,alpha-beta演算法

極大極小值法 深度搜索(dfs)虛擬碼 /** 1。 p 為棋盤 2。 d 為規定的搜素最大深度,比如d層紅方,d-1層為黑方,d-2層為紅方...依此類推,可採用mod2來判斷當前是哪一方 4。評估棋盤的函式evaluation,當然需要看

神經網路例程-梯度下降更新

以下程式碼來自Deep Learning for Computer Vision with Python第九章。 一、梯度下降法(Gradient Decent) # import the necessary packages from sklearn.model_s

java 自己寫的五子棋程式 原始碼和大家分享

//wuziqi.java import java.applet.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.awt.Color; public

五子棋AI演算法 Java實現

五子棋AI演算法 也算是一個典型的遊戲AI演算法,一些棋類的AI演算法都可以參考實現,下面是Java實現程式碼 棋盤抽象介面 import java.util.List;   publicinterface IChessboard {  

五子棋人機對戰完整程式碼

一,五子棋棋盤棋盤正中一點為“天元”。棋盤兩端的橫線稱端線。棋盤左右最外邊的兩條縱線稱邊線。從兩條端線和兩條邊線向正中發展而縱橫交叉在第四條線形成的四個點稱為“星”。以持黑方為準,棋盤上的縱軸線從左到右用英文字母A~O標記。橫行線從近到遠用阿拉伯數字1~15標記。縱橫軸上的橫

梯度下降更新理論

使用3層的神經網路(包含輸入層和輸出層)來演示是如何工作的。 網路:input 3個節點;hidden 3個節點;output 3個節點 引數:input:矩陣是3*1的矩陣;為3*3的矩陣;為3*3的矩陣;output:矩陣為3*1的矩陣 計算hidden層節點的矩陣

使用Java語言編寫一個五子棋UI介面並實現網路對戰功能(非區域網)

使用Java語言編寫一個五子棋UI介面並實現網路對戰功能(非區域網) 一,前期準備 1,Java IDE(Eclipse)與JDK的安裝與配置jdk-15.0.1-免配置路徑版提取碼:earu免安裝版Eclipse 解壓即可使用提取碼:5iyy 網路上很多配置jdk的方法,我不再重複 這裡提供一種便捷操作的方