c++课程设计五子棋游戏.docx
- 文档编号:3738808
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:26
- 大小:377.35KB
c++课程设计五子棋游戏.docx
《c++课程设计五子棋游戏.docx》由会员分享,可在线阅读,更多相关《c++课程设计五子棋游戏.docx(26页珍藏版)》请在冰豆网上搜索。
c++课程设计五子棋游戏
五子棋游戏
1.设计目的
(1)加深对面向对象程序基本的理解和掌握。
(2)熟练掌握基本流程图的绘制。
(3)能够在调试程序中快速发现并排除程序中的错误。
(4)提高面向对象程序语言解决实际中的问题的能力。
进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对C++语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。
要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。
2.功能描述
(1)输出棋盘界面
(2)玩家轮流下棋
(3)判断键盘输入的坐标位置
(4)判断是否在同一位置下棋
(5)判断赢家
(6)结束游戏
由两个玩家分别下棋,按任意键开始游戏,显示棋盘,用户通过输入横纵坐标的位置下棋,当某一个玩家五子相连,则赢。
界面要求:
初始状态——显示棋盘,并显示两个玩家的操作键及初始玩家名称;游戏进行状态——动态显示棋盘,不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家名称。
3.总体设计
3.1系统流程图
五子棋对弈系统流程图如下:
否
是
否
是
图1程序总体图
图2算法流程图
3.2详细设计
3.2.1本系统的主要结构和类结构
(1)五子棋功能实现的主要结构函数
voidgetpointxy();//白棋出子函数
voidgetpointmn();//黑棋出子函数
voidshowqipan();//实现20行20列正方形界面输出
voidprint();//输出下一棋盘界面及计数
boolIsxyWin();//白棋获胜
boolIsmnWin();//黑棋获胜
voidmenu();//显示开始菜单界面
(2)五子棋类的结构
classfive
{
intx,y,m,n,num_xy,num_mn;
charqipan[20][20];//定义20行20列的数组
public:
five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化
{
x=X;
y=Y;
m=M;
n=N;
num_xy=Num_xy;
num_mn=Num_mn;
for(inti=0;i<20;i++)//输出20行20列的棋盘界面
{
for(intj=0;j<20;j++)
qipan[i][j]='.';
}
}
3.2.2功能模块
(1)图形显示模块:
程序开始运行时,显示给出的一个界面任意键继续,包括对数据成员的赋值和成员函数的初始化还有通过for循环实现对20行20列坐标的定义。
源代码如下:
classfive
{
intx,y,m,n,num_xy,num_mn;
charqipan[20][20];//定义20行20列的数组
public:
five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化
{x=X;
y=Y;
m=M;
n=N;
num_xy=Num_xy;
num_mn=Num_mn;
for(inti=0;i<20;i++)//输出20行20列的棋盘界面
{for(intj=0;j<20;j++)qipan[i][j]='.';}
}
voidgetpointxy();//白棋出子及计数
voidgetpointmn();//黑棋出子及计数
voidshowqipan();//实现20行20列正方形界面输出
voidprint();//输出下一棋盘界面
boolIsxyWin();//白棋获胜
boolIsmnWin();//黑棋获胜
voidmenu();//显示开始菜单界面
};
(2)白棋和黑棋落子情况的判断的实现:
游戏开始,玩家通过输入棋子的坐标确定下棋的位置,黑棋白棋轮流开始。
voidfive:
:
getpointxy()//判断白棋出子情况及对其计数
{std:
:
cout<<"请分别输入第"< "; std: : cin>>y>>x; if(! (1<=x&&x<=20&&1<=y&&y<=20)) {std: : cout<<"输入错误,请重新输入: "< getpointxy(); } elseif(qipan[y-1][x-1]! ='.') {std: : cout<<"请所下的位置已经有棋子,请重新输入: "< getpointxy(); } elseif(num_xy+num_mn>=400) {std: : cout<<"棋盘已满,平局! "< exit(0); } else {qipan[y-1][x-1]='O'; num_xy++; } } voidfive: : getpointmn()//判断黑棋出子情况及对其计数 {std: : cout<<"请分别输入第"< "; std: : cin>>n>>m; if(! (1<=m&&m<=20&&1<=n&&n<=20)) {std: : cout<<"输入错误,请重新输入: "< getpointmn(); } elseif(qipan[n-1][m-1]! ='.') {std: : cout<<"请所下的位置已经有棋子,请重新输入: "< getpointmn(); } elseif(num_xy+num_mn>=400) {std: : cout<<"棋盘已满,平局! "< exit(0); } else {qipan[n-1][m-1]='*'; num_mn++; } } (3)菜单界面模块: voidfive: : menu()//进入菜单界面 {char*q=newchar[9]; cin>>q; if(strcmp(q,"c")) five: : showqipan(); } (4)输出模块: voidfive: : showqipan()//输出20行20列的坐标数值 {intp=0,q=0; for(inti=0;i<=20;i++) {if(p<10) {std: : cout< else std: : cout< p++; } cout< for(i=0;i<20;i++) {if(i>=0) {q++; if(q<10)std: : cout< elsestd: : cout< } for(intj=0;j<20;j++)std: : cout< std: : cout< } } voidfive: : print() {intp=0,q=0; for(inti=0;i<=20;i++) {if(p<10) {std: : cout< elsestd: : cout< p++; } std: : cout< for(i=0;i<20;i++) {if(i>=0) {q++; if(q<10)std: : cout< elsestd: : cout< } for(intj=0;j<20;j++) {std: : cout< std: : cout< } } (5)黑白棋输赢的判断,判断当前棋盘的形势是哪一方获胜。 五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图: 图3判断胜负方向 boolfive: : IsxyWin()//白棋获胜实现函数 {intnum1=1,num2=1,num3=1,num4=1; for(inti=x;i {if(qipan[y-1][i]! ='O')break; if(qipan[y-1][i]=='O')num1++; } for(i=x-2;i>=0;i--) {if(qipan[y-1][i]! ='O')break; if(qipan[y-1][i]=='O')num1++; } for(i=y;i {if(qipan[i][x-1]! ='O')break; if(qipan[i][x-1]=='O')num2++; } for(i=y-2;i>=0;i--) {if(qipan[i][x-1]! ='O')break; if(qipan[i][x-1]=='O')num2++; } for(i=0;i<5&&x+i<20&&y+i<20;i++) {if(qipan[y+i][x+i]! ='O')break; if(qipan[y+i][x+i]=='O')num3++; } for(i=0;x-i-2>=0&&y-i-2>=0&&i<5;i++) {if(qipan[y-i-2][x-i-2]! ='O')break; if(qipan[y-i-2][x-i-2]=='O')num3++; } for(i=0;x+i<20&&y-i-2>=0&&i<5;i++) {if(qipan[y-i-2][x+i]! ='O')break; if(qipan[y-i-2][x+i]=='O')num4++; } for(i=0;y+i<20&&x-i-2>=0&&i<5;i++) {if(qipan[y+i][x-i-2]! ='O')break; if(qipan[y+i][x-i-2]=='O')num4++; } if(num1>=5||num2>=5||num3>=5||num4>=5)return1; elsereturn0; } 黑棋获胜情况与白棋类似 (6)主函数模块: 输出欢迎使用的界面,判断游戏是否结束,若结束输出胜出方并结束游戏。 voidmain() {std: : cout<<"*************欢迎使用*******************"< std: : cout<<"______________________________________________"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ●? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ○e╋? ╋? ╋? ╋? ╋? ○e╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ●? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ●? ╋? ╋? ╋? ╋? ╋? ●? ○e╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ○e○e╋? ○e╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ●? ╋? ╋? ╋? ╋? ●? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? ╋? |"< std: : cout<<"|---------------------------------------------"< std: : cout<<"进入按任意键"; fivea;//定义一个类的对象 inttemp; a.menu(); std: : cout<<"这是本游戏的棋盘,请按坐标输入棋子"< a.showqipan();//通过对象调用功能函数 std: : cout<<"确认请按1,退出请按其他键"; std: : cin>>temp; if(temp! =1)//游戏开始退出控制 exit (1); if(temp==1) {std: : cout<<"游戏开始: "< for(inti=0;;i++) { a.getpointxy(); a.print(); if(a.IsxyWin()) { std: : cout<<"白棋胜"< std: : cout<<"游戏结束\n"; exit(0); } a.getpointmn(); a.print(); if(a.IsmnWin()) { std: : cout<<"黑棋胜"< std: : cout<<"游戏结束\n"; exit(0);} } } } 4.运行结果与分析 (1)此界面为欢迎界面,按任意键进入游戏。 图4游戏界面 (2)此界面表示进入棋盘界面,确认按1开始玩游戏,其他键退出。 图5棋盘界面 (3)此界面表示游戏开始。 图6游戏开始界面 (4)此界面表示输入横纵坐标完成落子。 图7输入白棋坐标 (5)此界面表示在同一地方下棋的情况。 图8所下位置重复 (6)此界面为游戏结束界面,显示胜出方并显示游戏结束字样。 图9游戏结束界面 5.心得体会 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程。 随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。 因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把前面所学过的知识又重新温故了一遍。 6.参考文献 [1]朱晴婷,黄海鹰,陈莲君.VisualC++程序设计—基础与实例分析[M].北京: 清华大学出版社,2008.2: 101-244 [2]刘瑞新.VisualC++6.0开发技巧与实例教程.[M].北京: 机械工业出版社,2006.10: 214-299 [3]黄维通.VisualC++面向对象与可视化程序设计(第2版).[M].北京: 清华大学出版社,2007.8: 70-95 [4]郑阿奇.VisualC++教程[M].北京: 清华大学出版社,2005.4: 132-150 [5]夏崇镨,任海军,余建.VisualC++课程设计案例精编[M].北京: 清华大学出版社,2008.11: 112-130 附录: #include usingnamespacestd; classfive { intx,y,m,n,num_xy,num_mn; charqipan[20][20];//定义20行20列的数组 public: five(intX=0,intY=0,intM=0,intN=0,intNum_xy=0,intNum_mn=0)//构造函数初始化 {x=X; y=Y; m=M; n=N; num_xy=Num_xy; num_mn=Num_mn; for(inti=0;i<20;i++)//输出20行20列的棋盘界面 {for(intj=0;j<20;j++)qipan[i][j]='.';} } voidgetpointxy();//白棋子计数 voidgetpointmn();//黑棋出子计数 voidshowqipan();//实现20行20列正方形界面输出 voidprint();//输出下棋盘界面 boolIsxyWin();//白棋获胜 boolIsmnWin();//黑棋获胜 voidmenu();//显示开始菜单界面 }; voidfive: : getpointxy()//判断白棋出子情况对其计数 {std: : cout<<"请分别输入"< "; std: : cin>>y>>x; if(! (1<=x&&x<=20&&1<=y&&y<=20)) {std: : cout<<"输错误请重新输入: "< getpointxy(); } elseif(qipan[y-1][x-1]! ='.') {std: : cout<<"请下的位置已经有棋子请重新输入: "< getpointxy(); } elseif(num_xy+num_mn>=400) {std: : cout<<"棋盘已满,平局"< exit(0); } else {qipan[y-1][x-1]='O'; num_xy++; } } voidfive: : getpointmn()//判断黑棋出子情况及对其计数 {std: : cout<<"请分别输入第"< "; std: : cin>>n>>m; if(! (1<=m&&m<=20&&1<=n&&n<=20)) {std: : cout<<"输入错误,请重新输入: "< getpointmn(); } elseif(qipan[n-1][m-1]! ='.') {std: : cout<<"所下的位置已经有棋子,请重新输入"< getpointmn(); } elseif(num_xy+num_mn>=400) {std: : cout<<"棋? 盘¨¬已°? 满¨²,ê? 平? 局? ! "< exit(0); } else {qipan[n-1][m-1]='*'; num_mn++; } } voidfive: : menu()//进入菜单Ì界面 {char*q=newchar[9]; cin>>q; if(strcmp(q,"c")) five: : showqipan(); } voidfive: : showqipan()//输出20行20列的坐标数值 {intp=0,q=0; for(inti=0;i<=20;i++) {if(p<10) {std: : cout< else std: : cout< p++; } cout< for(inti=0;i<20;i++) {if(i>=0) {q++; if(q<1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计 五子棋 游戏