[Java五子棋小遊戲-Ai算法精講以及實現]-01-初步算法

五子棋智能下棋怎麼實現的?來揭曉吧


源碼鏈接: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算法)

相關文章
相關標籤/搜索