当前位置:首页 >> IT/计算机 >>

c语言报告五子棋


青岛理工大学
语言程序设计 设计》 《C 语言程序设计》

题目

游戏五子棋

指导教师: 姓名: 学号:
班级:

李兰 王鹏 200907127
计算 094

专业:

计算机科学与技术

地点: 二号实验楼第六机房 时间: 6.28 至 7.1

1

一,内容 游戏五子棋
在这个小游戏中,实现了两人对战的游戏模式,没有添加禁手规则,另外考虑到落子时的可 能失误,就添加了悔棋工具,游戏过程中可以进行游戏存档,进入悔棋和存档的方法为将光 标移动到已有子的位置, 敲一下落子键即可. 下次游戏时候可以进入存档界面然后选择读取 游戏存档即可继续玩上次的游戏.在游戏时自动计算双方各胜几局,平几局. 按键控制 一号玩家: 上 :w 下 :s 左 : a 右 : d 落子 : f 二号玩家: 上 :I 下 :k 左 : j 右 : l 落子 : h

二,上机环境
操作系统:Windows 98/XP/Win 7 开发工具:VC++6.0

三,函数调用关系图

main()

system()

Printsjm()

print()

checkheqi()

fuzhi()

newdata()

check()

start()

huifu()

zq()

huiqi()

jilu()

2

四,各函数功能说明
对每个函数功能加以说明,说明该函数主要实现了什么内容.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main() system("color 5a") system("cls") Printsjm(void) start(void) print(void) check(void) checkheqi(void) zq(int,char (*p)[],char (*p)[]) huiqi(char (*p)[]) jilu(char (*p)[]) cundang(void) duqu(void) fuzhi(void) huifu(void) newdata(void) 主函数 控制台前景,背景颜色设置 清屏 输出游戏首界面 界面初始化 界面刷新 检测是否有一方赢棋 检测是否和棋 走棋落子 悔棋 记录上次落子前的界面 存储游戏进度 读取游戏进度 保存临时界面 恢复临时界面以实现光标移动 数据刷新

五,算法描述或流程图
system("color 5a")和 system("cls") 只需要调用<stdlib.h>头文件,并在使用 前将要声明的变量声明好即可.

/*输出游戏首页*/ /*输出游戏首页*/ 输出游戏首页 /*原样输出即可 原样输出即可*/ /*原样输出即可*/
void Printsjm() {

printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf("

* * * * * * * * * * * * * * * 游戏名称 * * * * * * * * * * * * * * **\n"); * *** * * * * * * * * * * * * 五子棋 * * * * * * * *\n");

* * *\n"); * *\n");

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); \n"); * * * * * * * * * * * * * * * 游戏规则* * * * * * * * * * * * * * * *\n"); **** **** **** ************ **** ********* 请遵守游戏规则谢谢!! ! 任一方五子相连即获胜,一局游戏也就结束 游戏悔棋时不允许连续悔棋 * * * *\n"); * * * *\n"); * * * *\n"); ***********\n"); * * * *\n"); ********\n");

3

printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf("

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); \n"); * * * * * * * * * * * * * * * 游戏制作* * * * * * * * * * * * * * * *\n"); **** *** *** 计算机工程学院 094 班 王鹏 2010.6.28 * * * *\n"); *** ***\n");

**** ******* *******

* * * *\n"); * * * * * * *\n"); * * * * * * *\n");

*********************************************************************\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];

/*数据恢复 数据恢复*/ 数据恢复
4

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(" 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(" printf(" i=_getch(); } 读取存档成功,请继续游戏!!\n"); ! 按任意键返回游戏界面!!"); ! 你还没有存档,读取存档失败!!\n"); ! 按任意键返回游戏界面!!"); !

}

记录悔棋前棋盘个子的位置以及悔棋后该谁落子*/ void jilu(char (*p)[20])/*记录悔棋前棋盘个子的位置以及悔棋后该谁落子 记录悔棋前棋盘个子的位置以及悔棋后该谁落子
5

{ 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()函数也是同样道理*/ /*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)

6

{ if(i<10) printf("00%d|",i);/*显示可控制行坐标以及左边界*/ /*显示可控制行坐标以及左边界*/ 显示可控制行坐标以及左边界 else printf("0%d|",i); } else printf(" %c |",qipan[i][j]); } printf("\n");

