電腦圍棋程序編寫思路_第1頁
電腦圍棋程序編寫思路_第2頁
電腦圍棋程序編寫思路_第3頁
電腦圍棋程序編寫思路_第4頁
電腦圍棋程序編寫思路_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、電腦圍棋程序編寫思路荷蒲 荷蒲圍棋軟件的編寫思路。在圍棋程序的實現中,較為關鍵的是圍棋電子棋盤的設計。其他所有功能都是圍繞圍棋電子棋盤展開的。電子圍棋盤的核心是圍棋棋盤的數據描述。  1、首先定義圍棋子信息: #define EDGE 23/棋盤最大格數 #define MAXMM 500 /最大手數 /color表示棋子顏色,x,y表示在棋盤上的坐標 /num表示下子的順序。=0表示提前擺放的子。 /zt 表示棋子狀態 /qs 表示棋子的氣數 /sm 表示有說明信息 typedef struct qizi int color,x,y,num,zt,qs,sm; qizi; qizi

2、 qipuMAXMM; /棋譜信息 qizi qipanEDGEEDGE; /棋盤信息   2、緊接著要考慮的是下棋相關信息。   int nk=0; /顯示棋子序號,nk=2顯示序號,1=氣數 int BoardLines=19; /棋盤線數,默認19 bool ComputerPlaying; /1=該計算機下 0=人下 bool Computerp1=0; /1=計算機下黑 0=人下 bool Computerp2=0; /1=計算機下白 0=人下 int PlayType=0; /2=人-人,1=人-計算機,13=人-網絡,0=沒有開始,-1=刪除棋盤上死子,-2=

3、暫停,3=布黑子,4=布白子,9=演示,11=學習 int PlayType1=0; /2=人-人,1=人-計算機,13=人-網絡,0=沒有開始,-1=刪除棋盤上死子,-2=暫停,3=布黑子,4=布白子,11=學習 int MoveCount,MoveCount1; /計步器,記錄落子手數,自然順序 int Playnum=0,Playnum1=0; /要標識的圍棋手數,下棋順序 int CurrentX; /記錄熱子X坐標, int CurrentY; /記錄熱子Y坐標 char CurrentWho; /記錄當前棋子顏色,0=黑 1=白 2=空(終局等,待寫) char CurrentWh

4、o1; /備份上一次CurrentWho int timew=0,timeb=0; /計時器設定數據 int sdy1=0,sdy2=0; /學習功能上使用 int gz; /規則0=中國規則,1=日本規則,2=應氏規則 bool plays1=true; /學習持黑 bool plays2=false; /學習持白   3、圍棋電子棋盤的數據初始化。 /數據初始化 void wqinit(void) BoardLines=19; /19X19路標準圍棋盤 MoveCount=0; /一步棋未下,自然順序 MoveCount1=0; /一步棋未下 ComputerPlaying=1;

5、 /默認電腦執黑先行 CurrentWho=0; /默認黑先; 黑方=0;白方=1;空方=2; CurrentX=0; /當前一步棋的X坐標,水平從左至右為1.19 CurrentY=0; /當前一步棋的Y坐標,垂直從上到下為1.19 timew=0,timeb=0; Playnum=0; /下棋順序 Playnum1=0; /下面是棋盤初始化 for (int i=0;i<=BoardLines;i+) for (int j=0;j<=BoardLines;j+) qipanij.color=2; qipanij.x=0; qipanij.y=0; qipanij.num=0;

6、qipanij.zt=0;   /清空棋譜記錄,全部設為無效點。QiPu0x留作它用 for (int i=0;i<500;i+) qipui.color=2; qipui.x=0; qipui.y=0; qipui.num=0; qipui.zt=0; qipui.sm=0; qpsm1i.n=0; qpsm1i.t=0; strcpy(qpsm1i.sm,"/");   4、根據圍棋規則編寫的一些相關處理函數模塊 圍棋棋子的吃子,是根據圍棋棋子的氣數來計算的。氣數為0的棋子應當從棋盤上拿掉。 圍棋氣數的計算問題,應當說是圍棋軟件的核心問題。 “

7、氣”是指棋子在棋盤上可以連接的交叉點,也是棋子的出路。 圍棋的氣數計算,要考慮一個圍棋子的連通問題。 下面的圖形中,交叉點的X代表棋子的氣, 圖1 圖1中右上角的黑子,有兩個交叉點和它的直線相接,因此它有兩口氣。左上角的黑子有三口氣,而下邊的黑子有四口氣。 圖2 圖2中右邊的黑子有四口氣,中間連接在一起的兩個黑子有六口氣,而右邊連接在一起的三個黑子有八口氣。連接在一起的棋子越多,氣也越多。 圖3 圖2中同樣是四個連接在一起的黑子,左邊的四個黑棋有十口氣,中間的黑棋只有九口氣,而右邊的黑棋僅有八口氣。 從上面分析,可以得出,計算一個棋子的氣,還有分析該棋子周圍的情況,因此我們利用遞歸函數來解決圍

