999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于攻防估分算法的智能五子棋游戲設計

2018-01-15 01:42:47潘雨馨李文彬
現代計算機 2017年34期

潘雨馨,李文彬

(1.岳陽市一中,岳陽414006;2.湖南理工學院,岳陽414006)

0 引言

五子棋是一種兩人對弈的純策略型棋類游戲,是世界智力運動會競技項目之一,是一種增強思維、趣味橫生、大眾喜愛的智力游戲。五子棋對弈雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成5子連線者獲勝[1]。

設計和研發智能型五子棋游戲程序,可以在休閑時為人們提供對戰的樂趣,可以幫助新手在一定程度上提高棋藝。目前,關于五子棋游戲的智能算法主要有:估分函數[2-3]、博弈樹搜索[4-5]、深度學習[6]等。其中,博弈樹是基于未來可能的所有或部分棋局進行搜索而做出有利的判斷,由于博弈樹的規模龐大,需要設計復雜的算法進行狀態空間剪枝。深度學習則是通過與海量棋局中進行強化學習,從而使程序具備不斷改進的自我學習能力,但學習過程需要先進的高性能計算設備的支持。而估分函數主要是基于當前棋局的有利形勢判斷進行落子決策,計算量較小,易于實現,非常適合大眾型智力游戲設計。

現有基于估分函數的五子棋算法,主要通過棋型判斷計算攻防得分,并根據攻防得分的大小確定進攻或防守的落子位置。這類算法往往在攻防策略選擇上比較單一,很容易被對手適應。本文提出基于多種攻防策略的估分選擇算法,考慮在棋型分值較高時,選擇最有利進攻或防守位置的落子;在整體棋型分值較低時,選擇在攻防差距最大的位置落子,使棋局朝最有利于AI方發展。

1 數據結構設計

AI版五子棋游戲的主要數據結構包括五個矩陣:棋盤狀態矩陣currBoard、進攻得分矩陣offScore、防守得分矩陣defScore、連子空位矩陣conBlank、棋型矩陣chessSituation。其中:

(1)棋盤狀態矩陣currBoard是一個15×15的二維矩陣,每個元素的值表示棋盤上每個下棋點的狀態:1表示黑棋,-1表示白棋,0表示沒有棋子。

圖1 五子棋游戲棋盤結構

(2)進攻得分矩陣offScore是一個15×15的二維矩陣,記錄AI方的進攻得分,每個元素的值表示AI方在該位置放置棋子的得分。若該位置已有棋子,則置為0。

(3)防守得分矩陣offScore是一個15×15的二維矩陣,記錄AI方的防守得分,每個元素的值表示棋手方在該位置放置棋子的得分。若該位置已有棋子,則置為0。

(4)連子空位矩陣conBlank是一個4×3的二維矩陣,記錄從當前空位沿橫、豎、撇、捺四個方向的連子和空位情況。例如,假設AI方是白棋,位置(4,4)的棋型說明如表1所示(紅色圓圈標記),在行(橫)方向,它的左空位數是3,連子數是2,右空位數是1。

表1 位置(4,4)的連子和空位情況

(5)棋型矩陣chessSituation是一個2×5的二維矩陣,記錄某位置成5、活4、死4、活3等棋型情況。五子棋的得分棋型大致可以分為以下幾種:

成5:五子連珠。

活4:兩邊均不被攔截的四子連珠。

死4:一邊被攔截的四子連珠。

活3:兩邊均不被攔截的三字連珠。

死3:一邊被攔截的三字連珠,且另一邊空位數不小于2。

活2:兩邊均不被攔截的二子連珠,且兩邊空位總數不小于3。

死2:一邊被攔截的二子連珠,且另一邊空位數不小于3。

活1:兩邊均不被攔截的單子,且兩邊空位總數不小于4。

死1:一邊被攔截的單子,且另一邊空位數不小于4。

例如,假設AI方是白棋,位置(6,6)的進攻得分棋型如表2所示(藍色圓圈標記),橫方向是死2,豎方向是死2,撇方向是活3,捺方向是活1。棋型矩陣chess-Situation矩陣的總和等于4。

表2 位置(6,6)的得分棋型情況

2 核心算法設計

AI版五子棋游戲的核心算法包括:勝負判斷算法、棋型估分算法和攻防選擇算法。

2.1 勝負判斷算法

在不考慮禁手的情況下,五子棋勝負判斷算法主要通過橫、豎、撇、捺四個方向是否存在五子連珠的情況。勝負判斷算法判斷每一次落子是否會導致棋局的輸贏。勝負判斷算法主要由兩個子算法組成:獲取落子位置連珠范圍算法getRange()和五子連珠算法cont-Five()。其中getRange()取落子位置橫、豎、撇、捺四個方向的棋子狀態情況(用一維數組表示);contFive()判斷是否存在五子連珠。

