五子棋人機對戰(zhàn)代碼_第1頁
五子棋人機對戰(zhàn)代碼_第2頁
五子棋人機對戰(zhàn)代碼_第3頁
五子棋人機對戰(zhàn)代碼_第4頁
五子棋人機對戰(zhàn)代碼_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、8.2 電腦下棋算法設計本款游戲最核心的地方就是算法,因為這是整個程序最難的模塊。算法的中心思想是:利用分數(shù)代表每個位置的重要程度,越重要的位置的分數(shù)值會越高,當電腦下棋時會先將電腦和玩家棋型的分數(shù)分別計算一遍,然后選擇二者中分數(shù)最高的點下子。如果玩家的分數(shù)高,那么代表電腦應該防守,如果電腦的分數(shù)高,那么代表電腦應該進攻。 具體的分數(shù)值賦值如下:分數(shù)電腦玩家活二6050半活二4035死二1010半死二1010活三950700半活三900650死三100100半死三100100活四60003500半活四50003000死四4000800半死四3600750活五2000015000半活五10000

2、3300死五2000015000半死五100003300解釋一下其中的活,半活,死,半死:活:代表幾個子是相連的,中間沒有空格,兩端都至少有一個空格。半活:代表幾個子不是相連的,幾個子中間有一個空格,兩端都至少有一個空格。死:代表幾個子是相連的,中間沒有空格,但有一端緊挨著對方的棋子或有一端正好在棋盤的邊界。半死:代表幾個子不是相連的,幾個子中間有一個空格,而且一端緊挨著對方的棋子或有一端正好在棋盤的邊界。每個位置的分數(shù)的計算方式是各個方向的分數(shù)相加,最后找出電腦棋型和玩家棋型的分數(shù)的最高的位置為電腦的下棋點下棋。具體的代碼如下:public void qixing()for(int i=0;

3、i<17;i+)for(int j=0;j<17;j+)if(qipani+1j+1=0)/說明此處沒有棋子qixingPCij = heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);qixingPlayerij = heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);elseqixingPCij = 0;qixingPlayerij = 0;/ 算出黑子橫方向的棋型數(shù)值public int heiheng(int hang,int

4、lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/記錄可以形成幾連int n = hang+1;/對應棋盤的行int m = lie+1;/對應棋盤的列boolean left = false;/判斷左邊是否有黑子boolean liveLeft = false;/判斷左邊是活還是死boolean liveRight = false;/判斷右邊是活還是死while(qipannm-1!=-1)&&(qipannm-1=num|qipannm-1=0)if(qipannm-1=0&&k<1)/第一個空白if(qipa

5、nnm-2!=num)liveLeft = true;break;k+;m-;else if(qipannm-1=num)/黑子left = true;m-;else/第二個空白liveLeft = true;break;if(!left)k = 0;m = lie+1;while(qipannm+1!=-1)&&(qipannm+1=num|qipannm+1=0)int t = qipannm+1;if(m=lie)count+;m+;continue;if(t=0&&k<1)/第一個空白if(qipannm+2!=num)liveRight = tr

6、ue;break;k+;m+;else if(t=0&&k>0)/第二個空白liveRight = true;break;else/黑子m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/算出黑子豎方向的棋型數(shù)值public int heishu(int hang,int lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/記錄可以形成幾連int n = hang+1;/對應棋盤的行int m = lie+1;/對應棋盤的列boolean top = false;/判斷上

7、邊是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m!=-1)&&(qipann-1m=num|qipann-1m=0)if(qipann-1m=0&&k<1)/第一個空白if(qipann-2m!=num)liveLeft = true;break;k+;n-;else if(qipann-1m=num)/黑子top = true;n-;else/第二個空白liveLeft = true;break;if(!top)k = 0;n = hang+1;while(q

8、ipann+1m!=-1)&&(qipann+1m=num|qipann+1m=0)int t = qipann+1m;if(n=hang)count+;n+;continue;if(t=0&&k<1)/第一個空白if(qipann+2m!=num)liveRight = true;break;k+;n+;else if(t=0&&k>0)/第二個空白liveRight = true;break;else/黑子n+;count+;/return jieguo(k=0,count);return jieguo(liveLeft,live

9、Right,count,k,num);/算出黑子左斜方向的棋型數(shù)值public int heizuoxie(int hang,int lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/記錄可以形成幾連int n = hang+1;/對應棋盤的行int m = lie+1;/對應棋盤的列boolean top = false;/判斷上邊是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann+1m-1!=-1)&&(qipann+1m-1=num|qipann

10、+1m-1=0)if(qipann+1m-1=0&&k<1)/第一個空白if(qipann+2m-2!=num)liveLeft = true;break;k+;n+;m-;else if(qipann+1m-1=num)/黑子top = true;n+;m-;else/第二個空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1;while(qipann-1m+1!=-1)&&(qipann-1m+1=num|qipann-1m+1=0)int t = qipann-1m+1;if(n=(ha

11、ng+2)&&m=lie)count+;n-;m+;continue;if(t=0&&k<1)/第一個空白if(qipann-2m+2!=num)liveRight = true;break;k+;n-;m+;else if(t=0&&k>0)/第二個空白liveRight = true;break;else/黑子n-;m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/算出黑子右斜方向的棋型數(shù)值public int heiyouxie(int hang,int lie,i

12、nt num)int k = 0;/記錄空白處的個數(shù)int count = 1;/記錄可以形成幾連int n = hang+1;/對應棋盤的行int m = lie+1;/對應棋盤的列boolean top = false;/判斷上邊是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m-1!=-1)&&(qipann-1m-1=num|qipann-1m-1=0)if(qipann-1m-1=0&&k<1)/第一個空白if(qipann-2m-2!=num)liveL

13、eft = true;break;k+;n-;m-;else if(qipann-1m-1=num)/黑子top = true;n-;m-;else/第二個空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1;while(qipann+1m+1!=-1)&&(qipann+1m+1=num|qipann+1m+1=0)int t = qipann+1m+1;if(n=hang&&m=lie)count+;n+;m+;continue;if(t=0&&k<1)/第一個空白if(q

14、ipann+2m+2!=num)liveRight = true;break;k+;n+;m+;else if(t=0&&k>0)/第二個空白liveRight = true;break;else/黑子n+;m+;count+;return jieguo(liveLeft,liveRight,count,k,num);public int jieguo(boolean left,boolean right,int count,int k,int num)if(count=1)return 0;else if(count=2)if(left&&right)i

15、f(k=0)if(num=2)return 60;elsereturn 50;elseif(num=2)return 40;elsereturn 35;else if(!left&&!right)return 0;elsereturn 10;else if(count=3)if(left&&right)if(k=0)if(num=2)return 950;elsereturn 700;elseif(num=2)return 900;elsereturn 650;else if(!left&&!right)return 0;elsereturn 100;else if(count=4)if(left&&right)if(k=0)if(num=2)return 6000;elsereturn 3500;elseif(num=2)retu

溫馨提示

  • 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

提交評論