/*显示棋盘上的字符以及由边界*/ /*显示棋盘上的字符以及由边界*/ 显示棋盘上的字符以及由边界

/*显示棋盘下边界*/ /*显示棋盘下边界*/ 显示棋盘下边界
printf("---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");

if(leiji%2==1) printf("\n \n\n else printf("\n \n\n }

一号玩家落子:\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) /*统计数初始值为 /*统计数初始值为 { printf(" printf(" ch=getchar(); while(ch!='Y'||ch!='N')/*显示询问界面,提示是否和棋*/ /*显示询问界面 提示是否和棋*/ 显示询问界面, { printf("请选择是或否 Y / N "); ch=getchar(); } if(ch=='Y') { 真是棋逢敌手啊,棋已至此仍未能分出胜负...........\n"); 但现在棋盘即将落满, 请问两位棋士是否选择和棋,改日再战? Y / N ?\n");

/*右斜线检测*/ /*右斜线检测*/ 右斜线检测 /*检测双方是否和棋并在棋盘满的时候自动判和棋 检测双方是否和棋并在棋盘满的时候自动判和棋*/ /*检测双方是否和棋并在棋盘满的时候自动判和棋*/

现在减一来判断棋子数是否快落满棋盘*/ 1, 现在减一来判断棋子数是否快落满棋盘*/

/*选择是,如下输出,并返回主函数所需的控制值*/ /*选择是,如下输出,并返回主函数所需的控制值*/ 选择是

7

printf("哈哈...来日方长...两位光然有棋士风范,拿得起放得下...改日再战...\n"); return(3); } if(ch=='N') { printf(" printf(" return(0); } 哈哈,看来两位都不愿和棋...... \n"); 那就请继续下完此局,但是不要忘了,棋盘落满子的时候自动判为和棋.....\n");

/*选择否,如下输出,并返回主函数所需的控制值*/ /*选择否,如下输出,并返回主函数所需的控制值*/ 选择否

} if((leiji-1)==196)/*当棋子数等于棋盘空格数时自动判和棋,并返回主函数所需 /*当棋子数等于棋盘空格数时自动判和棋, 当棋子数等于棋盘空格数时自动判和棋

的控制值*/ 的控制值*/
{ printf(" return(5); } return(0);/*否则返回零继续游戏*/ /*否则返回零继续游戏*/ /*否则返回零继续游戏 \n\n 棋盘已满,系统自动判为和棋,请两位棋士改日再战...........\n\n\n\n");

}

/*一下语句块为 zq(),huiqi(),jilu(),fuzhi(),huifu()五 /*一下语句块为 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') {

8

if(linshi[lx][ly]==black||linshi[lx][ly]==white) { system("cls"); printf("请选择:\n"); printf(" printf(" printf(" scanf("%d",&mn); if(mn==1) { mn=0; printf("请选择:\n"); printf(" printf(" printf(" scanf("%d",&mn); if(mn==1) { mn=0; printf(" cundang(); system("cls"); print(); } else if(mn==2) { mn=0; printf(" duqu(); fuzhi(); system("cls"); print(); } } else if(mn==2) { mn=0; printf(" 你选择了悔棋!!\n"); ! 你选择了读取游戏进度!!\n"); ! 你选择了保存游戏进度!!\n"); ! 【1】保存游戏进度\n"); 【2】读取游戏进度\n"); "); 【1】进入游戏界面存档\n"); 【2】进入游戏悔棋界面\n"); ");

if(kongzhi==player1) { if(leiji%2==0) { huiqi(p2); /*先走棋的玩家悔棋时的 n 为偶数*/

9

}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++; }

10

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");

11

printf("\n printf(" printf(" printf("

请选择:\n"); 【1】进入游戏界面存档\n"); 【2】进入游戏悔棋界面\n"); ");

