




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Java實現(xiàn)簡單的五子棋游戲示例代碼//-----------------選取局部最優(yōu)的幾個落子點作為下一次擴展的節(jié)點---------//
//bwf棋色0:黑棋1:白棋
//return選出來的節(jié)點坐標
privateint[][]getBests(intbwf){
inti_min=(x_min==0x_min:x_min-1);
intj_min=(y_min==0y_min:y_min-1);
inti_max=(x_max==15x_max:x_max+1);
intj_max=(y_max==15y_max:y_max+1);
intn=0;
inttype_1,type_2;
int[][]rt=newint[(i_max-i_min)*(j_max-j_min)][3];
for(inti=i_min;ii_max;i++)
for(intj=j_min;jj_max;j++)
if(isChessOn[i][j]==2){
type_1=getType(i,j,bwf);
type_2=getType(i,j,1-bwf);
if(able_flagbwf==0(type_1==20||type_1==21||type_1==22))//禁手棋位置,不記錄
continue;
rt[n][0]=i;
rt[n][1]=j;
rt[n][2]=getMark(type_1)+getMark(type_2);
n++;
//對二維數(shù)組排序
Arrays.sort(rt,newArrComparator());
intsize=weightnn:weight;
int[][]bests=newint[size][3];
System.arraycopy(rt,0,bests,0,size);
returnbests;
//----------------------------計算指定方位上的棋型-------------------//
//x,y方向線基準一點。
//ex,ey指定方向步進向量。
//k棋子顏色,0:黑色,1:白色
//該方向上的棋子數(shù)目以及活度
privateint[]count(intx,inty,intex,intey,intbwf){
//該方向沒意義,返回0
if(!makesense(x,y,ex,ey,bwf))
returnnewint[]{0,1};
//正方向以及反方向棋子個數(shù)
intrt_1=1,rt_2=1;
//總棋子個數(shù)
intrt=1;
//正方向以及反方向連子的活度
intok_1=0,ok_2=0;
//總活度
intok=0;
//連子中間有無空格
booleanflag_mid1=false,flag_mid2=false;
//連子中間空格的位置
intflag_i1=1,flag_i2=1;
if(isChessOn[x][y]!=2){
thrownewIllegalArgumentException("positionx,ymustbeempty!..");
inti;
//往正方向搜索
for(i=1;x+i*ex15x+i*ex=0y+i*ey15y+i*eyi++){
if(isChessOn[x+i*ex][y+i*ey]==bwf)
rt_1++;
//位置為空,若中空標志為false,則記為中空并繼續(xù)搜索否則,break
elseif(isChessOn[x+i*ex][y+i*ey]==2){
if(!flag_mid1){
flag_mid1=true;
flag_i1=i;
else
break;
//位置為對方棋子
else
break;
//計算正方向活度,,
//最后一個位置不超過邊界
if(x+i*ex15x+i*ex=0y+i*ey15y+i*ey=0){
//最后一個位置為空位+1活
if(isChessOn[x+i*ex][y+i*ey]==2){
ok_1++;
//若是在尾部檢測到連續(xù)的空格而退出搜索,則不算有中空
if(rt_1==flag_i1)
flag_mid1=false;
//若中空的位置在4以下且棋子數(shù)=4,則這一邊的4非活
if(flag_mid1rt_13flag_i14){
ok_1--;
//最后一個位置不是空格,且搜索了2步以上,若前一個是空格,則不算中空,且為活的邊
elseif(isChessOn[x+i*ex][y+i*ey]!=bwfi=2)
if(isChessOn[x+(i-1)*ex][y+(i-1)*ey]==2){
ok_1++;
flag_mid1=false;
//最后一個位置是邊界搜索了2步以上,且前一個是空格,則不算中空,且為活的邊
elseif(i=2isChessOn[x+(i-1)*ex][y+(i-1)*ey]==2){
ok_1++;
flag_mid1=false;
//往反方向搜索
for(i=1;x-i*ex=0x-i*ex15y-i*ey=0y-i*eyi++){
if(isChessOn[x-i*ex][y-i*ey]==bwf)
rt_2++;
elseif(isChessOn[x-i*ex][y-i*ey]==2){
if(!flag_mid2){
flag_mid2=true;
flag_i2=i;
else
break;
else
break;
//計算反方向活度
if(x-i*ex15x-i*ex=0y-i*ey15y-i*ey=0){
if(isChessOn[x-i*ex][y-i*ey]==2){
ok_2++;
if(rt_2==flag_i2)
flag_mid2=false;
if(flag_mid2rt_23flag_i24){
ok_2--;
elseif(isChessOn[x-i*ex][y-i*ey]!=bwfi=2)
if(isChessOn[x-(i-1)*ex][y-(i-1)*ey]==2){
ok_2++;
flag_mid2=false;
elseif(i=2isChessOn[x-(i-1)*ex][y-(i-1)*ey]==2){
ok_2++;
flag_mid2=false;
//------------------分析棋子類型
//兩邊都沒中空,直接合成
if(!flag_mid1!flag_mid2){
rt=rt_1+rt_2-1;
ok=ok_1+ok_2;
returnnewint[]{rt,ok};
//兩邊都有中空
elseif(flag_mid1flag_mid2){
inttemp=flag_i1+flag_i2-1;
//判斷中間的純連子數(shù),在5以上,直接返回;為4,返回活4;
if(temp=5)
returnnewint[]{temp,2};
if(temp==4)
returnnewint[]{temp,2};
//先看有沒死4,再看有沒活3,剩下只能是死3
if(rt_1+flag_i2-1=4||rt_2+flag_i1-1=4)
returnnewint[]{4,1};
if(rt_1+flag_i2-1==3ok_10||rt_2+flag_i1-1==3ok_20)
returnnewint[]{3,2};
returnnewint[]{3,1};
//有一邊有中空
else{
//總棋子數(shù)少于5,直接合成
if(rt_1+rt_2-15)
returnnewint[]{rt_1+rt_2-1,ok_1+ok_2};
//多于5,先找成5,再找活4,剩下的只能是死4
else{
if(flag_mid1rt_2+flag_i1-1=5)
returnnewint[]{rt_2+flag_i1-1,ok_2+1};
if(flag_mid2rt_1+flag_i2-1=5)
returnnewint[]{rt_1+flag_i2-1,ok_1+1};
if(flag_mid1(rt_2+flag_i1-1==4ok_2==1||flag_i1==4))
returnnewint[]{4,2};
if(flag_mid2(rt_1+flag_i2-1==4ok_1==1||flag_i2==4))
returnnewint[]{4,2};
returnnewint[]{4,1};
//----------------------------判斷指定方向下棋是否有意義,即最大可能的棋子數(shù)是否=5-------------------------------//
//x,y評估的基準點
//ex,ey方向向量
//k棋色
//true:有意義false:沒意義
privateBooleanmakesense(intx,inty,intex,intey,intbwf){
intrt=1;
for(inti=1;x+i*ex15x+i*ex=0y+i*ey15y+i*ey=0rti++)
if(isChessOn[x+i*ex][y+i*ey]!=1-bwf)
rt++;
else
break;
for(inti=1;x-i*ex=0x-i*ex15y-i*ey=0y-i*ey15rti++)
if(isChessOn[x-i*ex][y-i*ey]!=1-bwf)
rt++;
else
break;
return(rt=5);
//------------------------------------棋型判別-------------------------------------//
//x,y落子位置
//bwf棋色0:黑子,1:白子
//對應的棋型:棋型代碼對應如下:
//1:成5
//2:成活4或者是雙死4或者是死4活3
//3:成雙活3
//4:成死3活3
//5:成死4
//6:單活3
//7:成雙活2
//8:成死3
//9:成死2活2
//10:成活2
//11:成死2
//12:其他
//20:長連禁手
//21:雙四禁手
//22:雙活三禁手
protectedintgetType(intx,inty,intbwf){
if(isChessOn[x][y]!=2)
return-1;
int[][]types=newint[4][2];
types[0]=count(x,y,0,1,bwf);//豎直
types[1]=count(x,y,1,0,bwf);//橫向
types[2]=count(x,y,-1,1,bwf);//斜上
types[3]=count(x,y,1,1,bwf);//斜下
//各種棋型的方向的數(shù)目
intlongfive=0;
intfive_OR_more=0;
intfour_died=0,four_live=0;
intthree_died=0,three_live=0;
inttwo_died=0,two_live=0;
//各方向上棋型的判別
for(intk=0;kk++){
if(types[k][0]5){
longfive++;//長連
five_OR_more++;
elseif(types[k][0]==5)
five_OR_more++;//成5
elseif(types[k][0]==4types[k][1]==2)
four_live++;//活4
elseif(types[k][0]==4types[k][1]!=2)
four_died++;//死4
elseif(types[k][0]==3types[k][1]==2)
three_live++;//活3
elseif(types[k][0]==3types[k][1]!=2)
three_died++;//死3
elseif(types[k][0]==2types[k][1]==2)
two_live++;//活2
elseif(types[k][0]==2types[k][1]!=2)
two_died++;//死2
else
//總棋型的判別
if(bwf==0able_flag){//黑棋且選擇有禁手
if(longfive!=0)//長連禁手
return20;
if(four_live+four_died=2)//雙4禁手
return21;
if(three_live=2)//雙活三禁手
return22;
if(five_OR_more!=0)
return1;//成5
if(four_live!=0||four_died=2||four_died!=0three_live!=0)
return2;//成活4或者是雙死4或者是死4活3
if(three_live=2)
return3;//成雙活3
if(three_died!=0three_live!=0)
return4;//成死3活3
if(four_died!=0)
return5;//成死4
if(three_live!=0)
return6;//單活3
if(two_live=2)
return7;//成雙活2
if(three_died!=0)
return8;//成死3
if(two_live!=0two_died!=0)
return9;//成死2活2
if(two_live!=0)
return10;//成活2
if(two_died!=0)
return11;//成死2
return12;
//--------------------------對當前棋面進行打分------------------------------------------------------------//
protectedintevaluate(){
intrt=0,mt_c=1,mt_m=1;
if(bw==sbw)
mt_m=2;
else
mt_c=2;
inti_min=(x_min==0x_min:x_min-1);
intj_min=(y_min==0y_min:y_min-1);
inti_max=(x_max==15x_max:x_max+1);
intj_max=(y_max==15y_max:y_max+1);
for(inti=i_min;ii_max;i++)
for(intj=j_min;jj_max;j++)
if(isChessOn[i][j]==2){
//電腦棋面分數(shù)
inttype=getType(i,j,1-sbw);
if(type==1)//棋型1,棋型2以及棋型3,加權.防止"4個雙活3"的局分大于"1個雙四"之類的錯誤出現(xiàn)
rt+=30*mt_c*getMark(type);
elseif(type==2)
rt+=10*mt_c*getMark(type);
elseif(type==3)
rt+=3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一級建造師考試細節(jié)解析及2025年試題及答案
- 消防設備檢測維護程序試題及答案
- 護理心理輔導試題及答案指導
- 順利通過2025年入團考試試題及答案
- 高級審計師考試復習挑戰(zhàn)及試題及答案
- 醫(yī)療大數(shù)據(jù)驅動的遠程醫(yī)療服務研究
- 中級會計戰(zhàn)略規(guī)劃思路分享試題及答案
- 青年參與社會治理的重要性試題及答案
- 高級會計變革中的機遇試題及答案
- 財務數(shù)據(jù)可視化的重要性試題及答案
- 任務一淘米(教學課件)一年級下冊勞動技術(人美版)
- 門頭承包合同協(xié)議書范本
- 頂管機租憑合同協(xié)議
- 出納人員面試題及答案
- 中招美育考試試題及答案
- 2025年湖南中考英命題分析及復習備考策略指導課件
- 四年級下冊英語競賽試題
- 《全球教育服務貿易》課件
- 玻璃加工協(xié)議書模板
- 2024年廣州市海珠區(qū)招聘事業(yè)單位工作人員考試真題
- 企業(yè)區(qū)塊鏈技術及反洗錢合規(guī)策略分析
評論
0/150
提交評論