五子棋智能下棋怎麼實現的?來揭曉吧
源碼鏈接:Java五子棋小遊戲(控制檯純Ai算法)java
基本權重計算
如今說說五子棋勝算是怎樣斷定的
這裏就說到權重 若是你下棋的位置的權重是 4 那麼你就能得到遊戲的勝利算法
這裏說位置 1>2>3>4>O 的權重
O 的最大權重是4 若是他在這個位置下棋了 那麼他就能得到遊戲的勝利緩存
這裏的O表明着下棋的位置this
有的人怪說了 若是下棋的位置位於中間呢 正好集齊5個棋子
這裏也要說明一下spa
反向計算權重
像這種狀況 其實能夠反向查詢權重 而後把它加起來
例如圖中 1>5> O 的方向 假如後面還有兩個棋子
那麼下 O 的位置就會得到遊戲勝利
咱們能夠反向取權重 前面權重是2 後面權重是2 加起來正好是4 因此得到遊戲勝利.net
稍後在高級算法詳解code
權重實現代碼
這裏我本身把以前發的 java代碼扣過來了blog
/* x 和 y 表明座標 * xx :x方向須要增長的值 * yy :y方向須要增長的值 * * 例如xx = -1 yy= -1 * 表明須要獲取(x-1,y-1)的棋子 * * xx = 1 yy= 1 * 表明須要獲取(x+1,y+1)的棋子 * * */ /** * 計算權重 * @param x x座標 * @param y y座標 * @param xx x方向 * @param yy y方向 * @param size 緩存變量若是當前檢測是棋子是你的棋子 * 那麼就會保存這個變量繼續遞歸獲取下一個位置的權重 * @param c 本身的棋子顏色 * @return 返回計算後的權重 */ private int ishas(int x,int y,int xx,int yy,int size ,char c){ //邊緣檢測防止超出棋盤位置 if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1)) return size; //若是 if(table[x+xx][y+yy] == c){ return ishas(x+xx,y+yy,xx,yy,size+1,c); } return size; }
計算權重僞代碼–若是看着上面的費勁看這個
char table [16][16] ;//棋盤 /* * x 和 y 表明座標 * xx :x方向須要增長的值 * yy :y方向須要增長的值 * * 例如xx = -1 yy= -1 * 表明須要獲取(x-1,y-1)的棋子 * * xx = 1 yy= 1 * 表明須要獲取(x+1,y+1)的棋子 * */ 計算權重( x, y, xx, yy ,初始權重 簡稱 -> 權重 , 你棋子的顏色 簡稱 -> 顏色){ //邊緣檢測防止超出棋盤位置 if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1)) return 權重; //不能計算牆之外的 因此直接返回權重 /*上面這句話的意思是 就拿 第一個 (x==0&&xx==-1) 來講: 若是他的橫座標爲x 那麼 就不能再進行x-1操做了 由於棋盤就這麼大 */ //這裏假設 xx 和 yy = 1 //若是棋盤裏的指定的格子(x+1,y+1)的顏色和你的棋子顏色同樣 那麼就對那個棋子在進行一次計算權重 if(table[x+xx][y+yy] == 顏色){ return 計算權重( x+xx,y+yy , xx , yy , 權重+1, 顏色);//遞歸 // x座標 y座標 下一個棋子方向 本次計算權重+1 顏色不變 } //若是不等直接把權重的值返回 return 權重; }
遊戲運算僞代碼
這裏用僞代碼寫吧排序
char table [16][16]; //棋盤 Player p1 = new Player("P1","黑"); //這裏就不弄類了 懂啥意思就行 Player.下棋(){ //裏面定義的方法 控制檯輸入 <- (4,6) table[4][6] = this.棋子顏色 判斷勝負(this.棋子顏色); } 判斷勝負(x,y,棋子顏色){ ...各類方向判斷... 這裏就拿 xx = 1 ,yy = 1 來講 就是依次判斷右下角是否是跟你下的棋子顏色同樣 // 這裏判斷右下角權重 這裏是反方向判斷左上角權重 int n = ishas(x,y,xx,yy,0,c) + ishas(x,y,-xx,-yy,0,c); 若是他們的權重之和等於4 那麼 if(n>=4) 遊戲結束 } while(遊戲結束條件){ Player p = 獲取下棋玩家(輪到誰返回誰); p.下棋() 打印棋盤(); }
一個十分簡陋的程序就寫出來了 ,這就是遊戲運行過程
單拿這個代碼建立兩個玩家 ,能夠人對人下棋遞歸
Ai是怎麼下棋的
人與人的PK方法已經知道了 下面就來講說Ai下棋算法思路
仍是拿權重的圖
初級算法
- 發現對我有威脅的格子 我要趕忙補坑
- 對我威脅不大的 我走我本身的
僞代碼實現
char table [16][16]; //棋盤 List<棋子> 棋子列表; // Ai 玩家 也是玩家 因此 他有玩家的功能 只不過下棋方式 是本身定義的 class AiPlayer extends Player{ @重寫 下棋(){ //裏面定義的方法 控制檯輸入 <- 智能計算(4,6) table[4][6] = this.棋子顏色 判斷勝負(this.棋子顏色); } 智能計算(){ *是否第一步--> return 隨機中間棋子(8,8) // 本身棋子的顏色 簡稱 -> 本身 // 對手棋子的顏色 簡稱 -> 對手 遍歷全部格子 ->結果(x,y,當前格子顏色){ if(當前格子顏色 == 空){ //兩個都要計算而且把計算結果保存到棋子類 計算權重(x,y,對手)-->兩個方向計算權重 計算權重(x,y,本身)-->兩個方向計算權重 //若是權重同樣那麼 對手權重-1 讓本身先來 誰的權重大--> 棋子列表.加入棋子(new 棋子(x,y,權重)) } } //遍歷完畢 棋子列表.按權重排序() 返回棋子 = 棋子列表.get(0); return (返回棋子); } }
以後再更新高級算法
- 反向計算權重算法
- 跨步算法
- 隔空跨步算法
- 推算算法:猜想若是你下了這步棋 計算對手落子是否對本身有害
- 全局算法:你每一次下棋 ->進行一次分叉樹計算 ->取獲勝概率最大的一步棋
- 陣法初步
- 等等等…
下一篇[Java五子棋小遊戲-Ai算法精講以及實現]-02-高級算法初步
源碼鏈接:Java五子棋小遊戲(控制檯純Ai算法)