scanf("%d",&mn); if(mn==1) { mn=0; printf("\n printf(" printf(" printf(" scanf("%d",&mn); if(mn==1) { mn=0; printf(" cundang(); } else if(mn==2) { mn=0; printf(" duqu(); fuzhi(); system("cls"); print(); } } else if(mn==2) { printf(" 你选择了悔棋!!\n"); ! 你选择了读取游戏进度!!\n"); ! 你选择了保存游戏进度!!\n"); ! 请选择:\n"); 【1】保存游戏进度\n"); 【2】读取游戏进度\n"); ");

if(kongzhi==player1) { if(leiji%2==0) { huiqi(p2); /*先走棋的玩家悔棋时的 n 为偶数*/ } else {huiqi(p2); } leiji-=2; jx--; jy--;

12

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++; } }}

13

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; }

六,程序运行效果图
/*游戏首界面如下*/ /*游戏首界面如下*/ 游戏首界面如下
14

/*以下为选择谁先落子的界面*/ /*以下为选择谁先落子的界面*/ 以下为选择谁先落子的界面

/*存档时的界面*/ /*存档时的界面*/ 存档时的界面

/*存档成功的界面*/ /*存档成功的界面*/ 存档成功的界面

15

/*走棋时的界面,也是悔棋前的界面*/ /*走棋时的界面,也是悔棋前的界面*/ 走棋时的界面

/*悔棋时的界面*/ /*悔棋时的界面*/ 悔棋时的界面

/*悔棋后的界面*/ /*悔棋后的界面*/ 悔棋后的界面

16

/*以下为赢棋的界面*/ /*以下为赢棋的界面*/ 以下为赢棋的界面

17

七,体会
经过这次课程设计,我发现在很多地方的知识都不足,很多函数和技巧都要从网络 上或其他书籍上找, 可能学计算机要看看很多很多书, 尤其在大学, 很多情况下都需要自学, 我想在以后的学习和实践工作中,会多读多看多练的,努力让自己的实力得到提高,在这个 小游戏中,不能调用鼠标,只能通过输入坐标点位置,这是一个很大的不足,以后学习了一 定要修改的更好!

八,参考文献
[1] 湛为芳.C 语言程序设计技术.清华大学出版社,2006

18

[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 #define white 2 /*一号玩家控制*/ /*二号玩家控制*/ /*黑色棋子 1*/ /*白色棋子 2*/ void cundang() { FILE *fp; int i,j; int i,j; for(i=0;i<20;i++) for(j=0;j<20;j++) linshi[i][j]=qipan[i][j];

struct cund {

/*用来保存棋局*/

if((fp=fopen(filename,"w"))==NULL) { 存档失败!!\n"); !

char cun[20][20]; int jx; int jy; int leiji; }cd; } else 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; {

printf("

printf(" 按任意键返回游戏界面!!"); ! i=_getch(); fclose(fp);

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;

void huifu() { int i,j; for(i=0;i<20;i++) for(j=0;j<20;j++) qipan[i][j]=linshi[i][j]; } }

}

fwrite(&cd,sizeof(struct cund),1,fp); printf(" 存档成功!!\n"); ! printf(" 按任意键返回游戏界面!!"); ! i=_getch(); fclose(fp); system("cls");

void fuzhi() { }

}

19

{ 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(); } 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++) void jilu(char (*p)[20])/*记录悔棋前棋盘个子的位 置以及悔棋后该谁落子*/ { int i,j; printf("---|---|---|---|---|---|---|---|---|---|---|---|---|--|---|\n"); for(j=0;j<15;j++) { if(j==0) for(i=0;i<20;i++) { for(j=0;j<20;j++) { if(i<10) printf("00%d|",i); else printf("0%d|",i); { 按任意键返回游戏界 读取存档成功,请继续 /*界面初始化*/ void start() { int i,j,k=0; } } } int i,j; for(i=0;i<20;i++) { for(j=0;j<20;j++) { qipan[i][j]=*(*(p+i)+j); 按任意键返 /*悔棋到上你次你的落子权*/ void huiqi(char (*p)[20]) { 你还没有存 } } } *(*(p+i)+j)=qipan[i][j];

20

} else printf(" %c |",qipan[i][j]); } printf("\n");

if(leiji%2==1) printf("\n \n\n 家落子:\n\n\n"); else printf("\n \n\n 家落子:\n\n\n"); 二号玩 一号玩

} printf("---|---|---|---|---|---|---|---|---|---|---|---|---|--|---|\n");

}

}

