当前位置:文档之家› c语言报告五子棋

c语言报告五子棋

青岛理工大学《C语言程序设计》题目游戏五子棋指导教师:李兰姓名:王鹏学号:200907127班级:计算094专业:计算机科学与技术地点:二号实验楼第六机房时间: 6.28 至7.1一、内容游戏五子棋在这个小游戏中,实现了两人对战的游戏模式,没有添加禁手规则,另外考虑到落子时的可能失误,就添加了悔棋工具,游戏过程中可以进行游戏存档,进入悔棋和存档的方法为将光标移动到已有子的位置,敲一下落子键即可。

下次游戏时候可以进入存档界面然后选择读取游戏存档即可继续玩上次的游戏。

在游戏时自动计算双方各胜几局,平几局。

按键控制一号玩家:上:w 下:s 左: a 右 : d 落子: f二号玩家:上:I 下:k 左: j 右: l 落子: h二、上机环境操作系统:Windows 98/XP/Win 7开发工具:VC++6.0三、函数调用关系图四、各函数功能说明对每个函数功能加以说明,说明该函数主要实现了什么内容。

1 int main() 主函数2 system(“color 5a”) 控制台前景、背景颜色设置3 system(“cls”) 清屏4 Printsjm(void) 输出游戏首界面5 start(void) 界面初始化6 print(void) 界面刷新7 check(void) 检测是否有一方赢棋8 checkheqi(void) 检测是否和棋9 zq(int,char (*p)[],char (*p)[]) 走棋落子10 huiqi(char (*p)[]) 悔棋11 jilu(char (*p)[]) 记录上次落子前的界面12 cundang(void) 存储游戏进度13 duqu(void) 读取游戏进度14 fuzhi(void) 保存临时界面15 huifu(void) 恢复临时界面以实现光标移动16 newdata(void) 数据刷新五、算法描述或流程图system(“color 5a”)和system(“cls”) 只需要调用<stdlib.h>头文件,并在使用前将要声明的变量声明好即可。

