五子棋游戏的论文及源代码.docx
- 文档编号:7726168
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:37
- 大小:350.09KB
五子棋游戏的论文及源代码.docx
《五子棋游戏的论文及源代码.docx》由会员分享,可在线阅读,更多相关《五子棋游戏的论文及源代码.docx(37页珍藏版)》请在冰豆网上搜索。
五子棋游戏的论文及源代码
本科生课程论文
论文题目五子棋游戏
五子棋游戏
【摘要】
为了设计人人对弈模式的五子棋游戏系统,采用了C语言函数模块化程序设计方法,利用VisualC++6.0编译器运行游戏,实现一方执白棋,一方执黑棋,通过屏幕上的文字提示,轮流走棋,最先使五子相连一方获胜的人人对弈功能。
通过本程序的训练,加深对C语言的了解,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。
【关键字】五子棋函数
设计目的:
本程序旨在进一步训练学生游戏开发的技巧,掌握C语言图形模式下的编程。
本程序设计很多图形函数,包括坐标定位;颜色设置(背景色和文本颜色设置)、线条颜色、填充颜色;直线风格、文本风格、填充风格;画线、画圆、画矩形函数;PC扬声器的打开、延迟、关闭;图形系统的初始化和关闭;图形屏幕和文字屏幕的清除;从键盘获取键值等。
功能:
实现界面的初始化功能、下棋功能、胜负判断功能和帮助功能。
1)初始化功能。
程序初始化屏幕和棋盘,默认Player1先行。
2)实现下棋功能。
程序能实现下棋操作,在下棋过程中能随时退出。
3)胜负判断。
程序能对下棋的结果进行判断,分出胜负,并显示获胜信息。
4)显示帮助信息。
程序能提示玩家轮到哪方下棋了。
问题分析:
首先要实现五子棋的行棋功能,在程序中可以通过坐标来定位棋子的位置,用不同的字符表示黑白棋子,并通过变量的交替实现黑白棋子的交替显示。
另一个难点就是对于胜负的判断,这需要通过循环函数的嵌套使用,难点在于逻辑调理的把握,循环之间的对应关系。
还有一个难点就是在游戏中能随时返回主菜单,这需要一个选择结构来实现,将主菜单的程序编入主函数,在得到特定指令时返回主函数,从而返回主菜单。
下棋过程中对于不断地输入坐标,可以用一个死循环来是实现,在特定的条件下退出循环,返回主函数。
程序设计:
一、主要函数介绍
本程序主要用到了main ()[1]、startGame()、printState()、judge()、help()、aboutThanks()等函数。
主函数中设计成死循环,再循环过程中通过选择调用其它函数。
被调用的函数运行完后再次返回到主函数中。
1、主函数main()
运行主函数,首先调用system("colore0")[2]函数,改变运行界面的前景色和背景色。
然后进入一个死循环while
(1),再循环中输出主菜单的内容,包括标题、开始游戏、游戏帮助、游戏鸣谢、退出程序、请选择等字样。
然后,调用scanf()函数,从键盘上获得一个数值付给变量i,接着进行健壮性处理。
最后调用switch语句,通过选择调用其它函数。
2、startGame()函数
此函数为自定义函数,首先用一个for语句实现19*19的棋盘的初步绘制,将19*19的坐标全绘制成“*”状。
接着调用printState()函数,实现当前棋盘的显示。
然后进入下棋的循环,提示下子一方并调用fflush(stdin)[2]函数清除缓存。
然后,通过switch语句,根据从键盘上得到的值做出相应的判断,实现退格键悔棋、Esc键返回主菜单、A-S输入坐标、其他输入错误。
接着判断该坐标是否有子,有子提示重新指定坐标,否则,该位置显示相应的棋子。
除第一次下子前外,下一步将调用judge()函数,来判断是否有一方获胜。
判断结束后再次调用printState()显示当前棋盘。
最后交换期权。
此函数的核心代码如下:
switch(t=getch())
{
case8:
{//退格键悔棋
i=m-'A';
j=n-'A';
state[i][j]='*';
printState();
printf("\n\t提示:
%s方悔棋!
\n\n",player?
"白":
"黑");
player=!
player;
continue;
}break;
case27:
{system("cls");return;}break;//Esc键返回主菜单
case65:
{n=t;printf("%C\n",n);getch();}break;//纵坐标输入
………………
case115:
{n=t;printf("%C\n",n);n=n-32;getch();}break;
default:
printf("\t\t请输入属于
\n");continue;
}
i=m-'A';
j=n-'A';
if(state[i][j]!
='*')//判断是否有子
{
printf("\t提示:
该位置已经有子,请重新指定坐标!
");
continue;
}
c=player?
4:
79;//为棋子赋值
state[i][j]=c;
if(a!
=0)judge();//判断胜负
a++;
printState();//显示当前棋盘
player=!
player;//交换棋权
3、printState()函数
此函数为自定义函数,主要实现当前棋盘的输出,首先定义字符变量,接着清除屏幕,然后输出周围的字母和中心的“*”字符。
核心代码为:
for(i=0;i { printf("%c",p+i);//输出第一行的所有字符 } printf("\n\t");//换行 for(i=0;i { printf("%c",p+i);//输出行坐标(左边的字母) for(j=0;j { printf("%c",state[i][j]);//输出该行的内容 } printf("%c\n\t",p+i);//输出右侧的坐标 } printf(""); for(i=0;i { printf("%c",p+i);//输出最后一行的所有字符 } 4、judge()函数 此函数为自定义函数,主要实现对棋局胜负的判断。 首先通过for语句的嵌套实用实现纵向的判断,判断纵向是否形成五子相连的情况。 其核心代码为: if(state[i+1][j]! =state[i][j])//纵向判断 { if(state[i-1][j]! =state[i][j]); else if(state[i-2][j]! =state[i][j]); else if(state[i-3][j]! =state[i][j]); else if(state[i-4][j]! =state[i][j]); else { printState(); printf("\n\t提示: %s方胜! \n\n",player? "黑": "白"); printf("\t\t\t按回车键确认结果并返回游戏\n\n"); while (1) { switch(t=getch()) { case13: {system("cls");return;}break; default: printf("\t\t输入错误,请输入正确的口令。 \n");continue; } } } } else ……………… 5、help()函数 此函数为自定义函数,主要实现输出帮助信息,包括游戏说明、基本规则、神父判断的说明。 核心代码为: system("cls")[2]; printf("\n\n\t游戏说明: \n\n"); ……………… printf("\t\t\t按Esc键返回主菜单\n\n"); while (1) { switch(t=getch()) { case27: {system("cls");return;}break; default: printf("\t\t输入错误,请输入正确的口令。 \n");continue; } } 6、aboutThanks()函数 此函数为自定义函数,主要实现输出鸣谢信息。 其核心代码为: system("cls"); printf("\n\n\n\t鸣谢: \n\n\n\t\t1.我的C语言老师: XXX老师。 "); ……………… while (1) { switch(t=getch()) { case27: {system("cls");return;}break; default: printf("\t\t输入错误,请输入正确的口令。 \n");continue; } 二、程序框图 三、程序截图 1、主菜单界面: 2、游戏界面: 3、帮助界面: 4、鸣谢界面: 5、退出界面: 6、悔棋提示界面: 7、输入错误提醒界面: 8、获胜提示界面: 总结: 程序中多次用到循环语句的嵌套使用,难点在于对逻辑条理性的把握和对五子棋规则的正确理解。 为了实现在游戏中随时能够返回主菜单,先后试验了scanf()、getchar()、getch()函数,scanf()函数只能从键盘上得到字符,但不能识别Esc等键。 getchar()也不能显示Esc等键,无法对输入的Esc键作出判断,并且需要按回车后再给出返回值。 而getch()可以直接返回键盘的键值,但是并不在屏幕上显示。 为了解决这一问题,将getch()的值先付给一个变量,再用printf()语句输出变量。 本次设计的一大收获就是对程序结构重要性的认识,一个结构清晰的程序,对于程序的调试、改错、阅读等都有着重要意义,可以让程序员省去不必要的麻烦。 另外,程序的注释也很重要,注释不仅仅是给读程序的人看,也是给写程序的人看的。 当程序要写好多页时,有时程序员也会忘记之前的程序是实现什么功能的,所以注释是相当必要的。 通过本次设计,对C语言有了更近一步的认识,对以后进一步学习具有重要意义。 参考文献: [1]谭浩强C程序设计(第四版)清华大学出版社 [2]XX搜索 课程论文成绩评定表 学生姓名 XXX 专业班级 XXXXX 论文题目 五子棋游戏 指导教师评语及意见: 成绩: 指导教师签字 年月日 附件: 源代码 #include #include #defineN19 #include inta=0,t,m,n,i,j,k,size=N; intplayer=1;//当前是黑方下子player=1 charstate[N][N]; charc;//用来存放显示黑白子的变量 voidstartGame(); voidprintState(); voidjudge(); voidhelp(); voidaboutThanks(); intmain() { system("colore0");//界面颜色 while (1) { printf("\n\n\t\t\t---高级语言课程设计xxxxx---\n\n"); printf("\t\t\t\t五子棋游戏\n\n\n"); printf("\t\t\t\t1.开始游戏。 \n\n"); printf("\t\t\t\t2.游戏帮助。 \n\n"); printf("\t\t\t\t3.游戏鸣谢。 \n\n"); printf("\t\t\t\t4.退出程序。 \n\n"); printf("\n\t\t\t请选择: "); L: k=scanf("%d",&i); if(k==0)//遇到异常,做健壮性处理... { printf("\n\t提示: 输入非格式选项! \n\t请重新输入1-4的整数: "); fflush(stdin);//清空缓冲内存区 gotoL; } switch(i)//选择选项 { case1: startGame();break; case2: help();break; case3: aboutThanks();break; case4: printf("\n\t\t\t请按任意键安全退出\n\t\t\t"); return0;//结束整个程序。 default: printf("\t温馨提示: 无此选项\n");break; } } } voidstartGame()//开始游戏 { for(i=0;i { for(j=0;j { state[i][j]='*'; } } printState();//显示棋盘 while (1) { printf("\n\t请%s方下子: ",player? "黑": "白"); fflush(stdin); switch(t=getch()) { case8: {//退格键悔棋 i=m-'A'; j=n-'A'; state[i][j]='*'; printState(); printf("\n\t提示: %s方悔棋! \n\n",player? "白": "黑"); player=! player; continue; }break; case27: {system("cls");return;}break;//Esc键返回主菜单 case65: {m=t;printf("\t%C",m);}break;//横坐标输入 case66: {m=t;printf("\t%C",m);}break; case67: {m=t;printf("\t%C",m);}break; case68: {m=t;printf("\t%C",m);}break; case69: {m=t;printf("\t%C",m);}break; case70: {m=t;printf("\t%C",m);}break; case71: {m=t;printf("\t%C",m);}break; case72: {m=t;printf("\t%C",m);}break; case73: {m=t;printf("\t%C",m);}break; case74: {m=t;printf("\t%C",m);}break; case75: {m=t;printf("\t%C",m);}break; case76: {m=t;printf("\t%C",m);}break; case78: {m=t;printf("\t%C",m);}break; case79: {m=t;printf("\t%C",m);}break; case80: {m=t;printf("\t%C",m);}break; case81: {m=t;printf("\t%C",m);}break; case82: {m=t;printf("\t%C",m);}break; case83: {m=t;printf("\t%C",m);}break; case97: {m=t;printf("\t%C",m);m=m-32;}break; case98: {m=t;printf("\t%C",m);m=m-32;}break; case99: {m=t;printf("\t%C",m);m=m-32;}break; case100: {m=t;printf("\t%C",m);m=m-32;}break; case101: {m=t;printf("\t%C",m);m=m-32;}break; case102: {m=t;printf("\t%C",m);m=m-32;}break; case103: {m=t;printf("\t%C",m);m=m-32;}break; case104: {m=t;printf("\t%C",m);m=m-32;}break; case105: {m=t;printf("\t%C",m);m=m-32;}break; case106: {m=t;printf("\t%C",m);m=m-32;}break; case107: {m=t;printf("\t%C",m);m=m-32;}break; case108: {m=t;printf("\t%C",m);m=m-32;}break; case109: {m=t;printf("\t%C",m);m=m-32;}break; case110: {m=t;printf("\t%C",m);m=m-32;}break; case111: {m=t;printf("\t%C",m);m=m-32;}break; case112: {m=t;printf("\t%C",m);m=m-32;}break; case113: {m=t;printf("\t%C",m);m=m-32;}break; case114: {m=t;printf("\t%C",m);m=m-32;}break; case115: {m=t;printf("\t%C",m);m=m-32;}break; default: printf("\t\t请输入属于 \n");continue; } switch(t=getch()) { case8: {//退格键悔棋 i=m-'A'; j=n-'A'; state[i][j]='*'; printState(); printf("\n\t提示: %s方悔棋! \n\n",player? "白": "黑"); player=! player; continue; }break; case27: {system("cls");return;}break;//Esc键返回主菜单 case65: {n=t;printf("%C\n",n);getch();}break;//纵坐标输入 case66: {n=t;printf("%C\n",n);getch();}break; case67: {n=t;printf("%C\n",n);getch();}break; case68: {n=t;printf("%C\n",n);getch();}break; case69: {n=t;printf("%C\n",n);getch();}break; case70: {n=t;printf("%C\n",n);getch();}break; case71: {n=t;printf("%C\n",n);getch();}break; case72: {n=t;printf("%C\n",n);getch();}break; case73: {n=t;printf("%C\n",n);getch();}break; case74: {n=t;printf("%C\n",n);getch();}break; case75: {n=t;printf("%C\n",n);getch();}break; case76: {n=t;printf("%C\n",n);getch();}break; case78: {n=t;printf("%C\n",n);getch();}break; case79: {n=t;printf("%C\n",n);getch();}break; case80: {n=t;printf("%C\n",n);getch();}break; case81: {n=t;printf("%C\n",n);getch();}break; case82: {n=t;printf("%C\n",n);getch();}break; case83: {n=t;printf("%C\n",n);getch();}break; case97: {n=t;printf("%C\n",n);n=n-32;getch();}break; case98: {n=t;printf("%C\n",n);n=n-32;getch();}break; case99: {n=t;printf("%C\n",n);n=n-32;getch();}break; case100: {n=t;printf("%C\n",n);n=n-32;getch();}break; case101: {n=t;printf("%C\n",n);n=n-32;getch();}break; case102: {n=t;printf("%C\n",n);n=n-32;getch();}break; case103: {n=t;printf("%C\n",n);n=n-32;getch();}break; case104: {n=t;printf("%C\n",n);n=n-32;getch();}break; case105: {n=t;printf("%C\n",n);n=n-32;getch();}break; case106: {n=t;printf("%C\n",n);n=n-32;getch();}break; case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 游戏 论文 源代码