8、棋氣數的計算。實現方法看下面程序斷。   int goEDGEEDGE; /*表示棋盤 其中第0路和第20路為沉余數據 在 (X,Y)下黑子 goxy=0;/ 0表示黑 在 (X,Y)下白子 goxy=1;/ 1表示白子 在 (X,Y)提子 goxy=2; /2表示空子 當前棋步脫先pass則 當前棋步 X坐標=0,y=0 否則 1<=x<=19, 1<=x<=19, */ int gokongEDGEEDGE; /0=該空點未曾計算過氣,1=已計算,避免重復計算公氣 int goziEDGEEDGE; /0=該子未計算串氣,1=已計算,避免重復計算同一個子的

9、氣 int goqi; /氣數 /以上變量聲明為全局變量   void str_qi(int x,int y,int hb) /本函數計算 x,y 處的hb顏色棋子的氣 gozixy=1; /標記本子已經計算過氣   /右臨子 if (x+1<=19)/如果沒有超出棋盤邊線 if (gox+1y=2)&&(gokongx+1y=0) /如果右臨點為空并且該點未曾計算過氣則 goqi+; /氣數加一 gokongx+1y=1; /標記本空點已經計算過氣 else if (gox+1y=hb)&&(gozix+1y=0) /否則如果右臨點為

10、和本子同色子并且該子未曾計算過氣則 str_qi(x+1,y,hb); /遞歸調用到右臨子 /左臨子 if (x-1>=1) /果沒有超出棋盤邊線 if (gox-1y=2)&&(gokongx-1y=0) /如果左臨點為空并且該點未曾計算過氣則 goqi+; /氣數加一 gokongx-1y=1; /標記本空點已經計算過氣 else if (gox-1y=hb)&&(gozix-1y=0) /否則如果左臨點為和本子同色子并且該子未曾計算過氣則 str_qi(x-1,y,hb); /遞歸調用到左臨子 /下臨子 if (y-1>=1)/如果沒有超出棋盤

11、邊線 if (goxy-1=2)&&(gokongxy-1=0) /如果下臨點為空并且該點未曾計算過氣則 goqi+; /氣數加一 gokongxy-1=1; /標記本空點已經計算過氣 else if (goxy-1=hb)&&(gozixy-1=0) /否則如果下臨子點為和本子同色子并且該子未曾計算過氣則 str_qi(x,y-1,hb); /遞歸調用到下臨子 /上臨點 if (y+1<=19)/如果沒有超出棋盤邊線 if (goxy+1=2)&&(gokongxy+1=0) /如果上臨點為空并且該點未曾計算過氣則 goqi+; /氣數加

12、一 gokongxy+1=1; /標記本空點已經計算過氣 else if (goxy+1=hb)&&(gozixy+1=0) /否則如果上臨點為和本子同色子并且該子未曾計算過氣則 str_qi(x,y+1,hb); /遞歸調用到上臨子   int str_lib(int x,int y, int hb) int i,j; for (i = 1; i <= 19; i+) for (j = 1; j <= 19; j+) goziij = 0; /初始化變量,表示該子未計算串氣 gokongij = 0; /初始化變量,表示該空點未計算串氣 goqi=0;

13、/串氣初值 str_qi(x,y,hb); /調用串氣子程序 return(goqi); /全局變量goqi帶回串氣值   void shuanqi(void) int i,j,cc,qq; for (i = 1; i <=19; i+) for (j = 1; j <= 19; j+) goij=qipanij.color; for (i = 1; i <=19; i+) for (j = 1; j <=19; j+) if (goij!=2) cc=goij; qq=str_lib(i,j,cc); qipanij.qs=qq;   5、圍棋的提

14、子(吃子) 提子:就是把沒有氣的棋子從棋盤上拿掉。 下面函數實現提子功能。   void chizi(void) int i,j,qq,cc; shuanqi(); for (i = 1; i <=19; i+) for (j = 1; j <= 19; j+) qq=qipanij.qs; cc=qipanij.color; if (qq=0 && cc!=2 && cc!=CurrentWho) qipanij.color=2; qipanij.x=i; qipanij.y=j; qipanij.num=0; qipanij.zt=0;

15、   圍棋程序設計的核心,基本完成,下面是輸贏的判斷問題。 6、圍棋勝負判斷 圍棋盤上共有三百六十一個交叉點,一盤棋的勝負就是由對局雙方所占據的交叉點的多少所決定的。更精確地說就是由雙方活棋所占據的地域的大小來決定的。一個交叉點為一子,每方以一百八十又二分之一子為歸本數,超過此數者為勝,不足此數者為負。 按我國現行的圍棋規則規定,由于黑棋先走,有一定的先手威力,應由執黑的一方貼出2(34)子。所以黑所占的地域必須超過183(14)子(180 (12)2(34)才能取勝。比如黑棋數出來有185個子,即黑棋1(34)子。而白方的地域只要超過177(34)子(180(12)2(34)即可獲

16、勝。 圖4   下面函數實現計算圍棋的地域功能。在計算前,應當先去掉圍棋中的死子。  / 計算圍棋的地域 int sum3; /sum0=黑子數量,sum1=白子數量 int summ(void) int i=0,j=0,c=2,k=2; sum0=0; sum1=0; sum2=0; for (i=1;i<=19;i+) k=qipani1.color; for (j=1;j<=19;j+) c=qipanji.color; switch (c) case 2: if (k=2) sum2+; else sumk+; break; case 0: if (k=0) sumc+; else if(k=2) sumc=sumc+sum2+1; k=c; sum2=0; else if(k=1) sumc+; k=c; sum2=0; break; case 1: if (k=1) su

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論