/*走棋函数*/ void zq(char player,char (*p1)[20],char (*p2)[20]) {

/*输出界面,每次走完一步棋都要刷新界面*/ void print() { int i=0,j=0,k=0; printf(" \n",jushu); printf("一号玩家胜%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++) { case switch(key) { 'j': if(ly>1) 平%d 局 第%d 局 int mn=0,i=1,p,q; char key; key=_getch(); if(player==white) { while(1) {

{huifu();ly--;qipan[lx][ly]=95;}system("cls");print();b printf("---|---|---|---|---|---|---|---|---|---|---|---|---|--|---|\n"); for(j=0;j<15;j++) { if(j==0) { if(i<10) printf("00%d|",i); else printf("0%d|",i); } else printf(" %c |",qipan[i][j]); } printf("\n"); 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') {

} printf("---|---|---|---|---|---|---|---|---|---|---|---|---|--|---|\n"); if(linshi[lx][ly]==black||linshi[lx][ly]==white) { system("cls");

21

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(); if(leiji%2==1) system("cls"); print(); } else if(mn==2) { mn=0; printf(" 你选择了读取游戏进度!!\n"); ! duqu(); fuzhi(); huiqi(p2); 你 system("cls"); huiqi(p2); if(leiji%2==0) if(kongzhi==player1) 择了悔棋!!\n"); !

mn=0; printf(" 你选

{

{ huiqi(p2); /*先走棋的玩家悔棋时的 n 为偶数*/

}else

leiji-=2; jx--; jy--;

fuzhi();

print(); } else {

{ huiqi(p2); /*先走棋的玩家悔棋时的 n 为偶数*/

}else

leiji-=2; jx--; jy--;

fuzhi(); system("cls"); print(); } } else if(mn==2) { } } system("cls"); print();

22

else } else if(linshi[lx][ly]!=black&&linshi[lx][ly]!=white) { for(p=0;p<20;p++) { for(q=0;q<20;q++) { qipan[lx][ly]=player; fuzhi(); if(qipan[p][q]!=black&&qipan[p][q]!=white) system("cls"); print(); qipan[p][q]=32; } } } if(kongzhi==player1) { } if(2*jx==leiji) { jilu(p1); jx++; } else if((2*jy-1)==leiji) { jilu(p2); jy++; } case else if(player==black) { while(1) { switch(key) { 'a': if(ly>1) } } } break; } if((2*jy-1)==(leiji-1)) { jilu(p2); jy++;

{huifu();ly--;qipan[lx][ly]=95;}system("cls");print();b reak; case 'd':

qipan[lx][ly]=player; fuzhi(); system("cls"); print();

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;

break; } else { if(2*jx==(leiji-1)) { jilu(p1); jx++; }

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)

23

{ 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(); if(leiji%2==1) 你 system("cls"); 请 huiqi(p2); 请选择: if(kongzhi==player1) 择了悔棋!!\n"); !

printf("

你选

{ if(leiji%2==0) { huiqi(p2); /* 先走棋的玩家悔棋时的 n 为偶数*/

} else {

} leiji-=2; jx--; jy--; fuzhi();

print(); } else {

{ huiqi(p2); /* 先走棋的玩家悔棋时的 n 为偶数*/

} else

system("cls"); print(); } } else if(mn==2) { huiqi(p2);

{

} leiji-=2;

24

jx--; jy--; fuzhi(); } else { system("cls"); print(); }

break;

if(2*jx==(leiji-1)) { jilu(p1); jx++; } else } else if((2*jy-1)==(leiji-1)) { jilu(p2); jy++; for(p=0;p<20;p++) { qipan[lx][ly]=player; } }

if(linshi[lx][ly]!=black&&linshi[lx][ly]!=white) {

for(q=0;q<20;q++) {

fuzhi(); system("cls"); print();

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(); } if(ch=='Y') N ?\n"); ch=getchar(); while(ch!='Y'||ch!='N') { } } int checkheqi() { char ch; if((leiji-1)==186) { printf(" } } }

break;

真是棋逢敌手 但现在棋盘即将落

啊,棋已至此仍未能分出胜负...........\n"); printf(" 满,请问两位棋士是否选择和棋,改日再战?Y /

printf("请选择是或否 Y / N "); ch=getchar();

25

