Java實現(xiàn)簡單的五子棋游戲示例代碼_第1頁
Java實現(xiàn)簡單的五子棋游戲示例代碼_第2頁
Java實現(xiàn)簡單的五子棋游戲示例代碼_第3頁
Java實現(xiàn)簡單的五子棋游戲示例代碼_第4頁
Java實現(xiàn)簡單的五子棋游戲示例代碼_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論