/*输出游戏首页*//*原样输出即可*/void Printsjm(){printf(" * * * * * * * * * * * * * * * 游戏名称* * * * * * * * * * * * * * **\n");printf(" * * * * * * * * *\n");printf(" * * * * * * 五子棋* * * * *\n");printf(" * * * * * * * * *\n");printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");printf(" \n");printf(" * * * * * * * * * * * * * * * 游戏规则* * * * * * * * * * * * * * * *\n");printf(" * * * * * * * *\n");printf(" * * * * 游戏悔棋时不允许连续悔棋* * * *\n");printf(" * * * * * * * *\n");printf(" ************ 任一方五子相连即获胜,一局游戏也就结束***********\n");printf(" * * * * * * * *\n");printf(" ********* 请遵守游戏规则谢谢!!!********\n");printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");printf(" \n");printf(" * * * * * * * * * * * * * * * 游戏制作* * * * * * * * * * * * * * * *\n");printf(" * * * * * * * *\n");printf(" *** *** 计算机工程学院094班*** ***\n");printf(" * * * * * * * *\n");printf(" * * * * * * * 王鹏* * * * * * *\n");printf(" * * * * * * * 2010.6.28 * * * * * * *\n");printf(" *********************************************************************\n"); /*恢复*/void huifu(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=linshi[i][j]; /*临时界面恢复到实际界面*/}void fuzhi(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)linshi[i][j]=qipan[i][j];/*记录临时界面*/}void cundang(){FILE *fp;int i,j;if((fp=fopen(filename,"w"))==NULL) /*打开存档文件*/{printf(" 存档失败!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fp);}else{for(i=0;i<20;i++){for(j=0;j<20;j++){cd.cun[i][j]=linshi[i][j]; /*数据恢复*/cd.jx=jx;cd.jy=jy;cd.leiji=leiji;}}fwrite(&cd,sizeof(struct cund),1,fp);printf(" 存档成功!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fp);system("cls");}}void duqu() /*读取游戏进度*/{FILE *fpp;int i,j;if((fpp=fopen(filename,"r"))==NULL){printf(" 你还没有存档,读取存档失败!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fpp);}else{fread(&cd,sizeof(struct cund),1,fpp);fclose(fpp);jx=cd.jx;jy=cd.jy;leiji=cd.leiji;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=cd.cun[i][j];system("cls");printf(" 读取存档成功,请继续游戏!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();}}void jilu(char (*p)[20])/*记录悔棋前棋盘个子的位置以及悔棋后该谁落子*/{int i,j;for(i=0;i<20;i++){for(j=0;j<20;j++){*(*(p+i)+j)=qipan[i][j];}}}/*悔棋到上次你的落子权*/void huiqi(char (*p)[20]){int i,j;for(i=0;i<20;i++){for(j=0;j<20;j++){qipan[i][j]=*(*(p+i)+j);}}}/*输出界面,每次走完一步棋都要刷新界面*/void print()/*start()函数也是同样道理*/{int i=0,j=0,k=0;/*显示列坐标*/printf("000|001|002|003|004|005|006|007|008|009|010|011|012|013|014|\n");for(i=1;i<15;i++){ /*棋盘的上边界*/printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");for(j=0;j<15;j++){if(j==0){if(i<10) printf("00%d|",i);/*显示可控制行坐标以及左边界*/else printf("0%d|",i);}elseprintf(" %c |",qipan[i][j]); /*显示棋盘上的字符以及由边界*/ }printf("\n");/*显示棋盘下边界*/printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");if(leiji%2==1)printf("\n \n\n 一号玩家落子:\n\n\n");elseprintf("\n \n\n 二号玩家落子:\n\n\n");}/*检测棋盘上是否有一方赢棋*/check() /*调用时对棋盘上的一号二号玩家分别进行行检测、列检测、左斜线检测、右斜线检测*/if((qipan[i][j]==black)&&(qipan[i][j+1]==black)&&(qipan[i][j+2]==black)&&(qipan[i][j+3]==bla ck)&&(qipan[i][j+4]==black))/* 一号玩家行检测*/if((qipan[i][j]==white)&&(qipan[i][j+1]==white)&&(qipan[i][j+2]==white)&&(qipan[i][j+3]==white)&&(qi pan[i][j+4]==white)) /*二号玩家列检测*/if(qipan[i][j]==black&&qipan[i+1][j-1]==black&&qipan[i+2][j-2]==black&&qipan[i+3][j-3]==black&&qip an[i+4][j-4]==black) /*右斜线检测*//*检测双方是否和棋并在棋盘满的时候自动判和棋*/int checkheqi(){char ch;if((leiji-1)==186) /*统计数初始值为1,现在减一来判断棋子数是否快落满棋盘*/{printf(" 真是棋逢敌手啊,棋已至此仍未能分出胜负...........\n");printf(" 但现在棋盘即将落满,请问两位棋士是否选择和棋,改日再战?Y / N ?\n");ch=getchar();while(ch!='Y'||ch!='N')/*显示询问界面,提示是否和棋*/{printf("请选择是或否Y / N ");ch=getchar();}if(ch=='Y') /*选择是,如下输出,并返回主函数所需的控制值*/{printf("哈哈...来日方长...两位光然有棋士风范,拿得起放得下...改日再战...\n");return(3);}if(ch=='N') /*选择否,如下输出,并返回主函数所需的控制值*/{printf(" 哈哈,看来两位都不愿和棋...... \n");printf(" 那就请继续下完此局,但是不要忘了,棋盘落满子的时候自动判为和棋.....\n");return(0);}}if((leiji-1)==196)/*当棋子数等于棋盘空格数时自动判和棋,并返回主函数所需的控制值*/{printf(" \n\n棋盘已满,系统自动判为和棋,请两位棋士改日再战...........\n\n\n\n");return(5);}return(0);/*否则返回零继续游戏*/}/*一下语句块为zq()、huiqi()、jilu(),fuzhi(),huifu()五个函数的调用*//*走棋函数*/void zq(char player,char (*p1)[20],char (*p2)[20]){int mn=0,i=1,p,q;char key;key=_getch();if(player==white){while(1){/*实现光标移动的关键算法*/switch(key){case 'j': if(ly>1) {huifu();ly--;qipan[lx][ly]=95;}system("cls");print();break;case 'l': if(ly<14){huifu();ly++;qipan[lx][ly]=95;}system("cls");print();break;case 'k': if(lx<14){huifu();lx++;qipan[lx][ly]=95;}system("cls");print();break;case 'i': if(lx>1) {huifu();lx--;qipan[lx][ly]=95;}system("cls");print();break;}key=_getch();if(key=='h'){if(linshi[lx][ly]==black||linshi[lx][ly]==white){system("cls");printf("请选择:\n");printf(" 【1】进入游戏界面存档\n");printf(" 【2】进入游戏悔棋界面\n");printf(" ");scanf("%d",&mn);if(mn==1){mn=0;printf("请选择:\n");printf(" 【1】保存游戏进度\n");printf(" 【2】读取游戏进度\n");printf(" ");scanf("%d",&mn);if(mn==1){mn=0;printf(" 你选择了保存游戏进度!!!\n");cundang();system("cls");print();}else if(mn==2){mn=0;printf(" 你选择了读取游戏进度!!!\n");duqu();fuzhi();system("cls");print();}}else if(mn==2){mn=0;printf(" 你选择了悔棋!!!\n");if(kongzhi==player1){if(leiji%2==0){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else huiqi(p2);leiji-=2;jx--;jy--;fuzhi();system("cls");print();}else{if(leiji%2==1){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else huiqi(p2);leiji-=2;jx--;jy--;fuzhi();system("cls");print();}}}else if(linshi[lx][ly]!=black&&linshi[lx][ly]!=white){for(p=0;p<20;p++){for(q=0;q<20;q++){if(qipan[p][q]!=black&&qipan[p][q]!=white)qipan[p][q]=32;}}if(kongzhi==player1){if(2*jx==leiji){jilu(p1);jx++;}else if((2*jy-1)==leiji){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}else{if(2*jx==(leiji-1)){jilu(p1);jx++;}else if((2*jy-1)==(leiji-1)){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break; } } }}}else if(player==black){while(1){switch(key){case 'a': if(ly>1) {huifu();ly--;qipan[lx][ly]=95;}system("cls");print();break;case 'd': if(ly<14){huifu();ly++;qipan[lx][ly]=95;}system("cls");print();break;case 's': if(lx<14){huifu();lx++;qipan[lx][ly]=95;}system("cls");print();break;case 'w': if(lx>1) {huifu();lx--;qipan[lx][ly]=95;}system("cls");print();break;}key=_getch();if(key=='f'){if(linshi[lx][ly]==black||linshi[lx][ly]==white){system("cls");printf("\n 请选择:\n");printf(" 【1】进入游戏界面存档\n");printf(" 【2】进入游戏悔棋界面\n");printf(" "); scanf("%d",&mn);if(mn==1){mn=0;printf("\n 请选择:\n");printf(" 【1】保存游戏进度\n");printf(" 【2】读取游戏进度\n");printf(" ");scanf("%d",&mn);if(mn==1){mn=0;printf(" 你选择了保存游戏进度!!!\n");cundang();}else if(mn==2){mn=0;printf(" 你选择了读取游戏进度!!!\n");duqu();fuzhi();system("cls");print();}}else if(mn==2){printf(" 你选择了悔棋!!!\n");if(kongzhi==player1){if(leiji%2==0){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else{huiqi(p2);}leiji-=2;jx--;jy--;fuzhi();system("cls");print();}else{if(leiji%2==1){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else{huiqi(p2);}leiji-=2;jx--;jy--;fuzhi();system("cls");print();} }}}else if(linshi[lx][ly]!=black&&linshi[lx][ly]!=white){for(p=0;p<20;p++){for(q=0;q<20;q++){if(qipan[p][q]!=black&&qipan[p][q]!=white)qipan[p][q]=32;}}if(kongzhi==player1){if(2*jx==leiji){jilu(p1);jx++;}else if((2*jy-1)==leiji){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}else{if(2*jx==(leiji-1)){jilu(p1);jx++;}else if((2*jy-1)==(leiji-1)){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;} } }}} } /*数据初始化*/void newdata(){int i,j;lx=ly=jx=jy=jushu=1;leiji=sh1=sh2=he=0;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=linshi[i][j]=32;}六、程序运行效果图/*游戏首界面如下*//*以下为选择谁先落子的界面*//*存档时的界面*//*存档成功的界面*//*走棋时的界面,也是悔棋前的界面*//*悔棋时的界面*//*悔棋后的界面*//*以下为赢棋的界面*/七、体会经过这次课程设计,我发现在很多地方的知识都不足,很多函数和技巧都要从网络上或其他书籍上找,可能学计算机要看看很多很多书,尤其在大学,很多情况下都需要自学,我想在以后的学习和实践工作中,会多读多看多练的,努力让自己的实力得到提高,在这个小游戏中,不能调用鼠标,只能通过输入坐标点位置,这是一个很大的不足,以后学习了一定要修改的更好!八、参考文献[1] 湛为芳.C语言程序设计技术.清华大学出版社,2006[2] 谭浩强.C程序设计(第三版).清华大学出版社,2005[3] Kennth A.reek. C和指针(徐波译)[4] 另外还使用了百度中文搜索引擎九、程序清单#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <ctype.h>#define player1 1 /*一号玩家控制*/#define player2 2 /*二号玩家控制*/#define black 1 /*黑色棋子1*/#define white 2 /*白色棋子2*/struct cund /*用来保存棋局*/{char cun[20][20];int jx;int jy;int leiji;}cd;char kz=32;char qipan[20][20]={32};char linshi[20][20]={32};char filename[20]={"c:\\五子棋存档.dat"};int kongzhi;int lx=1,ly=1,leiji=0,jushu=1,sh1=0,sh2=0,he=0; int jx=1,jy=1;void huifu(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=linshi[i][j];}void fuzhi(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)linshi[i][j]=qipan[i][j];}void cundang(){FILE *fp;int i,j;if((fp=fopen(filename,"w"))==NULL){printf(" 存档失败!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fp);}else{for(i=0;i<20;i++){for(j=0;j<20;j++){cd.cun[i][j]=linshi[i][j];cd.jx=jx;cd.jy=jy;cd.leiji=leiji;}}fwrite(&cd,sizeof(struct cund),1,fp);printf(" 存档成功!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fp);system("cls");}}void duqu(){FILE *fpp;int i,j;if((fpp=fopen(filename,"r"))==NULL){printf(" 你还没有存档,读取存档失败!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();fclose(fpp);}else{fread(&cd,sizeof(struct cund),1,fpp);fclose(fpp);jx=cd.jx;jy=cd.jy;leiji=cd.leiji;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=cd.cun[i][j];system("cls");printf(" 读取存档成功,请继续游戏!!!\n");printf(" 按任意键返回游戏界面!!!");i=_getch();}}void jilu(char (*p)[20])/*记录悔棋前棋盘个子的位置以及悔棋后该谁落子*/{int i,j;for(i=0;i<20;i++){for(j=0;j<20;j++){*(*(p+i)+j)=qipan[i][j];}}}/*悔棋到上你次你的落子权*/void huiqi(char (*p)[20]){int i,j;for(i=0;i<20;i++){for(j=0;j<20;j++){qipan[i][j]=*(*(p+i)+j);}}}/*界面初始化*/void start(){int i,j,k=0;for(i=0;i<15;i++)qipan[i][0]=qipan[0][i]=i;printf("000|001|002|003|004|005|006|007|008|00 9|010|011|012|013|014|\n");for(i=1;i<15;i++){printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");for(j=0;j<15;j++){if(j==0){if(i<10) printf("00%d|",i);else printf("0%d|",i);}elseprintf(" %c |",qipan[i][j]);}printf("\n");}printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");}/*输出界面,每次走完一步棋都要刷新界面*/ void print(){int i=0,j=0,k=0;printf(" 第%d局\n",jushu);printf("一号玩家胜%d局平%d局二号玩家胜%d局\n",sh1,he,sh2);printf("000|001|002|003|004|005|006|007|008|00 9|010|011|012|013|014|\n");for(i=1;i<15;i++){printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");for(j=0;j<15;j++){if(j==0){if(i<10) printf("00%d|",i);else printf("0%d|",i);}elseprintf(" %c |",qipan[i][j]);}printf("\n");}printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");if(leiji%2==1)printf("\n \n\n 一号玩家落子:\n\n\n");elseprintf("\n \n\n 二号玩家落子:\n\n\n");}/*走棋函数*/void zq(char player,char (*p1)[20],char (*p2)[20]) {int mn=0,i=1,p,q;char key;key=_getch();if(player==white){while(1){switch(key){case 'j': if(ly>1) {huifu();ly--;qipan[lx][ly]=95;}system("cls");print();b reak;case 'l': if(ly<14){huifu();ly++;qipan[lx][ly]=95;}system("cls" );print();break;case 'k': if(lx<14){huifu();lx++;qipan[lx][ly]=95;}system("cls" );print();break;case 'i': if(lx>1) {huifu();lx--;qipan[lx][ly]=95;}system("cls");print();b reak;}key=_getch();if(key=='h'){if(linshi[lx][ly]==black||linshi[lx][ly]==white){system("cls");printf("请选择:\n");printf("【1】进入游戏界面存档\n");printf("【2】进入游戏悔棋界面\n");printf("");scanf("%d",&mn);if(mn==1){mn=0;printf("请选择:\n");printf("【1】保存游戏进度\n");printf("【2】读取游戏进度\n");printf("");scanf("%d",&mn);if(mn==1){mn=0;printf(" 你选择了保存游戏进度!!!\n");cundang();system("cls");print();}else if(mn==2){mn=0;printf("你选择了读取游戏进度!!!\n");duqu();fuzhi();system("cls");print();}}else if(mn==2){mn=0;printf(" 你选择了悔棋!!!\n");if(kongzhi==player1){if(leiji%2==0){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}elsehuiqi(p2);leiji-=2;jx--;jy--;fuzhi();system("cls");print();}else{if(leiji%2==1){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}elsehuiqi(p2);leiji-=2;jx--;jy--;fuzhi();system("cls");print();}}}elseif(linshi[lx][ly]!=black&&linshi[lx][ly]!=white){for(p=0;p<20;p++){for(q=0;q<20;q++){if(qipan[p][q]!=black&&qipan[p][q]!=white)qipan[p][q]=32;}}if(kongzhi==player1){if(2*jx==leiji){jilu(p1);jx++;}else if((2*jy-1)==leiji){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}else{if(2*jx==(leiji-1)){jilu(p1);jx++;}elseif((2*jy-1)==(leiji-1)){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}}}}}else if(player==black){while(1){switch(key){case 'a': if(ly>1) {huifu();ly--;qipan[lx][ly]=95;}system("cls");print();b reak;case 'd': if(ly<14){huifu();ly++;qipan[lx][ly]=95;}system("cls" );print();break;case 's': if(lx<14){huifu();lx++;qipan[lx][ly]=95;}system("cls" );print();break;case 'w': if(lx>1) {huifu();lx--;qipan[lx][ly]=95;}system("cls");print();b reak;}key=_getch();if(key=='f'){if(linshi[lx][ly]==black||linshi[lx][ly]==white){system("cls");printf("\n 请选择:\n");printf("【1】进入游戏界面存档\n");printf("【2】进入游戏悔棋界面\n");printf("");scanf("%d",&mn);if(mn==1){mn=0;printf("\n 请选择:\n");printf("【1】保存游戏进度\n");printf("【2】读取游戏进度\n");printf("");scanf("%d",&mn);if(mn==1){mn=0;printf(" 你选择了保存游戏进度!!!\n");cundang();}else if(mn==2){mn=0;printf("你选择了读取游戏进度!!!\n");duqu();fuzhi();system("cls");print();}}else if(mn==2){printf(" 你选择了悔棋!!!\n");if(kongzhi==player1){if(leiji%2==0){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else{huiqi(p2);}leiji-=2;jx--;jy--;fuzhi();system("cls");print();}else{if(leiji%2==1){huiqi(p2); /*先走棋的玩家悔棋时的n为偶数*/}else{huiqi(p2);}leiji-=2;jx--;jy--;fuzhi();system("cls");print();}}}elseif(linshi[lx][ly]!=black&&linshi[lx][ly]!=white){for(p=0;p<20;p++){for(q=0;q<20;q++){if(qipan[p][q]!=black&&qipan[p][q]!=white)qipan[p][q]=32;}}if(kongzhi==player1){if(2*jx==leiji){jilu(p1);jx++;}elseif((2*jy-1)==leiji){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}else{if(2*jx==(leiji-1)){jilu(p1);jx++;}elseif((2*jy-1)==(leiji-1)){jilu(p2);jy++;}qipan[lx][ly]=player;fuzhi();system("cls");print();break;}}}}}}int checkheqi(){char ch;if((leiji-1)==186){printf(" 真是棋逢敌手啊,棋已至此仍未能分出胜负...........\n");printf(" 但现在棋盘即将落满,请问两位棋士是否选择和棋,改日再战?Y / N ?\n");ch=getchar();while(ch!='Y'||ch!='N'){printf("请选择是或否Y / N ");ch=getchar();}if(ch=='Y'){printf("哈哈...来日方长...两位光然有棋士风范,拿得起放得下...改日再战...\n");return(3);}if(ch=='N'){printf(" 哈哈,看来两位都不愿和棋...... \n");printf(" 那就请继续下完此局,但是不要忘了,棋盘落满子的时候自动判为和棋.....\n");return(0);}}if((leiji-1)==196){printf(" \n\n棋盘已满,系统自动判为和棋,请两位棋士改日再战...........\n\n\n\n");return(5);}return(0);}/*判断是否有一方赢棋,并结束游戏*/int check(){int i,j;for(i=1;i<11;i++){for(j=1;j<11;j++){/*对一号玩家行检测*/if((qipan[i][j]==black)&&(qipan[i][j+1]==black )&&(qipan[i][j+2]==black)&&(qipan[i][j+3]==black) &&(qipan[i][j+4]==black)){printf("\n一号玩家胜出!二号玩家不要灰心,再接再厉!\n");return(1);}/*对一号玩家列检测*/if((qipan[i][j]==black)&&(qipan[i+1][j]==black )&&(qipan[i+2][j]==black)&&(qipan[i+3][j]==black) &&(qipan[i+4][j]==black)){printf("\n一号玩家胜出!二号玩家不要灰心,再接再厉!\n");return(1);}/*对二号玩家行检测*/if((qipan[i][j]==white)&&(qipan[i][j+1]==white )&&(qipan[i][j+2]==white)&&(qipan[i][j+3]==white)&&(qipan[i][j+4]==white)){printf("\n二号玩家胜出!一号玩家不要灰心,再接再厉!\n");return(2);}/*对二号玩家列检测*/if((qipan[i][j]==white)&&(qipan[i+1][j]==white)&&( qipan[i+2][j]==white)&&(qipan[i+3][j]==white)&&( qipan[i+4][j]==white)){printf("\n二号玩家胜出!一号玩家不要灰心,再接再厉!\n");return(2);}}}for(i=1;i<1;i++){for(j=14;j>4;j--){/*对一号玩家右斜线检测*/if(qipan[i][j]==black&&qipan[i+1][j-1]==black&&qi pan[i+2][j-2]==black&&qipan[i+3][j-3]==black&&qi pan[i+4][j-4]==black){printf("\n一号玩家胜出!二号玩家不要灰心,再接再厉!\n");return(1);}/*对二号玩家右斜线检测*/if(qipan[i][j]==white&&qipan[i+1][j-1]==white &&qipan[i+2][j-2]==white&&qipan[i+3][j-3]==white&&qipan[i+4][j-4]==white){printf("\n二号玩家胜出!一号玩家不要灰心,再接再厉!\n");return(2);}}}for(i=1;i<11;i++){for(j=1;j<11;j++){/*对一号玩家左斜线检测*/if(qipan[i][j]==black&&qipan[i+1][j+1]==black &&qipan[i+2][j+2]==black&&qipan[i+3][j+3]==black&&qipan[i+4][j+4]==black){printf("\n一号玩家胜出!二号玩家不要灰心,再接再厉!\n");return(1);}/*对二号玩家左斜线坚测*/if(qipan[i][j]==white&&qipan[i+1][j+1]==white&&qi pan[i+2][j+2]==white&&qipan[i+3][j+3]==white&& qipan[i+4][j+4]==white){printf("\n二号玩家胜出!一号玩家不要灰心,再接再厉!\n");return(1);} }}return(0);}/*输出游戏首页*/void Printsjm(){printf(" * * * * * * * * * * * * * * * 游戏名称* * * * * * * * * * * * * * **\n");printf(" * * * * * * * * *\n");printf(" * * * * * * 五子棋* * * * *\n");printf(" * * * * * * * * *\n");printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");printf("\n");printf(" * * * * * * * * * * * * * * * 游戏规则* * * * * * * * * * * * * * * *\n");printf(" * * * * * * * *\n");printf(" * * * * 游戏悔棋时不允许连续悔棋* * * *\n");printf(" * * * * * * * *\n");printf(" ************ 任一方五子相连即获胜,一局游戏也就结束***********\n");printf(" * * * * * * * *\n");printf(" ********* 请遵守游戏规则谢谢!!!********\n");printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");printf("\n");printf(" * * * * * * * * * * * * * * * 游戏制作* * * * * * * * * * * * * * * *\n");printf(" * * * * * * * *\n");printf(" *** *** 计算机工程学院094班*** ***\n");printf(" * * * * * * * *\n");printf(" * * * * * * * 王鹏* * * * * * *\n");printf(" * * * * * * * 2010.6.28 * * * * * * *\n");printf("******************************************* **************************\n");}/*数据初始化*/void newdata(){int i,j;lx=ly=jx=jy=jushu=1;leiji=sh1=sh2=he=0;for(i=0;i<20;i++)for(j=0;j<20;j++)qipan[i][j]=linshi[i][j]=32;}/* 主函数*/int main(){char ch,ch1='Y';char hq1[20][20]={0},hq2[20][20]={0};char (*p1)[20]=hq1,(*p2)[20]=hq2;int m=0,n=0;int i,j;system("color 5a");Printsjm();printf("\n\n\n\n 现在就开始游戏吗?(Y / N) "); /*确定开始游戏还是退出*/ch=getchar();while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n'){printf("您的输入有错误,请输入Y / N :");ch=getchar();}system("cls");while(ch1=='Y'||ch1=='y'){system("cls");if(ch=='Y'||ch=='y'){/*是就开始新游戏*/printf("第%d局游戏开始",jushu);}else if(ch=='N'||ch=='n')/*否则结束*/return(0);printf("\n\n\n 请选择一号玩家先落子还是二号玩家先落子?(1 / 2)");/*确定哪个玩家先落子*/scanf("%d",&kongzhi);newdata();if(kongzhi==player1){leiji=0;printf(" 一号玩家胜%d局平%d局二号玩家胜%d局\n",sh1,he,sh2);printf(" 本局游戏一号玩家先落子,现在游戏开始了!!! \n");}else if(kongzhi==player2){leiji=1;printf("一号玩家胜%d局平%d局二号玩家胜%d局\n",sh1,he,sh2);printf(" 本局游戏二号玩家先落子,现在游戏开始了!!! \n");}start(); /*窗口初始化,游戏开始*/do{if(leiji%2==0){kz=black;}else if(leiji%2==1){kz=white;}leiji++;n++;zq(kz,p1,p2);/*调用走棋函数*/system("cls");print();m=checkheqi();/*没有选择和棋则继续游戏*/if(m==0) ;/*选择和棋则结束游戏*/if(m==3) {he++; break;}/*如果没有选择和棋,并且棋盘已满,则强制结束游戏,判为和棋*/if(m==5) {he++; break;}m=check();if(m==1) sh1++;else if(m==2) sh2++;}while(m==0);for(i=0;i<20;i++){for(j=0;j<20;j++){qipan[i][j]=0;hq1[i][j]=0;hq2[i][j]=0;}}jushu+=1;printf(" 是否进行第%d局?Y / N ",jushu);for(i=0;i<20;i++)for(j=0;j<20;j++){qipan[i][j]=0;linshi[i][j]=0;}ch1=getchar();ch1=getchar();}return(0);}。

相关主题