C课程设计说明书Word文档下载推荐.docx
《C课程设计说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C课程设计说明书Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
1
1、目的:
2、基本要求:
3、创新要求:
4、写出设计说明书1
三、设计方法和基本原理:
四、设计中涉及到的重要内容:
五、程序设计和调试:
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)要求学生达到熟练掌握C++语言的基本知识和C++调试技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
(4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。
(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);
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);
//获得窗口矩形区域
BitBlt(0,0,rect.Width(),rect.Height(),&
qp,0,0,SRCCOPY);
//绘图
for(inti=0;
i<
15;
i++)
for(intj=0;
j<
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)
qzb,0,0,SRCCOPY);
}
}
}
5.3游戏下子功能代码
intqz[15][15];
//棋子的二维数组
OnLButtonDown(UINTnFlags,CPointpoint)
Addyourmessagehandlercodehereand/orcalldefault
inti=(point.x-10)/24;
intj=(point.y-10)/24;
if(i<
15&
&
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)
\n恭喜你,白子赢了!
}
if((count==225)&
(hs!
=5)&
(ss!
(ps!
(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;
if(qz[x][y+i]!
hsy=i-1;
return(hsy+hsz+1);
GetLeftSlanting()//左斜方向
ys=zx=0;
(x-i>
=0)&
(y+i<
=14);
if(qz[x-i][y+i]!
ys=i-1;
(x+i<
=14)&
(y-i>
=0);
if(qz[x+i][y-i]!
zx=i-1;
return(ys+zx+1);
GetRightSlanting()//右斜方向
{
yx=zs=0;
if(qz[x-i][y-i]!
zs=i-1;
if(qz[x+i][y+i]!
yx=i-1;
return(yx+zs+1);
GetVertical()//垂直方向
sss=ssx=0;
x-i>
if(qz[x-i][y]!
sss=i-1;
if(qz[x+i][y]!
ssx=i-1;
return(sss+ssx+1);
5.5设置项目中的功能代码
此功能用来在游戏结束后,用来“开始/重新开始”。
并且一次性消去棋盘上所有的棋子。
OnStart()
Addyourcommandhandlercodehere
qz[i][j]=0;
OnDraw(GetDC());
5.6悔棋功能代码
此功能是体现一种人性化,当某一方玩家觉得此步走错了,向对方提出悔棋请求。
当对方同意后,棋盘上会自动消除玩家刚下的一步棋。
程序的具体实现部分如程序清单如下所示。
OnBlackAgree()//黑方同意
if(jl[i][j]==count)
qz[i][j]=0;
count--;
OnBlackNoAgree()//黑方不同意
MessageBox("
SOORY\n我不同意!
}
OnBlackStone()//黑方提出悔棋请求
黑棋提出悔棋请求!
\n白棋同意吗?
OnWhiteAgree()//白方同意
for(intj=0;
OnWhiteNoAgree()//白方不同意
不好意思啦!
\n不同意!
voidCCk19View:
OnWhiteStone()//白方提出悔棋请求
白棋提出悔棋请求!
\n黑气同意吗?
5.7回放功能代码
为了进一步观察自己的得失和对手的技术,这一功能是一个比较好的平台,具体代码如下:
classChess//棋子chess类
public:
Chess(){i=0;
j=0;
k=1;
voidRemember();
//记住棋子的位置及次序
inti,j,k;
voidChess:
Remember()
{
for(k=1;
k<
=count;
k++)
for(i=0;
for(j=0;
if(jl[i][j]==k)
cp[k].x=i;
cp[k].y=j;
cp[k].n=qz[i][j];
for(j=0;
下面是实现回放的具体函数:
OnReplay()
Chessch;
ch.Remember();
SetTimer(1,1000,NULL);
inti=1;
OnTimer(UINTnIDEvent)
qz[cp[i].x][cp[i].y]=cp[i].n;
i++;
if(i>
count)KillTimer
(1);
OnTimer(nIDEvent);
6测试分析
经过无数次的测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏,能够显示谁赢谁输,还是平局。
如利用鼠标进行下棋,悔棋,回放,用键盘输入姓名,在不需要此游戏界面在屏幕上显示时。
当结束游戏时,会自动弹出一个对话框。
7心得体会
经过一个多星期的设计和开发,系统基本开发完毕。
在本次课程设计中困难遇到不少,比如重新开始,弹出自己创建的对话框,回放等。
由于设计时间较短,所以该系统还有许多不尽如人意的地方,如输入姓名的对话框不够美观、回放不能重复两次等多方面问题。
在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以后进一步改进。
通过实践对于我以后的学习是一笔不