C++课程设计说明书.docx
《C++课程设计说明书.docx》由会员分享,可在线阅读,更多相关《C++课程设计说明书.docx(16页珍藏版)》请在冰豆网上搜索。
C++课程设计说明书
摘要:
该游戏软件在Windows系统为玩家提供传统五子棋游戏的基本功能,在这简单的五子棋中,玩家通过鼠标进行两个人的游戏。
游戏中包含姓名输入、开始/重新开始、悔棋、是否同意和回放等功能,游戏的主战场为15行15列的棋盘。
游戏结束,如果有输赢,则输出谁胜,否则,输出平局的信息框。
关键词:
五子棋;视窗操作系统;游戏;MFC
TheGameofGobang
XiaobaoHuang
(JiangsuUniversity,China,Zhenjiang212013)
Abstract:
ToprovideatraditionalGobanggame,thisgamesoftwareintheWindowssystem,isforplayerswiththebasicfunctionsinthissimpleGobang,theaudiencesthroughamouseforatwo-persongame.Youcanenteryournamesincludedinthegame,ithasastart/restart,HuiQi,agreeornotandplaybackfunctions,themainbattlefieldofthegamefor15to15ofthechessboard.Theendofthegame,ifawinorlose,whowinsandoutput,oroutputtietheinformationbox.
Keywords:
Gobang;WindowsSystem;Game;MFC
目录
课程设计任务书1
一、课程设计题目:
五子棋游戏1
二、目的与要求:
1
1、目的:
1
2、基本要求:
1
3、创新要求:
1
4、写出设计说明书1
三、设计方法和基本原理:
1
四、设计中涉及到的重要内容:
1
五、程序设计和调试:
2
六、答辩与评分标准:
2
1前言3
2需求分析3
2.1系统概述3
2.1.1概述3
2.2系统运行环境3
2.2.1运行环境3
2.3功能需求描述3
2.3.1功能需求3
3总体设计4
3.1开发与设计的总体思想4
3.1.1屏幕的组成4
3.1.2形状的组成4
3.1.3形状的统一4
4概要设计5
4.1系统流程图5
4.2系统功能模块5
5详细设计6
5.1.界面的设计6
5.2游戏中棋盘的形成7
5.3游戏下子功能代码8
5.4判断功能代码10
5.5设置项目中的功能代码12
5.6悔棋功能代码12
5.7回放功能代码14
6测试分析15
7心得体会15
参考文献16
致谢17
课程设计任务书
一、课程设计题目:
五子棋游戏
二、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和C++调试技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
(4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。
2、基本要求:
(1)在开始编写程序以前,要完成对系统的分析,画出程序的流程框图。
(2)要求用C++类的思想来完成程序的设计。
(3)要求的程序中至少要定义两个类(例如:
坐标position类,棋子chess类等),类中要有多个属性和方法。
(4)完成的程序界面要美观,能够完成五子棋的基本游戏功能(两人对战)。
3、创新要求:
在基本要求达到后,进行创新设计,完善与增加游戏的功能,例如悔棋功能。
4、写出设计说明书
按照设计过程写出设计说明书。
三、设计方法和基本原理:
1、创建棋盘大小(可任意),并且要保存棋盘上各个点的位置;
2、创建棋子类及其属性和方法;
3、从盘键分别获取两个用户的输入,根据用户的身份及输入的位置,调用棋子类的相应方法,完成棋子的走动;
4、输赢的判断;
5、游戏结束。
四、设计中涉及到的重要内容:
1、对话框应用程序的编写方法及其相关函数;
2、绘图工具的使用方法;
五、程序设计和调试:
六、答辩与评分标准:
1、完成基本功能:
40分;
2、设计报告及使用说明书:
30分;
3、设置错误或者按照要求改变结果:
15分;
4、回答问题:
15分。
1前言
随着社会发展,人类的生产生活越来越离不开信息。
谁拥有了更多更有效的信息,谁就将在竞争中处于有利地位。
信息产业正在成为一个国家的支柱。
只有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出对自己有用的信息来加以利用。
作为计算机应用的一部分,使用计算机对信息进行管理,具有手工管理所无法比拟的优点。
例如:
检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高管理的效率,也是正规化管理与世界接轨的重要条件。
在下面的各章中我们将以开发一个五子棋游戏为例,谈谈其开发过程和所涉及到的问题及解决方法。
2需求分析
2.1系统概述
2.1.1概述
该游戏软件在Windows系统为玩家提供五子棋游戏两人对战的基本功能,玩家可以通过鼠标在棋盘的相应位置下子,一方为白色,另一方为黑色,先下的为黑子(主场)。
游戏过程中,只要有一人先连成五个棋子,不论横、竖或斜,就会在屏幕上显示是谁赢了比赛,也可以是平局收场,从而可以进行下一场比赛。
在比赛过程中,如果一方需要悔棋,先得通过对手的同意才可以。
在右下方,有黑子和白子,且还有“0”和“1”,“1”表示轮到此色子下了。
2.2系统运行环境
2.2.1运行环境
(1)硬件环境。
本系统适用于那种Inter386以上计算机,内存容量为128M,应配备键盘、鼠标、显示器等外部设备。
(2)软件环境。
本系统的设计采用VisualC++6.0编写。
在WindowsXPSP2环境下测试通过。
(3)本游戏软件在Windows平台下都可以运行。
2.3功能需求描述
2.3.1功能需求
这是一次新的尝试,也是一次比较成功的设计,其算法与程序结构足以让人满意。
这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求,回放效果更是让玩家欣赏自己是如何赢得或输的。
3总体设计
3.1开发与设计的总体思想
3.1.1屏幕的组成
一个游戏一定要有一个界面供游戏者对游戏控制。
这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,白方要下子时,必须要先看一看所有黑子的排列情况,决定是防守还是进攻,这关系着玩家要如何放置自己的棋子,让整体有个更加的布局,有利于游戏的进行。
屏幕由15行15列的网格组成;其中行的眉头上标有字母A、B、C…O;列的方向标有数字1、2、3……15。
菜单栏中的组成部分:
3.1.2形状的组成
每一种形状都是由五个棋子组成,比如●●●●●或○○○○○由五个棋子排列而成。
3.1.3形状的统一
妻子的排列,如:
●●●●●等共有8种形状(黑白的形状归为不同的形状)。
如图形状:
黑棋的四种情况:
●●●●●●○○○○●○○○○○○○○●
○○○○○●○○○○○●○○○○○○●○
○○○○○●○○○○○○●○○○○●○○
○○○○○●○○○○○○○●○○●○○○
○○○○○●○○○○○○○○●●○○○○
图3.1
白棋的四种情况:
○○○○○○●●●●○●●●●●●●●○
●●●●●○●●●●●○●●●●●●○●
●●●●●○●●●●●●○●●●●○●●
●●●●●○●●●●●●●○●●○●●●
●●●●●○●●●●●●●●○○●●●●
图3.2
4概要设计
4.1系统流程图
系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:
图4.1功能模块
图4.1系统流程图
4.2系统功能模块
系统功能模块是对系统的大致功能进行描述,本游戏的系统功能模块如下:
图4.2系统功能模块
5详细设计
根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:
5.1.界面的设计
程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。
使程序界面更加友好,在使用上给用户一种清新怡然的感觉。
5.2游戏中棋盘的形成
实现此功能相关代码如下:
voidCCk19View:
:
OnDraw(CDC*pDC)
{
CCk19Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CBitmapbitmap;//背景棋盘
bitmap.LoadBitmap(IDB_BITMAP1);
CDCmem,mem1,mem2,qzh,qzb;
mem.CreateCompatibleDC(pDC);
mem.SelectObject(&bitmap);
pDC->BitBlt(0,0,600,400,&mem,0,0,SRCCOPY);
CBitmapbitmap5;//死骑
bitmap5.LoadBitmap(IDB_BITMAP5);
mem2.CreateCompatibleDC(pDC);
mem2.SelectObject(&bitmap5);
pDC->BitBlt(350,0,600,352,&mem2,0,0,SRCCOPY);
CBitmapbitmap4;//五子棋
bitmap4.LoadBitmap(IDB_BITMAP4);
mem1.CreateCompatibleDC(pDC);
mem1.SelectObject(&bitmap4);
pDC->BitBlt(420,285,600,400,&mem1,0,0,SRCCOPY);
CBitmapbitmap2;//黑子
bitmap2.LoadBitmap(IDB_BITMAP2);
qzh.CreateCompatibleDC(pDC);
qzh.SelectObject(&bitmap2);
CBitmapbitmap3;//白子
bitmap3.LoadBitmap(IDB_BITMAP3);
qzb.CreateCompatibleDC(pDC);
qzb.SelectObject(&bitmap3);
//以下是显示棋子的代码
CRectrect;//矩形区域
GetClientRect(&rect);//获得窗口矩形区域
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&qp,0,0,SRCCOPY);//绘图
for(inti=0;i<15;i++)
for(intj=0;j<15;j++)
{
if(qz[i][j]==1)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzh,0,0,SRCCOPY);
}
elseif(qz[i][j]==2)
{
pDC->BitBlt(18+i*24,18+j*24,20,20,&qzb,0,0,SRCCOPY);
}
}
}
5.3游戏下子功能代码
intqz[15][15];//棋子的二维数组
实现此功能相关代码如下:
voidCCk19View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
inti=(point.x-10)/24;intj=(point.y-10)/24;
if(i<15&&j<15)
if(qz[i][j]==0)
{
qz[i][j]=count%2+1;
count++;
jl[i][j]=count;
OnDraw(this->GetDC());
Positionp(i,j,qz[i][j]);//Position类记录各棋子的位置和值
//inths,ss,ps,ns;是判断点(i,j)的横、竖、撇和捺有无五个子
hs=p.GetHorizontal();
ss=p.GetVertical();
ps=p.GetRightSlanting();
ns=p.GetLeftSlanting();
if(hs==5||ss==5||ps==5||ns==5)
{
if(qz[i][j]==1)
MessageBox("你真是太牛了!
\n恭喜你,黑子赢了!
\n游戏结束,请重新开始。
");
if(qz[i][j]==2)
MessageBox("你真是太牛了!
\n恭喜你,白子赢了!
\n游戏结束,请重新开始。
");
}
if((count==225)&&(hs!
=5)&&(ss!
=5)&&(ps!
=5)&&(ns!
=5))
MessageBox("你俩都很棒!
\n平手!
","请握手言和",MB_OK);
}
CView:
:
OnLButtonDown(nFlags,point);
}
5.4判断功能代码
此代码用来判断当某一方下完子后是否有练成五个子的可能性。
自己创建一个类并判断
classPosition//坐标position类
{
public:
Position(intm,intn,intk)
{x=m;y=n;f=k;}
intGetHorizontal();//获得水平连续棋子的个数
intGetVertical();//获得垂直连续棋子的个数
intGetRightSlanting();//获得右斜连续棋子的个数
intGetLeftSlanting();//获得左斜连续棋子的个数
private:
intf;//记录棋子的颜色,1为黑子,2为白子
intx;//行数
inty;//列数
inthsy;//水平向右
inthsz;//水平向左
intsss;//竖直向上
intssx;//竖直向下
intys;//右上
intzx;//左下
intyx;//右下
intzs;//左上
};
实现此功能相关代码如下:
intPosition:
:
GetHorizontal()//水平方向
{
hsy=hsz=0;
for(inti=1;y-i>=0;i++)
if(qz[x][y-i]!
=f)break;
hsz=i-1;
for(i=1;y+i<=14;i++)
if(qz[x][y+i]!
=f)break;
hsy=i-1;
return(hsy+hsz+1);
}
intPosition:
:
GetLeftSlanting()//左斜方向
{
ys=zx=0;
for(inti=1;(x-i>=0)&&(y+i<=14);i++)
if(qz[x-i][y+i]!
=f)break;
ys=i-1;
for(i=1;(x+i<=14)&&(y-i>=0);i++)
if(qz[x+i][y-i]!
=f)break;
zx=i-1;
return(ys+zx+1);
}
intPosition:
:
GetRightSlanting()//右斜方向
{
yx=zs=0;
for(inti=1;(x-i>=0)&&(y-i>=0);i++)
if(qz[x-i][y-i]!
=f)break;
zs=i-1;
for(i=1;(x+i<=14)&&(y+i<=14);i++)
if(qz[x+i][y+i]!
=f)break;
yx=i-1;
return(yx+zs+1);
}
intPosition:
:
GetVertical()//垂直方向
{
sss=ssx=0;
for(inti=1;x-i>=0;i++)
if(qz[x-i][y]!
=f)break;
sss=i-1;
for(i=1;y+i<=14;i++)
if(qz[x+i][y]!
=f)break;
ssx=i-1;
return(sss+ssx+1);
}
5.5设置项目中的功能代码
此功能用来在游戏结束后,用来“开始/重新开始”。
并且一次性消去棋盘上所有的棋子。
实现此功能相关代码如下:
voidCCk19View:
:
OnStart()
{
//TODO:
Addyourcommandhandlercodehere
for(inti=0;i<15;i++)
for(intj=0;j<15;j++)
qz[i][j]=0;
OnDraw(GetDC());
}
5.6悔棋功能代码
此功能是体现一种人性化,当某一方玩家觉得此步走错了,向对方提出悔棋请求。
当对方同意后,棋盘上会自动消除玩家刚下的一步棋。
程序的具体实现部分如程序清单如下所示。
voidCCk19View:
:
OnBlackAgree()//黑方同意
{
//TODO:
Addyourcommandhandlercodehere
for(inti=0;i<15;i++)
for(intj=0;j<15;j++)
if(jl[i][j]==count)
qz[i][j]=0;
count--;
OnDraw(GetDC());
}
voidCCk19View:
:
OnBlackNoAgree()//黑方不同意
{
//TODO:
Addyourcommandhandlercodehere
MessageBox("SOORY\n我不同意!
");
}
voidCCk19View:
:
OnBlackStone()//黑方提出悔棋请求
{
//TODO:
Addyourcommandhandlercodehere
MessageBox("黑棋提出悔棋请求!
\n白棋同意吗?
");
}
voidCCk19View:
:
OnWhiteAgree()//白方同意
{
//TODO:
Addyourcommandhandlercodehere
for(inti=0;i<15;i++)
for(intj=0;j<15;j++)
if(jl[i][j]==count)
qz[i][j]=0;
count--;
OnDraw(GetDC());
}
voidCCk19View:
:
OnWhiteNoAgree()//白方不同意
{
//TODO:
Addyourcommandhandlercodehere
MessageBox("不好意思啦!
\n不同意!
");
}
voidCCk19View:
:
OnWhiteStone()//白方提出悔棋请求
{
//TODO:
Addyourcommandhandlercodehere
MessageBox("白棋提出悔棋请求!
\n黑气同意吗?
");
}
5.7回放功能代码
为了进一步观察自己的得失和对手的技术,这一功能是一个比较好的平台,具体代码如下:
classChess//棋子chess类
{
public:
Chess(){i=0;j=0;k=1;}
voidRemember();//记住棋子的位置及次序
private:
inti,j,k;
};
voidChess:
:
Remember()
{
for(k=1;k<=count;k++)
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(jl[i][j]==k)
{
cp[k].x=i;
cp[k].y=j;
cp[k].n=qz[i][j];
}
for(i=0;i<15;i++)
for(j=0;j<15;j++)
qz[i][j]=0;
}
下面是实现回放的具体函数:
voidCCk19View:
:
OnReplay()
{
//TODO:
Addyourcommandhandlercodehere
Chessch;
ch.Remember();
SetTimer(1,1000,NULL);
}
inti=1;
voidCCk19View:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
qz[cp[i].x][cp[i].y]=cp[i].n;i++;
OnDraw(GetDC());
if(i>count)KillTimer
(1);
CView:
:
OnTimer(nIDEvent);
}
6测试分析
经过无数次的测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏,能够显示谁赢谁输,还是平局。
如利用鼠标进行下棋,悔棋,回放,用键盘输入姓名,在不需要此游戏界面在屏幕上显示时。
当结束游戏时,会自动弹出一个对话框。
7心得体会
经过一个多星期的设计和开发,系统基本开发完毕。
在本次课程设计中困难遇到不少,比如重新开始,弹出自己创建的对话框,回放等。
由于设计时间较短,所以该系统还有许多不尽如人意的地方,如输入姓名的对话框不够美观、回放不能重复两次等多方面问题。
在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以后进一步改进。
通过实践对于我以后的学习是一笔不小的财富!
参考文献
1.RobertThompason.MFC开发人员参考手册,机械工业出版社,1998
2.孔鹏.VisualC++6.0完全自学手册,机械工业出版社,2007
3.温秀梅丁学钧.VisualC++面向对象程序设计.清华大学出版社,2006
致谢
本论文和游戏软件是在指导老师悉心指导下完成的。
这次课程设计能够顺利的完成,要感谢同学的帮助。
首先要感谢是指导老师,在技术上给了我很大的帮助和启发,在我出现不明白的地方,不知如何去解决时,老师很有耐心的