{ printf("哈哈...来日方长...两位光然 有棋士风范,拿得起放得下...改日再战...\n"); return(3); } if(ch=='N') { printf(" 哈,看来两位都不愿和棋...... printf(" 棋.....\n"); return(0); } \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((leiji-1)==196) { printf(" \n\n 棋盘已满,系统自动判为 和棋,请两位棋士改日再战...........\n\n\n\n"); return(5); } return(0);

}

/*对二号玩家行检测*/

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)) {

} /*判断是否有一方赢棋,并结束游戏*/ int check() { int i,j; for(i=1;i<11;i++) { for(j=1;j<11;j++) { /*对一号玩家行检测*/ if((qipan[i][j]==white)&&(qipan[i+1][j]==white)&&( qipan[i+2][j]==white)&&(qipan[i+3][j]==white)&&( qipan[i+4][j] if((qipan[i][j]==black)&&(qipan[i][j+1]==black )&&(qipan[i][j+2]==black)&&(qipan[i][j+3]==black) && ==white)) { printf("\n 二号玩家胜出! 一号 玩家不要灰心,再接再厉!\n"); return(2); printf("\n 一号玩家胜出! 二号 玩家不要灰心,再接再厉!\n"); } } /*对二号玩家列检测*/ } printf("\n 二号玩家胜出! 一号 玩家不要灰心,再接再厉!\n"); return(2);

(qipan[i][j+4]==black)) {

26

}

&&qipan[i+2][j+2]==black&&qipan[i+3][j+3]

for(i=1;i<1;i++) { for(j=14;j>4;j--) {

==black&&qipan[i+4][j+4]==black)

{ printf("\n 一号玩家胜出! 二号

/*对一号玩家右斜线检测*/

玩家不要灰心,再接再厉!\n"); return(1);

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&&qi pan[i+2][j+2]==white&&qipan[i+3][j+3]==white&& qipan[i+4][j+4]

==white) {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]

return(0);

/*输出游戏首页*/ void Printsjm() { * * * * * * * * * * * * * * * 游戏

==white&&qipan[i+4][j-4]==white) { printf("\n 二号玩家胜出! 一号 玩家不要灰心,再接再厉!\n"); return(2); } } } *

printf("

名称 * * * * * * * * * * * * * * **\n"); printf(" * * * *\n"); * * * * * *\n"); ******************* * * * * * * * *\n"); * * * * * * * *

printf(" 五子棋 printf(" * *

printf("

* * * * * * * * * * * * * * * *\n"); for(i=1;i<11;i++) { for(j=1;j<11;j++) { \n"); printf(" * * * * * * * * * * * * * * * 游戏 规则* * * * * * * * * * * * * * * *\n"); printf(" /*对一号玩家左斜线检测*/ * * * *\n"); printf(" if(qipan[i][j]==black&&qipan[i+1][j+1]==black * * * * 游戏悔 * * * *\n"); 棋时不允许连续悔棋 * * * * printf("

27

printf(" * * * *\n"); printf(" ************

*

*

*

*

char (*p1)[20]=hq1,(*p2)[20]=hq2; int m=0,n=0;

任一方五子相 ***********\n"); * * * *

int i,j; system("color 5a");

连即获胜, 一局游戏也就结束 printf(" * * * *\n"); printf(" *********

Printsjm(); 请遵 ********\n"); 出*/ printf("\n\n\n\n 开始游戏吗? (Y / N) 现在就 "); /*确定开始游戏还是退

守游戏规则谢谢!! ! printf("

*******************

* * * * * * * * * * * * * * * *\n"); printf(" \n"); printf(" * * * * * * * * * * * * * * * 游戏 制作* * * * * * * * * * * * * * * *\n"); printf(" * * * *\n"); printf(" *** *** 计 *** } system("cls"); while(ch1=='Y'||ch1=='y') * * * * { system("cls"); * * * * * * * if(ch=='Y'||ch=='y') { * * * * * * * 第 /*是就开始新游戏*/ printf(" %d 局 游 戏 开 始 算机工程学院 094 班 ***\n"); printf(" * * * *\n"); printf(" 王鹏 * * * * * * *\n"); printf(" 2010.6.28 * * * * "); ch=getchar(); ch=getchar(); while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n') { printf("您的输入有错误,请输入 Y / N :

* * * * * * *\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}; 主函数 */

",jushu);

} else if(ch=='N'||ch=='n') /*否则结束*/ return(0); 请选择一号玩

printf("\n\n\n 个玩家先落子*/

家先落子还是二号玩家先落子?(1 / 2)");/*确定哪

scanf("%d",&kongzhi); newdata();

if(kongzhi==player1) {

leiji=0;

28

printf(" 一号玩家胜%d 局 二号玩家胜%d 局\n",sh1,he,sh2); printf(" 家先落子,现在游戏开始了!!! }else if(kongzhi==player2)

平%d 局 本局游戏一号玩 \n");

if(m==3) {he++; 则强制结束游戏,判为和棋*/ if(m==5) m=check(); if(m==1) sh1++;

break;}

/*如果没有选择和棋,并且棋盘已满,

{he++; break;}

{ leiji=1; printf("一号玩家胜%d 局 二号玩家胜%d 局\n",sh1,he,sh2); printf(" 家先落子,现在游戏开始了!!! } start(); /*窗口初始化,游戏开始*/ do { if(leiji%2==0) { kz=black; } } 本局游戏二号玩 \n"); 平%d 局

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(" 是否进 ",jushu); 行第%d 局?Y / N

} else if(leiji%2==1) { kz=white;

for(i=0;i<20;i++) for(j=0;j<20;j++) { qipan[i][j]=0;

} leiji++;n++; zq(kz,p1,p2);/*调用走棋函数*/ system("cls"); print(); m=checkheqi(); /*没有选择和棋则继续游戏*/ if(m==0) ; /*选择和棋则结束游戏*/ } } return(0); }

linshi[i][j]=0;

ch1=getchar(); ch1=getchar();

29


相关文章:
2012年C语言五子棋课程设计报告
2012年C语言五子棋课程设计报告_工学_高等教育_教育专区。C语言五子棋课程设计报告,到流程图,模版 本科《控制软件设计》课程设计 题学 专年学姓同 目院 业级号...
C语言五子棋源代码 设计报告
C 语言程序设计综合实验 设计报告 题目: 班级; 人数: 五子棋 07 电气(1)班 4人 小组成员: 时间: 08.9.19 目录 1 课程设计报告 1.1 课题描述 1.2 ...
C语言课程设计五子棋源代码_+设计报告
C语言课程设计五子棋源代码_+设计报告_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 C语言课程设计五子棋源代码_+设计报告_计算机...
五子棋源码实验报告及人机对战说明
五子棋源码实验报告及人机对战说明_计算机软件及应用_IT/计算机_专业资料。C语言五子棋源码、实验报告、人机对战说明 1. 五子棋对战说明 2. 实验报告 3. 源...
(完整版)基于C语言的五子棋程序毕业课程设计报告
(完整版)基于C语言五子棋程序毕业课程设计报告 - 研究报告,创业计划,项目建议书,可行性分析,可研报告,可行性研究报告,项目研究报告,商业计划
c语言五子棋课程设计_图文
c语言五子棋课程设计 - 枣庄学院 信息科学与工程学院 课程设计任务书 题目: C 语言程序设计:五子棋 学姓专课 号: 名: 业: 程: 马怀志 201112130335...
(最新版)基于C语言的五子棋程序毕业课程设计报告
石家庄铁道学院课程设计 基于 C 语言五子棋程序课程设计 单专学 位:数 0901 分院(系) 业 :数学与应用数学 号: 学生姓名 :许晓倩 指导教师 :石玉晶 完成...
《C++语言程序设计》课程设计报告--五子棋
《C++语言程序设计》课程设计报告--五子棋_理学_高等教育_教育专区。C++语言程序...C语言程序设计课程设计实... 15页 免费 喜欢此文档的还喜欢 c++...
基于C语言的五子棋程序毕业课程设计报告
基于C语言五子棋程序毕业课程设计报告 - (此文档为 WORD 格式,下载后您可任意编辑修改!) 石家庄铁道学院课程设计 基于 C 语言五子棋程序课程设计 单专学 位...
(精品)基于C语言的五子棋程序毕业课程设计报告
(精品)基于C语言五子棋程序毕业课程设计报告_工学_高等教育_教育专区。研究报告,项目建议书,项目建设,项目论证,项目可行性研究报告,可行性研究报告,项目推广 ...
更多相关标签: