




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、電腦圍棋程序編寫思路荷蒲 荷蒲圍棋軟件的編寫思路。在圍棋程序的實(shí)現(xiàn)中,較為關(guān)鍵的是圍棋電子棋盤的設(shè)計(jì)。其他所有功能都是圍繞圍棋電子棋盤展開的。電子圍棋盤的核心是圍棋棋盤的數(shù)據(jù)描述。 1、首先定義圍棋子信息: #define EDGE 23/棋盤最大格數(shù) #define MAXMM 500 /最大手?jǐn)?shù) /color表示棋子顏色,x,y表示在棋盤上的坐標(biāo) /num表示下子的順序。=0表示提前擺放的子。 /zt 表示棋子狀態(tài) /qs 表示棋子的氣數(shù) /sm 表示有說明信息 typedef struct qizi int color,x,y,num,zt,qs,sm; qizi; qizi
2、 qipuMAXMM; /棋譜信息 qizi qipanEDGEEDGE; /棋盤信息 2、緊接著要考慮的是下棋相關(guān)信息。 int nk=0; /顯示棋子序號(hào),nk=2顯示序號(hào),1=氣數(shù) int BoardLines=19; /棋盤線數(shù),默認(rèn)19 bool ComputerPlaying; /1=該計(jì)算機(jī)下 0=人下 bool Computerp1=0; /1=計(jì)算機(jī)下黑 0=人下 bool Computerp2=0; /1=計(jì)算機(jī)下白 0=人下 int PlayType=0; /2=人-人,1=人-計(jì)算機(jī),13=人-網(wǎng)絡(luò),0=沒有開始,-1=刪除棋盤上死子,-2=
3、暫停,3=布黑子,4=布白子,9=演示,11=學(xué)習(xí) int PlayType1=0; /2=人-人,1=人-計(jì)算機(jī),13=人-網(wǎng)絡(luò),0=沒有開始,-1=刪除棋盤上死子,-2=暫停,3=布黑子,4=布白子,11=學(xué)習(xí) int MoveCount,MoveCount1; /計(jì)步器,記錄落子手?jǐn)?shù),自然順序 int Playnum=0,Playnum1=0; /要標(biāo)識(shí)的圍棋手?jǐn)?shù),下棋順序 int CurrentX; /記錄熱子X坐標(biāo), int CurrentY; /記錄熱子Y坐標(biāo) char CurrentWho; /記錄當(dāng)前棋子顏色,0=黑 1=白 2=空(終局等,待寫) char CurrentWh
4、o1; /備份上一次CurrentWho int timew=0,timeb=0; /計(jì)時(shí)器設(shè)定數(shù)據(jù) int sdy1=0,sdy2=0; /學(xué)習(xí)功能上使用 int gz; /規(guī)則0=中國規(guī)則,1=日本規(guī)則,2=應(yīng)氏規(guī)則 bool plays1=true; /學(xué)習(xí)持黑 bool plays2=false; /學(xué)習(xí)持白 3、圍棋電子棋盤的數(shù)據(jù)初始化。 /數(shù)據(jù)初始化 void wqinit(void) BoardLines=19; /19X19路標(biāo)準(zhǔn)圍棋盤 MoveCount=0; /一步棋未下,自然順序 MoveCount1=0; /一步棋未下 ComputerPlaying=1;
5、 /默認(rèn)電腦執(zhí)黑先行 CurrentWho=0; /默認(rèn)黑先; 黑方=0;白方=1;空方=2; CurrentX=0; /當(dāng)前一步棋的X坐標(biāo),水平從左至右為1.19 CurrentY=0; /當(dāng)前一步棋的Y坐標(biāo),垂直從上到下為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; /清空棋譜記錄,全部設(shè)為無效點(diǎn)。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、根據(jù)圍棋規(guī)則編寫的一些相關(guān)處理函數(shù)模塊 圍棋棋子的吃子,是根據(jù)圍棋棋子的氣數(shù)來計(jì)算的。氣數(shù)為0的棋子應(yīng)當(dāng)從棋盤上拿掉。 圍棋氣數(shù)的計(jì)算問題,應(yīng)當(dāng)說是圍棋軟件的核心問題。 “
7、氣”是指棋子在棋盤上可以連接的交叉點(diǎn),也是棋子的出路。 圍棋的氣數(shù)計(jì)算,要考慮一個(gè)圍棋子的連通問題。 下面的圖形中,交叉點(diǎn)的X代表棋子的氣, 圖1 圖1中右上角的黑子,有兩個(gè)交叉點(diǎn)和它的直線相接,因此它有兩口氣。左上角的黑子有三口氣,而下邊的黑子有四口氣。 圖2 圖2中右邊的黑子有四口氣,中間連接在一起的兩個(gè)黑子有六口氣,而右邊連接在一起的三個(gè)黑子有八口氣。連接在一起的棋子越多,氣也越多。 圖3 圖2中同樣是四個(gè)連接在一起的黑子,左邊的四個(gè)黑棋有十口氣,中間的黑棋只有九口氣,而右邊的黑棋僅有八口氣。 從上面分析,可以得出,計(jì)算一個(gè)棋子的氣,還有分析該棋子周圍的情況,因此我們利用遞歸函數(shù)來解決圍
8、棋氣數(shù)的計(jì)算。實(shí)現(xiàn)方法看下面程序斷。 int goEDGEEDGE; /*表示棋盤 其中第0路和第20路為沉余數(shù)據(jù) 在 (X,Y)下黑子 goxy=0;/ 0表示黑 在 (X,Y)下白子 goxy=1;/ 1表示白子 在 (X,Y)提子 goxy=2; /2表示空子 當(dāng)前棋步脫先pass則 當(dāng)前棋步 X坐標(biāo)=0,y=0 否則 1<=x<=19, 1<=x<=19, */ int gokongEDGEEDGE; /0=該空點(diǎn)未曾計(jì)算過氣,1=已計(jì)算,避免重復(fù)計(jì)算公氣 int goziEDGEEDGE; /0=該子未計(jì)算串氣,1=已計(jì)算,避免重復(fù)計(jì)算同一個(gè)子的
9、氣 int goqi; /氣數(shù) /以上變量聲明為全局變量 void str_qi(int x,int y,int hb) /本函數(shù)計(jì)算 x,y 處的hb顏色棋子的氣 gozixy=1; /標(biāo)記本子已經(jīng)計(jì)算過氣 /右臨子 if (x+1<=19)/如果沒有超出棋盤邊線 if (gox+1y=2)&&(gokongx+1y=0) /如果右臨點(diǎn)為空并且該點(diǎn)未曾計(jì)算過氣則 goqi+; /氣數(shù)加一 gokongx+1y=1; /標(biāo)記本空點(diǎn)已經(jīng)計(jì)算過氣 else if (gox+1y=hb)&&(gozix+1y=0) /否則如果右臨點(diǎn)為
10、和本子同色子并且該子未曾計(jì)算過氣則 str_qi(x+1,y,hb); /遞歸調(diào)用到右臨子 /左臨子 if (x-1>=1) /果沒有超出棋盤邊線 if (gox-1y=2)&&(gokongx-1y=0) /如果左臨點(diǎn)為空并且該點(diǎn)未曾計(jì)算過氣則 goqi+; /氣數(shù)加一 gokongx-1y=1; /標(biāo)記本空點(diǎn)已經(jīng)計(jì)算過氣 else if (gox-1y=hb)&&(gozix-1y=0) /否則如果左臨點(diǎn)為和本子同色子并且該子未曾計(jì)算過氣則 str_qi(x-1,y,hb); /遞歸調(diào)用到左臨子 /下臨子 if (y-1>=1)/如果沒有超出棋盤
11、邊線 if (goxy-1=2)&&(gokongxy-1=0) /如果下臨點(diǎn)為空并且該點(diǎn)未曾計(jì)算過氣則 goqi+; /氣數(shù)加一 gokongxy-1=1; /標(biāo)記本空點(diǎn)已經(jīng)計(jì)算過氣 else if (goxy-1=hb)&&(gozixy-1=0) /否則如果下臨子點(diǎn)為和本子同色子并且該子未曾計(jì)算過氣則 str_qi(x,y-1,hb); /遞歸調(diào)用到下臨子 /上臨點(diǎn) if (y+1<=19)/如果沒有超出棋盤邊線 if (goxy+1=2)&&(gokongxy+1=0) /如果上臨點(diǎn)為空并且該點(diǎn)未曾計(jì)算過氣則 goqi+; /氣數(shù)加
12、一 gokongxy+1=1; /標(biāo)記本空點(diǎn)已經(jīng)計(jì)算過氣 else if (goxy+1=hb)&&(gozixy+1=0) /否則如果上臨點(diǎn)為和本子同色子并且該子未曾計(jì)算過氣則 str_qi(x,y+1,hb); /遞歸調(diào)用到上臨子 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; /初始化變量,表示該子未計(jì)算串氣 gokongij = 0; /初始化變量,表示該空點(diǎn)未計(jì)算串氣 goqi=0;
13、/串氣初值 str_qi(x,y,hb); /調(diào)用串氣子程序 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、子(吃子) 提子:就是把沒有氣的棋子從棋盤上拿掉。 下面函數(shù)實(shí)現(xiàn)提子功能。 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、 圍棋程序設(shè)計(jì)的核心,基本完成,下面是輸贏的判斷問題。 6、圍棋勝負(fù)判斷 圍棋盤上共有三百六十一個(gè)交叉點(diǎn),一盤棋的勝負(fù)就是由對(duì)局雙方所占據(jù)的交叉點(diǎn)的多少所決定的。更精確地說就是由雙方活棋所占據(jù)的地域的大小來決定的。一個(gè)交叉點(diǎn)為一子,每方以一百八十又二分之一子為歸本數(shù),超過此數(shù)者為勝,不足此數(shù)者為負(fù)。 按我國現(xiàn)行的圍棋規(guī)則規(guī)定,由于黑棋先走,有一定的先手威力,應(yīng)由執(zhí)黑的一方貼出2(34)子。所以黑所占的地域必須超過183(14)子(180 (12)2(34)才能取勝。比如黑棋數(shù)出來有185個(gè)子,即黑棋1(34)子。而白方的地域只要超過177(34)子(180(12)2(34)即可獲
16、勝。 圖4 下面函數(shù)實(shí)現(xiàn)計(jì)算圍棋的地域功能。在計(jì)算前,應(yīng)當(dāng)先去掉圍棋中的死子。 / 計(jì)算圍棋的地域 int sum3; /sum0=黑子數(shù)量,sum1=白子數(shù)量 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年房地產(chǎn)投資分析師資格考試試卷及答案
- 小動(dòng)物的冒險(xiǎn)故事童話故事11篇
- 傳承文化走進(jìn)民間藝術(shù)展覽話題6篇
- 電商平臺(tái)技術(shù)升級(jí)與服務(wù)協(xié)議
- 語言學(xué)概論中的語言與文化關(guān)系研究試題
- 2025年陰極銅項(xiàng)目申請報(bào)告
- 云朵上的奇思妙想童話作文(9篇)
- 2025年輔導(dǎo)員職位選拔考試:學(xué)生活動(dòng)策劃與活動(dòng)策劃效果評(píng)估案例分析試題
- 2025年度企業(yè)人力資源管理師(研究員)技能操作試題詳解
- 旅游目的地開發(fā)及推廣合作協(xié)議
- 四川省成都市蓉城聯(lián)盟2024-2025學(xué)年高一下學(xué)期6月期末考試物理試題(含答案)
- 2025年全國新高考II卷高考全國二卷真題英語試卷(真題+答案)
- 經(jīng)濟(jì)法學(xué)-001-國開機(jī)考復(fù)習(xí)資料
- 2024年廣東省中考生物+地理試卷(含答案)
- 小班化教育課堂教學(xué).ppt
- 等效內(nèi)摩擦角計(jì)算表
- 2×1000MW高效清潔燃煤發(fā)電項(xiàng)目建議書寫作模板-
- 繼承不動(dòng)產(chǎn)登記具結(jié)書
- 食堂廚房各種用具清潔規(guī)章
- 信號(hào)點(diǎn)燈電路
- 關(guān)于成立保密工作領(lǐng)導(dǎo)小組的通知
評(píng)論
0/150
提交評(píng)論