五子棋C语言程序_第1页
五子棋C语言程序_第2页
五子棋C语言程序_第3页
五子棋C语言程序_第4页
五子棋C语言程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、# include<stdio.h># include<string.h># include<stdlib.h># define SPA 0# define MAN 1# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */int qipan1515; /* 15*15的棋盘 */int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/void start(); /* 程序的主要控制函数 */void draw(); /* 画棋盘 */int win(int p,int q

2、); /* 判断胜利 p q为判断点坐标 */void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */int value(int p,int q); /* 计算空点p q的价值 */int qixing(int n,int p,int q); /* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */void main()char k;dox=225;start();printf("还要再来一把

3、吗?输入y或n:"); getchar(); scanf("%c",&k);while(k!='y'&&k!='n') printf("输入错误,请重新输入n"); scanf("%c",&k); system("cls");while(k='y');printf("谢谢使用!n");void start()int i,j,a1,b1,c1,d1,choice; /* a1 b1储存玩家上手坐标 c1 d1

4、储存电脑上手坐标 */char ch;printf("tn");printf("t n");printf("t 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 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.人机对战 2.人人对战 n");printf("t n");printf("tn");printf("ttt请输入1或2:");scanf("%d",&choice); /* 选择模式:人机或人人 */while(choice!=1&&choice!=2) printf("输入错误,请重新输入:"); scanf("%d",&choice); if(choi

8、ce=1) /* 人机模式 */system("cls"); printf("欢迎使用五子棋人机对战!下子请输入坐标(如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("输入错误,请重新输入:"); scan

9、f("%d",&i); if(i=1) /* 如果玩家先手下子 */printf("请下子:"); scanf("%d%d",&a,&b); while(a<0|a>14)|(b<0|b>14) printf("坐标错误!请重新输入:"); 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; /* 储存电脑上手棋型 */if(win(c,d) /* 电脑赢 */printf("要悔棋吗?请输入y或n:"); getchar(); scanf("%c",&ch);while(ch!=&#

11、39;y'&&ch!='n') printf("输入错误,请重新输入:"); 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("坐标错误或该位置已有子!请重新输入:"); 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("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 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("坐标错误或该位置已有子!请重新输入:"); 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("坐标错误或该位置已有子!请重新输入:"); 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为判断点坐标,胜利返回1,否则返回0 */int k,n=1,m,P,Q; /* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */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; /* 转向判断 */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返回下子坐标 */int i,j,k,max=0,I,J; /* I J为下点坐标 */for(j=0;j<15;j+)for(i=0;i<15;i+)if(qipanji=SPA) /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */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) /* 计算空点p q的价值 以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; /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示

23、4个子) */while(n!=5)k1=qixing(n,p,q); n+=4;/* k1,k2为2个反方向的棋型编号 */k2=qixing(n,p,q); n-=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空冲

24、3 子数0-3(0表示1个子,3表示4个子) */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) /* 返回空点p q在n方向上的棋型号 n为1-8方向

28、 从右顺时针开始数 */ int k,m=0; /* 棋型号注解: 己活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; /* 己方冲棋型 */ 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论