算法1落子位置連珠范圍算法getRange()public boolean getRange(int row,int col){

//行

if(contFive(currBoard[row]))

return true;

//列

int b[]=new int[15];

for(int k=0,i=0;i

b[k]=currBoard[i][col];

if(contFive(b))

return true;

//主對角線

int c[]=new int[15];

for(int k=0,i=Math.max(0,row-col),j=Math.max(0,col-row);i

c[k]=currBoard[i][j];

if(contFive(c))

return true;

//副對角線

int d[]=new int[15];

for(int k=0,i=Math.min(14,row+col),j=Math.max(0,col+row-14);i>=0&&j

d[k]=currBoard[i][j];

if(contFive(d))

return true;

return false;

}

算法2五子連珠算法contFive()public boolean contFive(int[]a){

for(int i=0;i<=a.length-5;i++){

int s=0;

for(int k=0;k<5;k++)

s=s+a[i+k];//連續5個之和

if(s==5||s==-5)

return true;

}

return false;

}

2.2 棋型估分算法

棋型估分算法計算空子位置的攻、防得分,給AI程序提供落子參考。棋型估分算法主要由三個子算法組成:連子空位計算calc_conBlank()、棋型評估算法calc_situation()、攻防計分算法scoring()。其中,calc_conBlank()計算落子位置的連子情況及兩端的空位情況;calc_situation()計算沿橫、豎、撇、捺四個方向出現的成5、活4、死4等各種棋型的統計情況;scoring()根據落子位置的棋型統計情況計算該位置的進攻、防守得分。

算法3連子空位算法calc_conBlank()

public void calc_conBlank(int f){//f表示棋子類型

if(currBoard[i][j]==0){//行

int k=1;//左

temp[0][0]=1;//temp表示連子空位矩陣con-Blank

while(j-k>=0&&currBoard[i][j-k]==f){//連子

temp[0][0]++;

k++;

}

while(j-k>=0&&(currBoard[i][j-k]==0||currBoard[i][j-k]==f)){//左空位或同色棋子

temp[0][1]++;

k++;

}

k=1;

while(j+k<15&&currBoard[i][j+k]==f){

temp[0][0]++;

k++;

}

while(j+k<15&&(currBoard[i][j+k]==0

||currBoard[i][j+k]==f)){

temp[0][2]++;

k++;

}

}

}

算法4棋型評估算法calc_situation()public void calc_situation(int[][]temp){

for(int h=0;h<4;h++){

if(temp[h][0]>=5)

s[4][0]++;

else if(temp[h][0]==4&&(temp[h][1]>=1&&temp[h][2]>=1))

s[3][1]++;//活4

else if(temp[h][0]==4&&(temp[h][1]>=1||temp[h][2]>=1))

s[3][0]++;//死4

else if(temp[h][0]==3&&(temp[h][1]>=1&&temp[h][2]>=1))

s[2][1]++;//活3

else if(temp[h][0]==3&&(temp[h][1]+temp[h][2]>=2))

s[2][0]++;//死3

else if(temp[h][0]==2&&(temp[h][1]+temp[h][2]>=3&&

temp[h][1]>=1&&temp[h][2]>=1))

s[1][1]++;//活2

else if(temp[h][0]==2&&temp[h][1]+temp[h][2]>=3)

s[1][0]++;//死2

else if(temp[h][0]==1&&(temp[h][1]>=3&&temp[h][2]>=3))

s[0][1]++;//兩端空位均超過3的單子

else if(temp[h][0]==1&&temp[h][1]+temp[h][2]>=4)

s[0][0]++;//單子}}

算法5攻防計分算法scoring()public void scoring(int f){

if(s[4][0]>=1)//成5

b=100;

else if(s[3][1]>=1||s[3][0]>=2||s[2][0]>=2||(s[3][0]>=1&&s[2][1]>=1))

b=90;

else if(s[2][1]==1&&s[2][0]>=1)//活 3死 3

b=80;

else if(s[3][0]==1)//死4

b=70;

else if(s[2][1]==1)//活3

b=60;

else if(s[1][1]>=2)//雙活2

b=50;

else if(s[2][0]==1)//死3

b=40;

else if(s[1][1]==1)

b=30;

else if(s[1][0]>=1)

b=20;

else if(s[0][1]>=1)

b=15;

else if(s[0][0]>=1)

b=5;

//將得分保存到進攻、防守矩陣

if(f==-1)

offScore[i][j]=b;

else

defScore[i][j]=b;

}

2.3 攻防選擇算法

攻防選擇算法off_def_choice()提供了4種策略進行攻防選擇:在最大進攻得分位置落子、在最大防守得分位置落子、在最大攻防得分正差位置落子、在最大攻防得分負差位置落子。當最大攻防得分大于等于80時,根據最大攻防得分的大小,選擇在最大進攻或防守位置落子。當最大攻防得分小于80時,根據最大攻防正負差得分的大小,選擇在最大正差或最大負差位置落子。

算法6攻防選擇算法off_def_choice()public void off_def_choice(){

int max1=0;//最大進攻得分

int max2=0;//最大防守得分

int max3=0;//最大進攻防守得分正差

int max4=0;//最大進攻防守得分負差

//進攻防守得分

max1=scoring(-1);

max2=scoring(1);

//進攻防守差距計分

int[][]gap=new int[15][15];

for(int i=0;i<15;i++)

for(int j=0;j<15;j++){

gap[i][j]=offScore[i][j]-defScore[i][j];

if(gap[i][j]>max3)max3=gap[i][j];

if(gap[i][j]

max4=gap[i][j];

}

//進攻防守選擇

if(max2>=80||max1>=80){

if(max2>=max1)

System.out.println("在最大防守得分位置落子");

else

System.out.println("在最大進攻得分位置落子");

}else if(Math.abs(max3)>Math.abs(max4))

System.out.println("在最大攻防得分正差位置落子");

else

System.out.println("在最大攻防得分負差位置落子");

}}

3 結語

本文針對五子棋游戲,設計了一種基于攻防得分的智能評估算法。對每個可落子的位置,計算該位置連子數和兩端空位數,統計該位置出現成5、活4等各種棋型的情況,進一步計算該位置進攻和防守得分,并設計攻防選擇四種策略,指導AI程序完成落子。與其他基于單一攻防策略的算法相比,該算法具有更好的棋局判斷能力。

[1]劉瑞.五子棋人工智能算法設計與實現[D].華南理工大學,2012.

[2]徐建.五子棋的一種價值的估算[J].智能計算機與應用,2016,6(5):90-92.

[3]卓明敏,黃正亮,廖小于.五子棋級數算法[J].福建電腦,2012,28(4):94-96.

[4]張明亮,吳俊,李凡長.五子棋機器博弈系統評估函數的設計[J].計算機應用,2012,32(7):1969-1972.

[5]王長飛,蔡強,李海生.智能五子棋算法的設計實現[J].系統仿真學報,2009,21(4):1051-1054.

[6]史忠植.突破通過機器進行學習的極限[J].科學通報,2016(33):3548-3556.

主站蜘蛛池模板: 四虎精品黑人视频| 亚洲国产成人综合精品2020| 国产农村妇女精品一二区| 亚洲人成影院在线观看| 99re这里只有国产中文精品国产精品 | 婷婷综合在线观看丁香| 日韩精品亚洲一区中文字幕| 免费一级毛片在线观看| 国产免费人成视频网| 2021最新国产精品网站| 99在线视频精品| 亚洲天堂精品在线| 青草国产在线视频| 性69交片免费看| 免费人成视网站在线不卡 | 在线日韩一区二区| 国产成人喷潮在线观看| 亚洲精品国产自在现线最新| 精品人妻无码区在线视频| 国产真实二区一区在线亚洲| 三级视频中文字幕| 欧美日韩中文国产| 亚洲无码免费黄色网址| 欧美丝袜高跟鞋一区二区| 伊人久久婷婷| 亚洲女同一区二区| 久久99蜜桃精品久久久久小说| 为你提供最新久久精品久久综合| 国产成人亚洲精品无码电影| 亚洲国产精品一区二区第一页免 | 欧洲极品无码一区二区三区| 亚洲综合色区在线播放2019| 一区二区自拍| 午夜精品福利影院| 国产成人亚洲综合A∨在线播放| 极品尤物av美乳在线观看| 天天综合网亚洲网站| 操美女免费网站| 9cao视频精品| 亚洲精品视频网| 亚洲日韩Av中文字幕无码| 日本成人精品视频| 久久香蕉国产线看观| 好紧太爽了视频免费无码| 精品午夜国产福利观看| 亚洲熟女中文字幕男人总站| 亚国产欧美在线人成| av大片在线无码免费| 久久婷婷六月| 免费国产好深啊好涨好硬视频| 亚洲无码高清免费视频亚洲| 午夜精品影院| 国产精品免费入口视频| 91丨九色丨首页在线播放| 国产精品一区二区不卡的视频| AV不卡无码免费一区二区三区| 亚洲有无码中文网| 欧美五月婷婷| 性激烈欧美三级在线播放| 亚洲国产精品国自产拍A| 亚洲福利一区二区三区| 精品国产成人三级在线观看| 欧美激情第一区| 97影院午夜在线观看视频| 97国内精品久久久久不卡| 激情五月婷婷综合网| 欧美激情综合一区二区| 国产精品嫩草影院av| 久久天天躁狠狠躁夜夜躁| 欧美日韩国产系列在线观看| 成人永久免费A∨一级在线播放| 亚洲综合亚洲国产尤物| 国产精品视频第一专区| 97青青青国产在线播放| 国产成人免费| 欧美另类一区| 日韩中文无码av超清| 国产高清色视频免费看的网址| aⅴ免费在线观看| 国产草草影院18成年视频| 欧美日本不卡| 一级一级特黄女人精品毛片|