c++课程设计-五子棋游戏_第1页
c++课程设计-五子棋游戏_第2页
c++课程设计-五子棋游戏_第3页
c++课程设计-五子棋游戏_第4页
c++课程设计-五子棋游戏_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

五子棋游戏1.设计目的(1)加深对面向对象程序基本的理解和掌握。(2)熟练掌握基本流程图的绘制。(3)能够在调试程序中快速发现并排除程序中的错误。(4)提高面向对象程序语言解决实际中的问题的能力。 进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对C+语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。2.功能描述(1)输出棋盘界面(2)玩家轮流下棋(3)判断键盘输入的坐标位置(4)判断是否在同一位置下棋(5)判断赢家(6)结束游戏由两个玩家分别下棋,按任意键开始游戏,显示棋盘,用户通过输入横纵坐标的位置下棋,当某一个玩家五子相连,则赢。界面要求:初始状态显示棋盘,并显示两个玩家的操作键及初始玩家名称;游戏进行状态动态显示棋盘,不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家名称。3.总体设计3.1系统流程图五子棋对弈系统流程图如下:白方下子判断位置是否有棋找另一位置白方下子判断白方是否胜出跳出白棋获胜黑方下子判断位置是否有棋棋找另一位置黑方下子判断黑方是否胜出跳出黑棋获胜判断是否重现开局否否游戏结束开始 否 是 否 是图 1程序总体图某方在水平方向是否大于4某方在正对角线方向是否大于4某方在垂直方向是否大于4某方在反对角线方向是否大于4否白(黑)方获胜白(黑)方获胜白(黑)方获胜白(黑)方获胜进入选择是否重新开局框黑(白)方下子是是是是否否否白(黑)方下子游戏开始 图2算法流程图3.2详细设计3.2.1 本系统的主要结构和类结构(1)五子棋功能实现的主要结构函数void getpointxy(); /白棋出子函数void getpointmn(); /黑棋出子函数void showqipan(); /实现20行20列正方形界面输出void print(); /输出下一棋盘界面及计数bool IsxyWin(); /白棋获胜bool IsmnWin(); /黑棋获胜void menu();/显示开始菜单界面(2)五子棋类的结构class five int x,y,m,n,num_xy,num_mn; char qipan2020; /定义20行20列的数组public: five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0) /构造函数初始化x = X; y = Y; m = M; n = N; num_xy = Num_xy; num_mn = Num_mn; for(int i = 0 ; i 20 ; i +) /输出20行20列的棋盘界面 for(int j = 0 ;j 20 ; j +) qipanij = .; 3.2.2功能模块(1)图形显示模块:程序开始运行时,显示给出的一个界面任意键继续,包括对数据成员的赋值和成员函数的初始化还有通过for循环实现对20行20列坐标的定义。源代码如下:class five int x,y,m,n,num_xy,num_mn; char qipan2020; /定义20行20列的数组public: five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0) /构造函数初始化x = X; y = Y; m = M; n = N; num_xy = Num_xy; num_mn = Num_mn; for(int i = 0 ; i 20 ; i +) /输出20行20列的棋盘界面 for(int j = 0 ;j 20 ; j +) qipanij = .; void getpointxy(); /白棋出子及计数void getpointmn(); /黑棋出子及计数void showqipan(); /实现20行20列正方形界面输出void print(); /输出下一棋盘界面bool IsxyWin(); /白棋获胜bool IsmnWin(); /黑棋获胜void menu();/显示开始菜单界面;(2)白棋和黑棋落子情况的判断的实现:游戏开始,玩家通过输入棋子的坐标确定下棋的位置,黑棋白棋轮流开始。void five:getpointxy() /判断白棋出子情况及对其计数 std:cout请分别输入第num_xy+1 y x; if (!(1=x&x=20&1=y&y=20) std:cout 输入错误,请重新输入:endl ; getpointxy(); else if(qipany-1x-1 != . ) std:cout 请所下的位置已经有棋子,请重新输入: = 400) std:cout 棋盘已满,平局! endl; exit(0); else qipany-1x-1 = O; num_xy+; void five:getpointmn() /判断黑棋出子情况及对其计数 std:cout请分别输入第num_mn+1 n m; if (!(1=m&m=20&1=n&n=20) std:cout 输入错误,请重新输入:endl ; getpointmn(); else if(qipann-1m-1!=.) std:cout 请所下的位置已经有棋子,请重新输入: = 400) std:cout 棋盘已满,平局! q;if(strcmp(q,c)five:showqipan();(4)输出模块:void five:showqipan() /输出20行20列的坐标数值 int p=0,q=0; for(int i = 0 ; i = 20 ; i+) if(p10) std:cout p ; else std:cout p ; p+; cout endl; for(i = 0 ; i =0) q+; if(q10) std:cout q ; else std:cout q; for(int j = 0 ; j 20 ; j +) std:cout qipanij ; std:cout endl; void five:print() int p=0,q=0; for(int i = 0 ; i = 20 ; i+) if(p10) std:cout p ; else std:cout p ; p+; std:cout endl; for(i = 0 ; i =0) q+; if(q10) std:cout q ; else std:cout q; for(int j = 0 ; j 20 ; j +) std:cout qipanij ; std:cout endl; (5)黑白棋输赢的判断,判断当前棋盘的形势是哪一方获胜。五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图:图 3判断胜负方向bool five:IsxyWin()/白棋获胜实现函数 int num1=1,num2=1,num3=1,num4=1; for(int i = x ; i x+5& x+5= 0 ; i -) if(qipany-1i != O) break; if(qipany-1i = O) num1+; for( i = y ; i = 0 ; i -) if(qipanix-1 != O) break; if(qipanix-1 = O) num2+; for(i = 0 ; i 5 & x+i20 & y+i=0 & y-i-2=0 & i 5;i+ ) if(qipany-i-2x-i-2 != O) break; if(qipany-i-2x-i-2 = O) num3+; for(i = 0 ; x + i = 0 & i 5;i +) if(qipany-i-2x+i != O) break; if(qipany-i-2x+i = O) num4+; for(i = 0 ; y + i = 0 & i =5|num2=5|num3=5|num4=5)return 1; else return 0; 黑棋获胜情况与白棋类似(6)主函数模块:输出欢迎使用的界面,判断游戏是否结束,若结束输出胜出方并结束游戏。void main() std:cout*欢迎使用*endl;std:cout_endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?e?e?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?e?|endl;std:cout|?ee?e?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|?|endl;std:cout|-endl;std:cout进入按任意键;five a; /定义一个类的对象int temp; a.menu();std:cout 这是本游戏的棋盘,请按坐标输入棋子 endl; a.showqipan(); /通过对象调用功能函数std:cout temp; if(temp !=1) /游戏开始退出控制exit(1); if(temp = 1) std:cout 游戏开始: endl; for(int i = 0 ; ; i +) a.getpointxy(); a.print();if(a.IsxyWin() std:cout 白棋胜 endl; std:cout 游戏结束n;exit(0); a.getpointmn(); a.print();if(a.IsmnWin() std:cout 黑棋胜 endl; std:cout 游戏结束n;exit(0);4.运行结果与分析(1)此界面为欢迎界面,按任意键进入游戏。图4 游戏界面(2)此界面表示进入棋盘界面,确认按1开始玩游戏,其他键退出。图5棋盘界面(3)此界面表示游戏开始。图6游戏开始界面(4)此界面表示输入横纵坐标完成落子。图7输入白棋坐标(5)此界面表示在同一地方下棋的情况。图8所下位置重复(6)此界面为游戏结束界面,显示胜出方并显示游戏结束字样。图9游戏结束界面5.心得体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C+语言又是最常见,功能最强大的一种高级语言,因此做好C+语言课程设计是十分必要的。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把前面所学过的知识又重新温故了一遍。6. 参考文献1 朱晴婷,黄海鹰,陈莲君. Visual C + 程序设计基础与实例分析M.北京: 清华大学出版社,2008.2:101-2442 刘瑞新. Visual C + 6.0开发技巧与实例教程.M.北京: 机械工业出版社,2006.10:214-2993 黄维通. Visual C+面向对象与可视化程序设计(第2版).M.北京: 清华大学出版社,2007.8:70-954 郑阿奇.Visual C+教程M.北京: 清华大学出版社,2005.4:132-1505 夏崇镨,任海军,余建. Visual C+课程设计案例精编M.北京: 清华大学出版社,2008.11:112-130附录:#includeusing namespace std;class five int x,y,m,n,num_xy,num_mn; char qipan2020; /定义20行20列的数组public: five(int X = 0,int Y =0,int M = 0,int N = 0,int Num_xy = 0,int Num_mn = 0) /构造函数初始化x = X; y = Y; m = M; n = N; num_xy = Num_xy; num_mn = Num_mn; for(int i = 0 ; i 20 ; i +) /输出20行20列的棋盘界面 for(int j = 0 ;j 20 ; j +) qipanij = .; void getpointxy(); /白棋子计数void getpointmn(); /黑棋出子计数void showqipan(); /实现20行20列正方形界面输出void print(); /输出下棋盘界面bool IsxyWin(); /白棋获胜bool IsmnWin(); /黑棋获胜void menu();/显示开始菜单界面; void five:getpointxy() /判断白棋出子情况对其计数 std:cout请分别输入num_xy+1 y x; if (!(1=x&x=20&1=y&y=20) std:cout 输错误请重新输入:endl ; getpointxy(); else if(qipany-1x-1 != . ) std:cout 请下的位置已经有棋子请重新输入: = 400) std:cout 棋盘已满,平局 endl; exit(0); else qipany-1x-1 = O; num_xy+; void five:getpointmn() /判断黑棋出子情况及对其计数 std:cout请分别输入第num_mn+1 n m; if (!(1=m&m=20&1=n&n=20) std:cout 输入错误,请重新输入:endl ; getpointmn(); else if(qipann-1m-1!=.) std:cout 所下的位置已经有棋子,请重新输入 = 400) std:cout 棋?盘已?满,?平?局?! q;if(strcmp(q,c)five:showqipan();void five:showqipan() /输出20行20列的坐标数值 int p=0,q=0; for(int i = 0 ; i = 20 ; i+) if(p10) std:cout p ; else std:cout p ; p+; cout endl; for(int i = 0 ; i =0) q+; if(q10) std:cout q ; else std:cout q; for(int j = 0 ; j 20 ; j +) std:cout qipanij ; std:cout endl; void five:print() int p=0,q=0; int i;for(int i = 0 ; i = 20 ; i+) if(p10) std:cout p ; else std:cout p ; p+; std:cout endl; for(i = 0 ; i =0) q+; if(q10) std:cout q ; else std:cout q; for(int j = 0 ; j 20 ; j +) std:cout qipanij ; std:cout endl; bool five:IsxyWin()/白棋获胜实现函数 int num1=1,num2=1,num3=1,num4=1; for(int i = x ; i x+5& x+5= 0 ; i -) if(qipany-1i != O) break; if(qipany-1i = O) num1+; for( int i = y ; i = 0 ; i -) if(qipanix-1 != O) break; if(qipanix-1 = O) num2+; for(int i = 0 ; i 5 & x+i20 & y+i=0 & y-i-2=0 & i 5;i+ ) if(qipany-i-2x-i-2 != O) break; if(qipany-i-2x-i-2 = O) num3+; for(int i = 0 ; x + i = 0 & i 5;i +) if(qipany-i-2x+i != O) break; if(qipany-i-2x+i = O) num4+; for(int i = 0 ; y + i = 0 & i =5|num2=5|num3=5|num4=5) return 1; else return 0; bool five:IsmnWin() /黑棋获胜实现函数 int num1=1,num2=1,num3=1,num4=1; int i;for( i = m ; i m+5& m+5= 0 ; i -) if(qipann-1i != *) break; if(qipann-1i = *) num1+; for( i = n ; i = 0 ; i -) if(qipanim-1 != *) break; if(qipanim-1 = *) num2+; for(i = 0 ; i 5 & m+i20 & n+i=0 & n-i-2=0 & i 5;i+ ) if(qipann-i-2m-i-2 != *) break; if(qipann-i-2m-i-2 = *) num3+; for(i = 0 ; m + i = 0 & i 5;i +) if(qipann-i-2m+i !=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论