《五子棋游戏的论文及源代码.doc》由会员分享,可在线阅读,更多相关《五子棋游戏的论文及源代码.doc(52页珍藏版)》请在三一办公上搜索。
1、本 科 生 课 程 论 文论 文 题 目 五子棋游戏 五子棋游戏【摘要】为了设计人人对弈模式的五子棋游戏系统,采用了C语言函数模块化程序设计方法,利用Visual C+ 6.0编译器运行游戏,实现一方执白棋,一方执黑棋,通过屏幕上的文字提示,轮流走棋 ,最先使五子相连一方获胜的人人对弈功能。通过本程序的训练,加深对C语言的了解,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。【关键字】 五子棋 函数设计目的:本程序旨在进一步训练学生游戏开发的技巧,掌握C语言图形模式下的编程。本程序设计很多图形函数,包括坐标定位;颜色设置(背景色和文本颜色设置)、线条颜色、填充颜色;直线风格、文本风
2、格、填充风格;画线、画圆、画矩形函数;PC扬声器的打开、延迟、关闭;图形系统的初始化和关闭;图形屏幕和文字屏幕的清除;从键盘获取键值等。功能:实现界面的初始化功能、下棋功能、胜负判断功能和帮助功能。1)初始化功能。程序初始化屏幕和棋盘,默认Player1先行。2)实现下棋功能。程序能实现下棋操作,在下棋过程中能随时退出。3)胜负判断。程序能对下棋的结果进行判断,分出胜负,并显示获胜信息。4)显示帮助信息。程序能提示玩家轮到哪方下棋了。问题分析:首先要实现五子棋的行棋功能,在程序中可以通过坐标来定位棋子的位置,用不同的字符表示黑白棋子,并通过变量的交替实现黑白棋子的交替显示。另一个难点就是对于胜
3、负的判断,这需要通过循环函数的嵌套使用,难点在于逻辑调理的把握,循环之间的对应关系。还有一个难点就是在游戏中能随时返回主菜单,这需要一个选择结构来实现,将主菜单的程序编入主函数,在得到特定指令时返回主函数,从而返回主菜单。下棋过程中对于不断地输入坐标,可以用一个死循环来是实现,在特定的条件下退出循环,返回主函数。程序设计:一、主要函数介绍本程序主要用到了main()1、startGame()、printState()、judge()、help()、aboutThanks()等函数。主函数中设计成死循环,再循环过程中通过选择调用其它函数。被调用的函数运行完后再次返回到主函数中。1、 主函数mai
4、n()运行主函数,首先调用system(color e0)2函数,改变运行界面的前景色和背景色。然后进入一个死循环while(1),再循环中输出主菜单的内容,包括标题、开始游戏、游戏帮助、游戏鸣谢、退出程序、请选择等字样。然后,调用scanf()函数,从键盘上获得一个数值付给变量i,接着进行健壮性处理。最后调用switch语句,通过选择调用其它函数。2、 startGame()函数此函数为自定义函数,首先用一个for语句实现19*19的棋盘的初步绘制,将19*19的坐标全绘制成“*”状。接着调用printState()函数,实现当前棋盘的显示。然后进入下棋的循环,提示下子一方并调用fflush
5、(stdin) 2函数清除缓存。然后,通过switch语句,根据从键盘上得到的值做出相应的判断,实现退格键悔棋、Esc键返回主菜单、A-S输入坐标、其他输入错误。接着判断该坐标是否有子,有子提示重新指定坐标,否则,该位置显示相应的棋子。除第一次下子前外,下一步将调用judge()函数,来判断是否有一方获胜。判断结束后再次调用printState()显示当前棋盘。最后交换期权。此函数的核心代码如下:switch(t=getch()case 8:/退格键悔棋i=m-A; j=n-A;stateij=*;printState();printf(nt提示:%s方悔棋!nn,player?白:黑);pl
6、ayer=!player;continue;break;case 27: system(cls);return;break;/Esc键返回主菜单case 65: n=t;printf(%Cn,n);getch();break;/纵坐标输入case 115: n=t;printf(%Cn,n);n=n-32;getch();break;default:printf(tt请输入属于或正确的口令。n);continue; i=m-A; j=n-A;if(stateij!=*)/判断是否有子 printf(t提示:该位置已经有子,请重新指定坐标!);continue;c=player?4:79;/为棋
7、子赋值stateij=c; if(a!=0)judge();/判断胜负a+;printState();/显示当前棋盘player=!player;/交换棋权3、 printState()函数此函数为自定义函数,主要实现当前棋盘的输出,首先定义字符变量,接着清除屏幕,然后输出周围的字母和中心的“*”字符。核心代码为:for(i=0;isize;i+)printf(%c ,p+i); /输出第一行的所有字符printf(nt); /换行for(i=0;isize;i+)printf(%c ,p+i); /输出行坐标(左边的字母)for(j=0;jsize;j+)printf(%c ,stateij
8、); /输出该行的内容printf(%c nt,p+i); /输出右侧的坐标 printf( );for(i=0;isize;i+)printf(%c ,p+i); /输出最后一行的所有字符4、 judge()函数此函数为自定义函数,主要实现对棋局胜负的判断。首先通过for语句的嵌套实用实现纵向的判断,判断纵向是否形成五子相连的情况。其核心代码为:if(statei+1j!=stateij)/纵向判断if(statei-1j!=stateij);elseif(statei-2j!=stateij);elseif(statei-3j!=stateij);elseif(statei-4j!=sta
9、teij);elseprintState();printf(nt提示:%s方胜!nn,player?黑:白);printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; else5、help()函数此函数为自定义函数,主要实现输出帮助信息,包括游戏说明、基本规则、神父判断的说明。核心代码为:system(cls)2;printf(nnt游戏说明:nn);printf(ttt按Esc键返回主菜单
10、nn );while(1) switch(t=getch()case 27: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; 6、 aboutThanks()函数此函数为自定义函数,主要实现输出鸣谢信息。其核心代码为:system(cls);printf(nnnt 鸣谢:nnntt1.我的C语言老师:老师。);while(1) switch(t=getch()case 27: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);cont
11、inue; 二、程序框图开始游戏主菜单开始游戏帮助退出程序游戏鸣谢Esc键退格键判断胜负输入坐标三、程序截图1、主菜单界面:2、 游戏界面:3、 帮助界面:4、 鸣谢界面:5、 退出界面:6、 悔棋提示界面:7、 输入错误提醒界面:8、 获胜提示界面:总结:程序中多次用到循环语句的嵌套使用,难点在于对逻辑条理性的把握和对五子棋规则的正确理解。为了实现在游戏中随时能够返回主菜单,先后试验了scanf()、getchar()、getch()函数,scanf()函数只能从键盘上得到字符,但不能识别Esc等键。getchar()也不能显示Esc等键,无法对输入的Esc键作出判断,并且需要按回车后再给出
12、返回值。而getch()可以直接返回键盘的键值,但是并不在屏幕上显示。为了解决这一问题,将getch()的值先付给一个变量,再用printf()语句输出变量。本次设计的一大收获就是对程序结构重要性的认识,一个结构清晰的程序,对于程序的调试、改错、阅读等都有着重要意义,可以让程序员省去不必要的麻烦。另外,程序的注释也很重要,注释不仅仅是给读程序的人看,也是给写程序的人看的。当程序要写好多页时,有时程序员也会忘记之前的程序是实现什么功能的,所以注释是相当必要的。通过本次设计,对C语言有了更近一步的认识,对以后进一步学习具有重要意义。参考文献:1 谭浩强 C程序设计(第四版)清华大学出版社2 百度搜
13、索课 程 论 文 成 绩 评 定 表学生姓名专业班级论文题目五子棋游戏指导教师评语及意见:成绩: 指导教师签字 年 月 日附件:源代码#include#include/system()的头文件#define N 19#include /getch()的头文件int a=0,t,m,n,i,j,k,size=N;int player=1;/当前是黑方下子 player=1 char stateNN;char c;/用来存放显示黑白子的变量 void startGame();void printState();void judge();void help();void aboutThanks();
14、int main()system(color e0);/界面颜色while(1)printf(nnttt-高级语言课程设计-nn);printf(tttt 五子棋游戏nnn);printf(tttt 1.开始游戏。nn);printf(tttt 2.游戏帮助。nn);printf(tttt 3.游戏鸣谢。nn);printf(tttt 4.退出程序。nn); printf(nttt请选择:);L:k=scanf(%d,&i);if(k=0) /遇到异常,做健壮性处理. printf(nt提示:输入非格式选项!nt请重新输入1-4的整数:);fflush(stdin); /清空缓冲内存区goto
15、 L; switch(i)/选择选项case 1: startGame(); break;case 2: help(); break;case 3: aboutThanks(); break;case 4: printf(nttt请按任意键安全退出nttt);return 0; /结束整个程序。 default:printf(t温馨提示 : 无此选项n);break; void startGame()/开始游戏for(i=0;isize;i+)for(j=0;jsize;j+)stateij=*;printState();/显示棋盘while(1)printf(nt请%s方下子:,player
16、?黑:白);fflush(stdin);switch(t=getch()case 8:/退格键悔棋i=m-A; j=n-A;stateij=*;printState();printf(nt提示:%s方悔棋!nn,player?白:黑);player=!player;continue;break;case 27: system(cls);return; break;/Esc键返回主菜单case 65: m=t;printf(t%C,m);break;/横坐标输入case 66: m=t;printf(t%C,m);break;case 67: m=t;printf(t%C,m);break;ca
17、se 68: m=t;printf(t%C,m);break;case 69: m=t;printf(t%C,m);break;case 70: m=t;printf(t%C,m);break;case 71: m=t;printf(t%C,m);break;case 72: m=t;printf(t%C,m);break;case 73: m=t;printf(t%C,m);break;case 74: m=t;printf(t%C,m);break;case 75: m=t;printf(t%C,m);break; case 76: m=t;printf(t%C,m);break; cas
18、e 78: m=t;printf(t%C,m);break;case 79: m=t;printf(t%C,m);break;case 80: m=t;printf(t%C,m); break;case 81: m=t;printf(t%C,m);break;case 82: m=t;printf(t%C,m);break;case 83: m=t;printf(t%C,m);break;case 97: m=t;printf(t%C,m);m=m-32;break;case 98: m=t;printf(t%C,m);m=m-32;break;case 99: m=t;printf(t%C,
19、m);m=m-32;break;case 100: m=t;printf(t%C,m);m=m-32;break;case 101: m=t;printf(t%C,m);m=m-32;break;case 102: m=t;printf(t%C,m);m=m-32;break;case 103: m=t;printf(t%C,m);m=m-32;break;case 104: m=t;printf(t%C,m);m=m-32;break;case 105: m=t;printf(t%C,m);m=m-32;break;case 106: m=t;printf(t%C,m);m=m-32;bre
20、ak;case 107: m=t;printf(t%C,m);m=m-32;break;case 108: m=t;printf(t%C,m);m=m-32;break;case 109: m=t;printf(t%C,m);m=m-32;break;case 110: m=t;printf(t%C,m);m=m-32;break;case 111: m=t;printf(t%C,m);m=m-32;break;case 112: m=t;printf(t%C,m);m=m-32;break;case 113: m=t;printf(t%C,m);m=m-32;break;case 114:
21、m=t;printf(t%C,m);m=m-32;break;case 115: m=t;printf(t%C,m);m=m-32;break;default:printf(tt请输入属于或正确的口令。n);continue; switch(t=getch()case 8:/退格键悔棋i=m-A; j=n-A;stateij=*;printState();printf(nt提示:%s方悔棋!nn,player?白:黑);player=!player;continue;break;case 27: system(cls);return;break;/Esc键返回主菜单case 65: n=t;p
22、rintf(%Cn,n);getch();break;/纵坐标输入case 66: n=t;printf(%Cn,n);getch();break;case 67: n=t;printf(%Cn,n);getch();break;case 68: n=t;printf(%Cn,n);getch();break;case 69: n=t;printf(%Cn,n);getch();break;case 70: n=t;printf(%Cn,n);getch();break;case 71: n=t;printf(%Cn,n);getch();break;case 72: n=t;printf(%
23、Cn,n);getch();break;case 73: n=t;printf(%Cn,n);getch();break;case 74: n=t;printf(%Cn,n);getch();break;case 75: n=t;printf(%Cn,n);getch();break; case 76: n=t;printf(%Cn,n);getch();break; case 78: n=t;printf(%Cn,n);getch();break;case 79: n=t;printf(%Cn,n);getch();break;case 80: n=t;printf(%Cn,n);getch
24、(); break;case 81: n=t;printf(%Cn,n);getch();break;case 82: n=t;printf(%Cn,n);getch();break;case 83: n=t;printf(%Cn,n);getch();break;case 97: n=t;printf(%Cn,n);n=n-32;getch();break;case 98: n=t;printf(%Cn,n);n=n-32;getch();break;case 99: n=t;printf(%Cn,n);n=n-32;getch();break;case 100: n=t;printf(%C
25、n,n);n=n-32;getch();break;case 101: n=t;printf(%Cn,n);n=n-32;getch();break;case 102: n=t;printf(%Cn,n);n=n-32;getch();break;case 103: n=t;printf(%Cn,n);n=n-32;getch();break;case 104: n=t;printf(%Cn,n);n=n-32;getch();break;case 105: n=t;printf(%Cn,n);n=n-32;getch();break;case 106: n=t;printf(%Cn,n);n
26、=n-32;getch();break;case 107: n=t;printf(%Cn,n);n=n-32;getch();break;case 108: n=t;printf(%Cn,n);n=n-32;getch();break;case 109: n=t;printf(%Cn,n);n=n-32;getch();break;case 110: n=t;printf(%Cn,n);n=n-32;getch();break;case 111: n=t;printf(%Cn,n);n=n-32;getch();break;case 112: n=t;printf(%Cn,n);n=n-32;
27、getch();break;case 113: n=t;printf(%Cn,n);n=n-32;getch();break;case 114: n=t;printf(%Cn,n);n=n-32;getch();break;case 115: n=t;printf(%Cn,n);n=n-32;getch();break;default:printf(tt请输入属于或正确的口令。n);continue; i=m-A; j=n-A;if(stateij!=*)/判断是否有子 printf(t提示:该位置已经有子,请重新指定坐标!);continue;c=player?4:79;/为棋子赋值stat
28、eij=c; if(a!=0)judge();/判断胜负a+;printState();/显示当前棋盘player=!player;/交换棋权void printState() /显示当前棋盘的状态 char p=A;system(cls);/清屏printf(t棋盘如下:nn); printf(t ); /输出第一行开头的空格for(i=0;isize;i+)printf(%c ,p+i); /输出第一行的所有字符printf(nt); /换行for(i=0;isize;i+)printf(%c ,p+i); /输出行坐标(左边的字母)for(j=0;jsize;j+)printf(%c ,
29、stateij); /输出该行的内容printf(%c nt,p+i); /输出右侧的坐标 printf( );for(i=0;isize;i+)printf(%c ,p+i); /输出最后一行的所有字符printf(n);void judge()if(statei+1j!=stateij)/纵向判断if(statei-1j!=stateij);elseif(statei-2j!=stateij);elseif(statei-3j!=stateij);elseif(statei-4j!=stateij);elseprintState();printf(nt提示:%s方胜!nn,player?黑
30、:白);printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; elseif(statei+2j!=stateij)if(statei-1j!=stateij);elseif(statei-2j!=stateij);elseif(statei-3j!=stateij);elseprintState();printf(nt提示:%s方胜!nn,player?黑:白);printf(ttt按回
31、车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; elseif(statei+3j!=stateij)if(statei-1j!=stateij);elseif(statei-2j!=stateij);elseprintState();printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break
32、;default:printf(tt输入错误,请输入正确的口令。n);continue; elseif(statei+4j!=stateij)if(statei-1j!=stateij);elseprintState();printf(nt提示:%s方胜!nn,player?黑:白);printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; elseprintState();printf(n
33、t提示:%s方胜!nn,player?黑:白);printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; if(stateij+1!=stateij)/横向判断if(stateij-1!=stateij);elseif(stateij-2!=stateij);elseif(stateij-3!=stateij);elseif(stateij-4!=stateij);elseprintState();printf(nt提示:%s方胜!nn,player?黑:白);printf(ttt按回车键确认结果并返回游戏nn );while(1) switch(t=getch()case 13: system(cls);return; break;default:printf(tt输入错误,请输入正确的口令。n);continue; else
链接地址:https://www.31ppt.com/p-2388165.html