版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、五子棋程序1. 項目簡介該程序為簡易的五子棋程序,可以實現(xiàn)人人對戰(zhàn)和人機(jī)對戰(zhàn),并且有自動報警功能,即當(dāng)對方已有一個三連的構(gòu)型時可以提醒你,擁有判斷輸贏的功能,當(dāng)一種顏色的棋的五個子連成一條線時,可判斷誰輸誰贏。擁有復(fù)盤和和悔棋的功能,其中對于復(fù)盤功能,每次你可以選擇顯示下一步或上一步的棋盤,對于悔棋,每次后退兩步,即回到上一輪你要開始下棋的時候。2. 設(shè)計思想程序的主體是根據(jù)玩家選擇的對戰(zhàn)模式,設(shè)計一個讓雙方循環(huán)下棋的程序。根據(jù)題目要求,每次下棋時都會出現(xiàn)一個讓玩家選擇功能的菜單,菜單包括下棋、復(fù)盤、悔棋、退出等功能。這時就要編寫一個程序,讓這個程序根據(jù)玩家的不同選擇做出不同的處理,以滿足玩家
2、的要求。最后便是各種功能相應(yīng)函數(shù)的編寫。以上便是該程序的整體設(shè)計思想。3. 功能及其實現(xiàn)(含源程序)對于該五子棋程序的基本功能,大的方面有如人機(jī)對戰(zhàn)和人人對戰(zhàn)的功能,小的方面有下棋、復(fù)盤、悔棋、警報、判斷輸贏和退出等功能,并且增加了許多人性化設(shè)計,如警報時會有報警提示音,而且字體會變紅的變化。而其中最重要的幾個程序便是人機(jī)對戰(zhàn)程序中電腦算法的編寫、判斷輸贏以及報警程序的編寫、復(fù)盤和悔棋程序的編寫。對于畫棋盤程序,我是這樣編寫的:定義一個整型二維數(shù)組,執(zhí)白棋者每下一子,便根據(jù)該坐標(biāo)給相應(yīng)的二維數(shù)組賦值為1,執(zhí)黑棋者每下一子,便根據(jù)該坐標(biāo)給相應(yīng)的二維數(shù)組賦值為2,未落子的地方,則賦值為0。此時再定
3、義一個字符串二維數(shù)組,掃描前面的整型二維數(shù)組,如果值為1,則將對應(yīng)的字符串?dāng)?shù)組表示為白棋,如果值為2,則將對應(yīng)的字符串?dāng)?shù)組表示為黑棋,如果值為0,則將對應(yīng)的字符串?dāng)?shù)組表示為方框,最后輸出這個字符串?dāng)?shù)組,便畫好了一張棋盤。對于人機(jī)對戰(zhàn)算法,我是這樣思考的:該過程無非是讓電腦根據(jù)當(dāng)前棋盤的落子,在棋盤上選擇一個“最合適”的位置下棋,而“最合適”在程序中實現(xiàn)便是計算當(dāng)前棋盤中價值最大的點。那如何計算價值最大的點呢?這就要根據(jù)棋盤中不同顏色的棋子所構(gòu)成的棋型來判斷。舉個例子,如果棋盤中已有一個對方連成三連的構(gòu)型時,則這三個子的兩頭的且靠近己方的位置便為價值最大的點,則電腦落子時落在這里,其次便是己方這
4、種構(gòu)型的兩端。以此類推便為我的人機(jī)對戰(zhàn)算法。對于判斷輸贏的功能,我是這樣實現(xiàn)的:玩家 每下一次棋,便把該子的坐標(biāo)傳給判斷輸贏的函數(shù)。然后從該子開始,先向右判斷是否包括該子有五個顏色一樣的子,然后又從該子開始向左判斷,然后向右下判斷,然后向左上判斷,然后向下判斷,然后向上判斷,然后向左下判斷,最后向右上判斷。如果有一個方向滿足情況,便返回1,如果都不滿足,便返回0,然后根據(jù)返回值判斷輸贏。對于報警功能,則仿照上述判斷輸贏的程序,如果有三個子連在一起,則返回1,否則返回0。根據(jù)返回值判斷是否報警。對于復(fù)盤功能,我是這樣實現(xiàn)的:定義一個結(jié)構(gòu)體,里面存放前面畫棋盤時提到的字符串?dāng)?shù)組,每下一步,便將該結(jié)
5、構(gòu)體包含的數(shù)據(jù)寫入文件中,復(fù)盤時,根據(jù)玩家要求,從文件中讀取數(shù)據(jù),然后輸出上一步或下一步棋盤。對于悔棋功能,我是這樣實現(xiàn)的:我定義了一個全局變量,然后定義了一個指向該全局變量的指針,每下一次棋,該指針則加1,當(dāng)玩家要悔棋時,則該指針減2,將前面兩步對應(yīng)的整型二維數(shù)組的值賦為0,然后輸出該全局變量對應(yīng)的結(jié)構(gòu)體中的字符串,即可實現(xiàn)悔棋的功能。以上便是我編寫的五子棋程序所包含的功能及其實現(xiàn)方法。下面是部分重要的源程序:typedef struct jilu/*定義結(jié)構(gòu)體保存所有棋局,用于復(fù)盤和悔棋*/ char pN+1N+1MAXLEN;JILU;int main() JILU jilu256;
6、int statusNN=K; int op1=0,op2=0,op3=0,op4=0,a,b;/*op1,op2記錄執(zhí)白棋落子坐標(biāo),op3,op4記錄執(zhí)黑棋落子坐標(biāo)*/ int total=0;/*記錄總步數(shù)*/ int *d = &total;/*定義指針,用于改變total的值*/ setcolor(14); printf("*歡迎你進(jìn)入挑戰(zhàn)與樂趣并存的五子棋游戲!*n"); printf(" Programed by 夏陽升n");b:printf(" 請選擇對戰(zhàn)模式:(1、雙人對戰(zhàn) 2、人機(jī)對戰(zhàn)):"); scanf
7、("%d",&a); if (a=1) setcolor(11); printf("歡迎使用雙人對戰(zhàn)模式!n"); printf("友情提示:本游戲有警報功能(如對方已經(jīng)有一個三連的構(gòu)型了,則可提醒玩家).n"); setcolor(10); Draw(status,jilu,total); do setcolor(14); l:printf("現(xiàn)在是執(zhí)白棋者下,請選擇功能(1:下棋;2:悔棋;3:復(fù)盤;4;退出):"); scanf("%d",&b); switch(b) ca
8、se 1: printf("請輸入你要落子的位置:"); scanf("%d %d",&op1,&op2); if (statusop1op2) setcolor(12); printf("該位置已有棋子,請另輸入坐標(biāo):"); scanf("%d %d",&op1,&op2); if (op1<0|op1>15|op2<0|op2>15) setcolor(12); printf("坐標(biāo)錯誤!請從新輸入:"); scanf("%d
9、 %d",&op1,&op2); statusop1op2=M; *d = *d+1; system("cls"); setcolor(10); Draw(status,jilu,total); if (PD(status,op1,op2) setcolor(12);/*如有危險,則界面變?yōu)榧t色,且有提示音*/ printf("執(zhí)黑棋者有危險!an"); if (Judge(status,op1,op2) setcolor(12); printf("執(zhí)白棋者獲勝!n"); break; case 2: sys
10、tem("cls"); *d = *d - 2; if (total>=0) setcolor(10); Huiqi(status,jilu,op1,op2,op3,op4,total); else printf("已經(jīng)悔到底了,不能再悔了n"); goto l; break; case 3:system("cls"); Fupan(jilu,total); break; case 4:exit(0); default:setcolor(12); printf("輸入錯誤!"); goto l; m:prin
11、tf("現(xiàn)在是執(zhí)黑棋者下,請選擇功能(1:下棋;2:悔棋;3:復(fù)盤;4;退出):"); while(total<=255); printf("這局為平局"); exit(0); if (a=2) setcolor(11); printf("歡迎使用人機(jī)對戰(zhàn)模式!n"); printf("友情提示:本游戲有警報功能(如果電腦已經(jīng)有一個三連的構(gòu)型了,則可提醒玩家).n"); setcolor(10); Draw(status,jilu,total); do setcolor(14); y:printf("
12、;請你選擇功能(1:下棋;2:悔棋;3:復(fù)盤;4;退出):"); system("cls"); setcolor(10); Draw(status,jilu,total); if (Judge(status,op1,op2) setcolor(12); printf("恭喜你,把電腦打敗了!n"); goto y; break; case 2:system("cls"); *d = *d-2; if (total>=0) setcolor(10); Huiqi(status,jilu,op1,op2,op3,op4,t
13、otal); else printf("已經(jīng)悔到底了,不能再悔了n"); goto y; break; case 3:system("cls"); Fupan(jilu,total); goto y; break; case 4:exit(0); default:setcolor(12); printf("輸入錯誤!"); goto y;DX(status,&op3,&op4); statusop3op4=R; *d=*d+1; system("cls"); setcolor(10); Draw(s
14、tatus,jilu,total); setcolor(14); printf("電腦下在%d %d處.",op3,op4);while(total<=255); printf("這局為平局"); exit(0); /*函數(shù)功能:畫棋盤*/void Draw(int statusN,JILU jilu,int total) int i,j; for(i=0;i<N;i+) for(j=0;j<N;j+) if(statusij=M) strcpy(jilutotal.pi+1j,"0"); if(statusij=R
15、) strcpy(jilutotal.pi+1j,"0"); if(statusij=K) strcpy(jilutotal.pi+1j,"0"); strcpy(jilutotal.p1N,"00");strcpy(jilutotal.p2N,"10");strcpy(jilutotal.p3N,"20");strcpy(jilutotal.p4N,"30");strcpy(jilutotal.p5N,"40");strcpy(jilutotal.p6N
16、,"50");strcpy(jilutotal.p7N,"60");strcpy(jilutotal.p8N,"70");strcpy(jilutotal.p9N,"80");strcpy(jilutotal.p10N,"90");strcpy(jilutotal.p11N,"100");strcpy(jilutotal.p12N,"110");strcpy(jilutotal.p13N,"120");strcpy(jilutotal.
17、p14N,"130");strcpy(jilutotal.p15N,"140");strcpy(jilutotal.p16N,"150"); strcpy(jilutotal.p00,"00");strcpy(jilutotal.p01,"1 0");strcpy(jilutotal.p02,"20");strcpy(jilutotal.p03,"3 0");strcpy(jilutotal.p04,"40");strcpy(jilut
18、otal.p05,"5 0");strcpy(jilutotal.p06,"60");strcpy(jilutotal.p07,"7 0");strcpy(jilutotal.p08,"80");strcpy(jilutotal.p09,"9 0");strcpy(jilutotal.p010,"100");strcpy(jilutotal.p011,"110");strcpy(jilutotal.p012,"120");strcpy(
19、jilutotal.p013,"130");strcpy(jilutotal.p014,"140");strcpy(jilutotal.p015,"150");strcpy(jilutotal.p016," 0"); for (i=0;i<=N;i+) for (j=0;j<=N;j+) printf("%s",jilutotal.pij); printf("n"); FILE *fp; if (fp=fopen("game.txt",&quo
20、t;w")=NULL)/*以寫方式打開文本文件*/ printf("文件game.txt打開失敗!n"); exit(0); fwrite(jilu,sizeof(JILU),total,fp);/*按數(shù)據(jù)塊寫文件*/ fclose(fp);/*函數(shù)功能:預(yù)報危險*/int PD(int statusN,int p,int q) int k,m,P,Q; int n=1; P=p; Q=q; k=statuspq; while(n!=5) m=0; while(k=statuspq) m+; if(m=3)/*如果有三個子連在一起,則返回1*/ return 1;
21、 Zuanxiang(n,&p,&q);/*由n的值決定往哪個方向判斷*/ if(p<0|p>15|q<0|q>15) break; n+=4; m-=1; p=P; q=Q;/*每判斷完一個方向之后改變n的值,轉(zhuǎn)動方向由n的不同值決定*/ while(k=statuspq) m+; if(m=3) return 1; Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) break; n-=3; p=P; q=Q; /* 不成功則判斷下一組方向 */ return 0;int Jud
22、ge(int statusN,int p,int q) int k,m,P,Q; int n=1; P=p; Q=q; k=statuspq; while(n!=5) m=0; while(k=statuspq) m+; if(m=5)/*如果連成五子,則返回1*/ return 1; Zuanxiang(n,&p,&q);/*由n的值決定往哪個方向判斷*/ if(p<0|p>15|q<0|q>15) break; n+=4; m-=1; p=P; q=Q;/*每判斷完一個方向之后改變n的值,轉(zhuǎn)動方向由n的不同值決定*/ while(k=statuspq
23、) m+; if(m=5) return 1; Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) break; n-=3; p=P; q=Q; /* 不成功則判斷下一組方向 */ return 0;void Huiqi(int statusN,JILU jilu,int op1,int op2,int op3,int op4,int total) int i,j,x; statusop1op2=K; statusop3op4=K; for (i=0;i<=N;i+) for (j=0;j<=N;j+) pri
24、ntf("%s",jilutotal.pij); printf("n"); void Fupan(JILU jilu,int total) int i,j,k=1; int c; FILE *fp; if (fp=fopen("game.txt","r")=NULL)/*以寫方式打開文本文件*/ printf("文件game.txt打開失敗!n"); exit(0); for (i=0;!feof(fp);i+) fread(&jilui,sizeof(JILU),total,fp);
25、fclose(fp); setcolor(10); printf("第一步棋局如下:n"); for (i=0;i<=N;i+) for (j=0;j<=N;j+) printf("%s",jiluk.pij); printf("n"); do printf("請選擇(1:顯示上一步棋局 2:顯示下一步棋局):"); scanf("%d",&c); if (c=1) system("cls"); k=k-1; printf("第%d步棋局如下:n
26、",k); for (i=0;i<=N;i+) for (j=0;j<=N;j+) printf("%s",jiluk.pij); printf("n"); if (c=2) system("cls"); k=k+1; printf("第%d步棋局如下:n",k); for (i=0;i<=N;i+) for (j=0;j<=N;j+) printf("%s",jiluk.pij); printf("n"); while (k>=0&a
27、mp;&k<=total);void Zuanxiang(int n,int *i,int *j) switch(n) case 1: *j+=1; break; case 2: *i+=1; *j+=1; break; case 3: *i+=1; break; case 4: *j-=1; *i+=1; break; case 5: *j-=1; break; case 6: *i-=1; *j-=1; break; case 7: *i-=1; break; case 8: *j+=1; *i-=1;break; void DX(int statusN,int *p,int
28、 *q) /* 電腦下子 *p *q返回下子坐標(biāo) */ int i,j,k,max=0,I,J; /* I J為下點坐標(biāo) */ for(i=0;i<16;i+) for(j=0;j<16;j+) if(statusij=K) /* 歷遍棋盤,遇到空點則計算價值,取最大價值點下子。 */ k=Suanzhi(status,i,j); if(k>=max) I=i; J=j; max=k; *p=I; *q=J;int Suanzhi(int statusN,int p,int q) /* 計算空點p q的價值 以k返回 */ int n=1,k=0,k1,k2,K1,K2,X1
29、,Y1,Z1,X2,Y2,Z2,temp; int a244=40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0; /* 數(shù)組a中儲存己方和對方共32種棋型的值 己方0 對方1; 活0 沖1 空活2 空沖3 ;子數(shù)0-3(0表示1個子,3表示4個子)*/ while(n!=5) k1=Qiju(status,n,p,q); n+=4; /* k1,k2為2個反方向的棋型編號 */ k2=Qiju(status,n,p,q); n-
30、=3; if(k1>k2) temp=k1; k1=k2; k2=temp; /* 使編號小的為k1,大的為k2 */K1=k1; K2=k2; /* K1 K2儲存k1 k2的編號 */ Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10; X1=k1%10; X2=k2%10; /* X Y Z分別表示 己方0對方1 活0沖1空活2空沖3 子數(shù)0-3(0表示1個子,3表示4個子) */ if(K1=-1) if(K2<0) k+=0; continue; else k+=aX2Y2Z2+5
31、; continue; ; /* 空棋型and其他 */ if(K1=-2) if(K2<0) k+=0; continue; else k+=aX2Y2Z2/2; continue; ; /* 邊界沖棋型and其他 */ if(K1=-3) if(K2<0) k+=0; continue; else k+=aX2Y2Z2/3; continue; ; /* 邊界空沖棋型and其他 */ if(K1>-1&&K1<4)&&(K2>-1&&K2<4)|(K2>9&&K2<18)|(K1
32、>99&&K1<104)&&( K2>99&&K2<104)|(K2>109&&K2<115) /* 己活己活 己活己沖 對活對活 對活對沖 的棋型賦值*/ if(Z1+Z2>=2) k+=aX2Y23; continue; else k+=aX2Y2Z1+Z2+1; continue; if(K1>9&&K1<18)&&(K2>9&&K2<18)|(K1>109&&K1<118)&
33、&(K2>109&&K2<118) /* 己沖己沖 對沖對沖 的棋型賦值*/ if(Z1+Z2>=2) k+=10000; continue; else k+=0; continue; if(K1>-1&&K1<4)&&(K2>99&&K2<104)|(K2>109&&K2<118)|(K1>9&&K1<18)&&(K2>99&&K2<104)|(K2>109&&
34、;K2<118) /* 己活對活 己活對沖 己沖對活 己沖對沖 的棋型賦值*/ if(Z1=3|Z2=3) k+=10000; continue; else k+=aX2Y2Z2+aX1Y1Z1/4; continue; else k+=aX1Y1Z1+aX2Y2Z2; continue; /* 其他棋型的賦值 */ return k;int Qiju(int statusN,int n,int p,int q) /* 返回空點p q在n方向上的棋型號 n為1-8方向 從右順時針開始數(shù) */ int k,m=0; /* 棋型號注解: 己活000-003 己沖010-013 對活100-1
35、03 對沖110-113 己空活020-023 己空沖030-033 對空活120-123 對空沖130-133 空-1 邊界沖-2 邊界空沖-3*/ Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) k=-2; /* 邊界沖棋型*/ switch(statuspq) case R: m+; Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) k=m+9; return k; while(statuspq=R) m+; Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) k=m+9; return k; if(statuspq=K) k=m-1; /* 己方活棋型 */ else k=m+9; /* 己方?jīng)_棋型 */ break; case M: m+; Zuanxiang(n,&p,&q); if(p<0|p>15|q<0|q>15) k=m+109; return k; while(statuspq=M) m+; Zuanxiang(n,&p,&q);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度某數(shù)據(jù)中心水電暖安全保障服務(wù)合同4篇
- 二零二五年度奶牛養(yǎng)殖金融服務(wù)與風(fēng)險管理合同3篇
- 2025版實木地板批發(fā)業(yè)務(wù)供應(yīng)合同范本4篇
- 二零二五年度木材行業(yè)原材料采購與倉儲服務(wù)合同4篇
- 2025年度門窗行業(yè)知識產(chǎn)權(quán)保護(hù)合同-@-2
- 二零二五年度卵石開采與環(huán)保治理采購合同3篇
- 二零二五年度農(nóng)藥產(chǎn)品國際貿(mào)易爭端解決合同
- 二零二五年度夜間經(jīng)濟(jì)攤位租賃管理合同
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)門面租賃合同范本4篇
- 二零二五年度外架工程高空作業(yè)人員培訓(xùn)合同
- 開展課外讀物負(fù)面清單管理的具體實施舉措方案
- 2025年云南中煙工業(yè)限責(zé)任公司招聘420人高頻重點提升(共500題)附帶答案詳解
- 2025-2030年中國洗衣液市場未來發(fā)展趨勢及前景調(diào)研分析報告
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(解析版)
- 北京市房屋租賃合同自行成交版北京市房屋租賃合同自行成交版
- 《AM聚丙烯酰胺》課件
- 系統(tǒng)動力學(xué)課件與案例分析
- 《智能網(wǎng)聯(lián)汽車智能傳感器測試與裝調(diào)》電子教案
- 客戶分級管理(標(biāo)準(zhǔn)版)課件
- GB/T 32399-2024信息技術(shù)云計算參考架構(gòu)
- 固定資產(chǎn)盤點報告醫(yī)院版
評論
0/150
提交評論