五子棋C語言程序_第1頁
五子棋C語言程序_第2頁
五子棋C語言程序_第3頁
五子棋C語言程序_第4頁
五子棋C語言程序_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、# include<stdio.h># include<string.h># include<stdlib.h># define SPA 0# define MAN 1# define COM 2 /* 空位置設(shè)為0 ,玩家下的位置設(shè)為1 ,電腦下的位置設(shè)為2 */int qipan1515; /* 15*15的棋盤 */int a,b,c,d,x; /* a b為玩家下子坐標(biāo) ,c d為電腦下子坐標(biāo) x為剩余空位置*/void start(); /* 程序的主要控制函數(shù) */void draw(); /* 畫棋盤 */int win(int p,int q

2、); /* 判斷勝利 p q為判斷點(diǎn)坐標(biāo) */void AI(int *p,int *q); /* 電腦下子 p q返回下子坐標(biāo) */int value(int p,int q); /* 計(jì)算空點(diǎn)p q的價(jià)值 */int qixing(int n,int p,int q); /* 返回空點(diǎn)p q在n方向上的棋型 n為1-8方向 從右順時(shí)針開始數(shù) */void yiwei(int n,int *i,int *j); /* 在n方向上對坐標(biāo) i j 移位 n為1-8方向 從右順時(shí)針開始數(shù) */void main()char k;dox=225;start();printf("還要再來一把

3、嗎?輸入y或n:"); getchar(); scanf("%c",&k);while(k!='y'&&k!='n') printf("輸入錯(cuò)誤,請重新輸入n"); scanf("%c",&k); system("cls");while(k='y');printf("謝謝使用!n");void start()int i,j,a1,b1,c1,d1,choice; /* a1 b1儲(chǔ)存玩家上手坐標(biāo) c1 d1

4、儲(chǔ)存電腦上手坐標(biāo) */char ch;printf("tn");printf("t n");printf("t 歡迎使用五子棋對戰(zhàn)程序 祝您玩的愉快挑戰(zhàn)無極限 n"); printf("t n");printf("t ._. n"); printf("t | _ | n");printf("t | I I | n");printf("t | I 五 子 棋 I | n");printf("t | I I | n");

5、printf("t | I made by 曉之蓬 I | n"); printf("t | I_I | n");printf("t !_! n"); printf("t ._. n");printf("t ._|_|_. n");printf("t |: _ | n"); printf("t | CD-ROM | n");printf("t !_! n");printf("t n");printf("t

6、n");printf("t 寒 星 溪 月 疏 星 首,花 殘 二 月 并 白 蓮。 n");printf("t 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 n");printf("t 星 月 長 峽 恒 水 流,白 蓮 垂 俏 云 浦 嵐。 n");printf("t 黑 玉 銀 月 倚 明 星,斜 月 明 月 堪 稱 朋。 n");printf("t 二 十 六 局 先 棄 二,直 指 游 星 斜 彗 星。 n");printf("t n");pr

7、intf("t n");printf("t 1.人機(jī)對戰(zhàn) 2.人人對戰(zhàn) n");printf("t n");printf("tn");printf("ttt請輸入1或2:");scanf("%d",&choice); /* 選擇模式:人機(jī)或人人 */while(choice!=1&&choice!=2) printf("輸入錯(cuò)誤,請重新輸入:"); scanf("%d",&choice); if(choi

8、ce=1) /* 人機(jī)模式 */system("cls"); printf("歡迎使用五子棋人機(jī)對戰(zhàn)!下子請輸入坐標(biāo)(如13 6)。悔棋請輸入15 15。nnn"); for(j=0;j<15;j+)for(i=0;i<15;i+)qipanji=SPA; /* 置棋盤全為空 */draw();printf("先下請按1,后下請按2:");scanf("%d",&i); while(i!=1&&i!=2) printf("輸入錯(cuò)誤,請重新輸入:"); scan

9、f("%d",&i); if(i=1) /* 如果玩家先手下子 */printf("請下子:"); scanf("%d%d",&a,&b); while(a<0|a>14)|(b<0|b>14) printf("坐標(biāo)錯(cuò)誤!請重新輸入:"); scanf("%d%d",&a,&b); a1=a; b1=b; x-; qipanba=MAN; system("cls"); draw();while(x!=0)if(x

10、=225) c=7; d=7; qipandc=COM; x-; system("cls"); draw(); /* 電腦先下就下在7 7 */else AI(&c,&d); qipandc=COM; x-; system("cls"); draw(); /* 電腦下子 */c1=c; d1=d; /* 儲(chǔ)存電腦上手棋型 */if(win(c,d) /* 電腦贏 */printf("要悔棋嗎?請輸入y或n:"); getchar(); scanf("%c",&ch);while(ch!=&#

11、39;y'&&ch!='n') printf("輸入錯(cuò)誤,請重新輸入:"); scanf("%c",&ch); if(ch='n') printf("下不過電腦很正常,請不要灰心!n"); return; else x+=2; qipandc=SPA; qipanb1a1=SPA; system("cls"); draw(); /* 悔棋 */printf("電腦下在%d %dn請輸入:",c,d); scanf("%d%

12、d",&a,&b); /* 玩家下子 */if(a=15&&b=15) x+=2; qipandc=SPA; qipanb1a1=SPA; system("cls"); draw(); printf("請輸入:"); scanf("%d%d",&a,&b); /* 悔棋 */while(a<0|a>14)|(b<0|b>14)|qipanba!=SPA) printf("坐標(biāo)錯(cuò)誤或該位置已有子!請重新輸入:"); scanf(&quo

13、t;%d%d",&a,&b); a1=a; b1=b; x-; qipanba=MAN; system("cls"); draw();if(win(a,b) printf("電腦神馬的都是浮云!n"); return; /* 玩家贏 */printf("和局n");if(choice=2)system("cls"); printf("歡迎使用五子棋人人對戰(zhàn)!下子請輸入坐標(biāo)(如13 6)?;谄逭堓斎?5 15。nnn"); for(j=0;j<15;j+)for(i

14、=0;i<15;i+)qipanji=SPA; /* 置棋盤全為空 */draw();while(x!=0)printf("1P請輸入:"); scanf("%d%d",&a,&b);if(a=15&&b=15) x+=2; qipandc=SPA; qipanb1a1=SPA; system("cls"); draw(); printf("1P請輸入:"); scanf("%d%d",&a,&b); while(a<0|a>14

15、)|(b<0|b>14)|qipanba!=SPA) printf("坐標(biāo)錯(cuò)誤或該位置已有子!請重新輸入:"); scanf("%d%d",&a,&b); a1=a; b1=b; x-; qipanba=MAN; system("cls"); draw();printf("1P下在%d %d。n",a,b);if(win(a,b) printf("你真棒!n"); return; /* 玩家1贏 */printf("2P請輸入:"); scanf(

16、"%d%d",&c,&d);if(c=15&&d=15) x+=2; qipanba=SPA; qipand1c1=SPA; system("cls"); draw(); printf("2P請輸入:"); scanf("%d%d",&c,&d); while(c<0|c>14)|(d<0|d>14)|qipandc!=SPA) printf("坐標(biāo)錯(cuò)誤或該位置已有子!請重新輸入:"); scanf("%d%d&q

17、uot;,&c,&d); c1=c; d1=d; x-; qipandc=COM; system("cls"); draw();printf("2P下在%d %d。n",c,d);if(win(c,d) printf("你真棒!n"); return; /* 玩家2贏 */printf("和局n");void draw() /* 畫棋盤 */int i,j;char p15154;for(j=0;j<15;j+)for(i=0;i<15;i+)if(qipanji=SPA) strcpy

18、(pji," 0");if(qipanji=MAN) strcpy(pji,"0");if(qipanji=COM) strcpy(pji,"0");printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 n"); printf(" n");for(i=0,j=0;i<14;i+,j+)printf(" %2d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%dn",j,pi0,pi1,pi2,pi3,pi4,pi5,pi6,

19、pi7,pi8,pi9,pi10,pi11,pi12,pi13,pi14,j);printf(" n"); printf(" 14%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s0n",p140,p141,p142,p143,p144,p145,p146,p147,p148,p149,p1410,p1411,p1412,p1413,p1414); printf(" n");printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 n");int win(int p,int

20、q) /* 判斷勝利 p q為判斷點(diǎn)坐標(biāo),勝利返回1,否則返回0 */int k,n=1,m,P,Q; /* k儲(chǔ)存判斷點(diǎn)p q的狀態(tài)COM或MAN。P Q儲(chǔ)存判斷點(diǎn)坐標(biāo)。n為判斷方向。m為個(gè)數(shù)。 */P=p; Q=q;k=qipanqp;while(n!=5)m=0; while(k=qipanqp)m+;if(m=5) return 1; yiwei(n,&p,&q); if(p<0|p>14|q<0|q>14) break;n+=4; m-=1; p=P; q=Q; /* 轉(zhuǎn)向判斷 */while(k=qipanqp)m+;if(m=5) retu

21、rn 1; yiwei(n,&p,&q); if(p<0|p>14|q<0|q>14) break;n-=3; p=P; q=Q; /* 不成功則判斷下一組方向 */return 0;void AI(int *p,int *q) /* 電腦下子 *p *q返回下子坐標(biāo) */int i,j,k,max=0,I,J; /* I J為下點(diǎn)坐標(biāo) */for(j=0;j<15;j+)for(i=0;i<15;i+)if(qipanji=SPA) /* 歷遍棋盤,遇到空點(diǎn)則計(jì)算價(jià)值,取最大價(jià)值點(diǎn)下子。 */k=value(i,j);if(k>=ma

22、x) I=i; J=j; max=k; *p=I; *q=J;int value(int p,int q) /* 計(jì)算空點(diǎn)p q的價(jià)值 以k返回 */ int n=1,k=0,k1,k2,K1,K2,X1,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中儲(chǔ)存己方和對方共32種棋型的值 己方0對方1 活0沖1空活2空沖3 子數(shù)0-3(0表示1個(gè)子,3表示

23、4個(gè)子) */while(n!=5)k1=qixing(n,p,q); n+=4;/* k1,k2為2個(gè)反方向的棋型編號(hào) */k2=qixing(n,p,q); n-=3;if(k1>k2) temp=k1; k1=k2; k2=temp; /* 使編號(hào)小的為k1,大的為k2 */K1=k1; K2=k2; /* K1 K2儲(chǔ)存k1 k2的編號(hào) */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空沖

24、3 子數(shù)0-3(0表示1個(gè)子,3表示4個(gè)子) */if(K1=-1) if(K2<0) k+=0; continue; else k+=aX2Y2Z2+5; 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&&am

25、p;K1<4)&&(K2>-1&&K2<4)|(K2>9&&K2<14)|(K1>99&&K1<104)&&(K2>99&&K2<104)|(K2>109&&K2<114)/* 己活己活 己活己沖 對活對活 對活對沖 的棋型賦值*/if(Z1+Z2>=2) k+=aX2Y23; continue; else k+=aX2Y2Z1+Z2+1; continue; if(K1>9&&K1<

26、14)&&(K2>9&&K2<14)|(K1>109&&K1<114)&&(K2>109&&K2<114)/* 己沖己沖 對沖對沖 的棋型賦值*/if(Z1+Z2>=2) k+=10000; continue; else k+=0; continue; if(K1>-1&&K1<4)&&(K2>99&&K2<104)|(K2>109&&K2<114)|(K1>9&

27、;&K1<14)&&(K2>99&&K2<104)|(K2>109&&K2<114)/* 己活對活 己活對沖 己沖對活 己沖對沖 的棋型賦值*/if(Z1=3|Z2=3) k+=10000; continue; else k+=aX2Y2Z2+aX1Y1Z1/4; continue; else k+=aX1Y1Z1+aX2Y2Z2; continue; /* 其他棋型的賦值 */return k;int qixing(int n,int p,int q) /* 返回空點(diǎn)p q在n方向上的棋型號(hào) n為1-8方向

28、 從右順時(shí)針開始數(shù) */ int k,m=0; /* 棋型號(hào)注解: 己活000-003 己沖010-013 對活100-103 對沖110-113 己空活020-023 己空沖030-033 對空活120-123 對空沖130-133 空-1 邊界沖-2 邊界空沖-3*/yiwei(n,&p,&q);if(p<0|p>14|q<0|q>14) k=-2; /* 邊界沖棋型 */switch(qipanqp)case COM:m+; yiwei(n,&p,&q);if(p<0|p>14|q<0|q>14) k=m+9

29、; return k; while(qipanqp=COM) m+; yiwei(n,&p,&q); if(p<0|p>14|q<0|q>14) k=m+9; return k; if(qipanqp=SPA) k=m-1; /* 己方活棋型 */ else k=m+9; /* 己方?jīng)_棋型 */ break;case MAN:m+; yiwei(n,&p,&q);if(p<0|p>14|q<0|q>14) k=m+109; return k; while(qipanqp=MAN) m+; yiwei(n,&p,&q); if(p<0|p>14|q<0|q>14) k=m+109; return k; if(qipanqp=SPA) k=m+99; /* 對方活棋型 */

溫馨提示

  • 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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論