面向对象程序设计(C++)课程大作业
设计题目: 院 系: 计算机科学与信息工程学院 专业班级: 学号姓名: 指导教师:
2015 年 1月
目 录
一、 成员分工 .................................................. 1 二、需求分析 ................................................... 2 三、总体设计 ................................................... 3 四、详细设计 ................................................... 8 五、系统测试 .................................................. 24 六、总结 ...................................................... 30 七、参考文献 .................................................. 31
一 成员分工
我们小组成员共有三名,分别是,为了能按时圆满的完成这次VC++课程设计,我们小组进行了详细的分工,以确保设计能按时完成。经过周密的考虑和详细的调查最终确定该俄罗斯方块游戏需要以下几个功能模块:
(1) 需求分析 (2) 界面的设计 (3) 背景色的选择模块 (4) 游戏随机选择方块模块 (5) 游戏预览功能模块 (6) 收埋功能模块 (7) 记分功能模块 (8) 鼠标控制功能模块 (9) 模块联结 (10) 系统测试
经过小组成员的讨论,并根据个人的特长和具体爱好做如下具体分工:
刘国松具体完成以下模块的设计与实现:
(1 ) 需求分析 (2 ) 界面的设计 (3 ) 背景色的选择模块
吕秀锦具体完成以下模块的设计与实现:
(1) 游戏随机选择方块模块 (2) 游戏预览功能模块 (3) 收埋功能模块 (4) 记分功能模块
高婉婉主要具体完成以下模块的设计与实现:
(1) 鼠标控制功能模块 (2) 模块联结 (3) 系统测试
二 需求分析
1.系统概述
该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,自动消除并记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级和高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方块,玩家依靠自己消层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶端时游戏失败。
2.系统运行环境
(1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M,应配备,键盘,鼠标,显示器等外部设备。
(2)软件环境。本系统的设计采用Visual C++6.0编写。在Windows XP SP2环境下测试通过 (3)本游戏软件在Windows平台下都可以运行。
3.功能需求描述
这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以让人兴奋了。 这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求。
这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩家游戏池中的砖块累积到顶端时游戏失败。
三 总体设计
1.屏幕的组成
一个游戏一定要有一个界面供游戏者对游戏控制。
这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布局,有利于游戏的进行。屏幕由20行13列的网格组成;其中0~2行:初始的形状将在这里形成然后下落,这三行用户不可见;3~19区域;20,其标记已到屏幕底部。在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落),
收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。
2.形状的组成
每一种形状都是由四个方块组成,比如■■■■由四个方块横向排列而成
3.形状的统一
■■■■等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们都是“形状”。这一点是游戏成功的基础。
为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在4×4的格子中,以该4×4格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。
★□□□ ★为基础点,形状各块的相对坐标是相对于这个基础点的 □□□□ □□□□ □□□□
那么■■■■在其中就如图:其四个方块相对于基础点的网格坐标就为 (0,2)(1,2)(2,2)(3,2) □□□□ □□□□
■■■■ 02122232 □□□□
同理: □□□□ □□□□ ■■□□
■■□□ 02120313
这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也就是其形状(样子)。
4.移动与旋转的统一
从上面我们可以看出形状的移动可以这样来实现: 移动基础点的网格坐标,然后组成形状的四个方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。
旋转与移动的原理一样:设旋转前的形状为ZZ = 0,旋转后的形状为ZZ=1,组成形状A的四个方块按照B(而不是按照A)的相对于基础点坐标的相对值而改变网格坐标,则表现为旋转。
比如, □□□□ □□□□
■■■■ 02122232 □□□□
移动: 设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其向左移动一格,那么它的基础了坐标gX-=1; gY=gY; 其各方块移动后坐标 (gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。
旋转:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其旋转一次,旋转后的形状如图
□■□□
□■□□ 10111213 □■□□ □■□□
那么其旋转后的各方块坐标 (gX+1,gY+0), (gX+1,gY+1), (gX+1,gY+2), (gX+1,gY+3)
如果我们将各形状编号,比如■■■■编号0,其旋转90度以后的形状为编号1 那么0旋转目标为1,1的旋转目标为0 所以所有形状便得到了统一,如图形状 □□□□ □□□□
□□□□ □■□□ □■□□ □■□□ □■□□ □□□□ ■□□□ ■□□□ ■■□□ □□□□ □□□□ ■■■□ ■□□□ □□□□ ■■□□ □■□□ □■□□ □□□□ □□■□ ■■■□ □□□□ □□□□ □□□□ ■■□□ ■■□□ □□□□ □■□□
□□□□ ■■□□ □■■□ □□□□ □□□□ □■□□ □■□□ ■■□□ □□□□ ■□□□ ■■■□ □□□□ □□□□ □■■□ □■□□ □■□□ □□□□ □□□□ ■■■□ □□■□ □□□□ ■□□□ ■■□□ □■□□ □□□□ □■■□ ■■□□
□□□□ □■□□ ■■■□ □□□□ □□□□ □■□□ □■■□ □■□□ □□□□ □□□□ ■■■□
□■□□ □□□□ ■□□□ ■■□□ □■□□
四 详细设计
1.程序流程图 (1)数据流图
数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。本俄罗斯游戏的大致流程图如下
(2)系统功能模块
(3) 系统流程图
系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:
2程序模块详细设计
根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:
(1)界面的设计
程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。使程序界面更加友好,在使用上给用户一种清新怡然的感觉。其界面如图所示:
- -
9
(2)背景色的选择模块
实现此功能代码如下: void CGameDlg::OnBackcolor() { }
- -
10
//背景色
CColorDialog dlg(BackColor); if(dlg.DoModal()==IDOK)
BackColor=dlg.GetColor();
//
Back=1;
(3)游戏随机选择方块模块
在游戏中,每一个下落的方块都是随机的,包括颜色,形状。 实现此功能相关代码如下: void CGameDlg::Shape() { }
- -
int line=18; int rr=4; CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
CPen pen;
pen.CreatePen (PS_SOLID,1,RGB(0,0,0)); CBrush brush1,brush2,brush3;
brush1.CreateSolidBrush(RGB(60,60,60)); brush3.CreateSolidBrush(RGB(0,170,0)); brush2.CreateSolidBrush(BackColor);
pDC->SelectObject (pen); pDC->SelectObject (brush1);
pDC->Rectangle(X-line,Y-line,X+M*r+line,Y+N*r+line);
int b=line*2/3,c=b-rr; pDC->SelectObject (brush3);
pDC->Rectangle(X-b,Y-b,X+M*r+b,Y+N*r+b); pDC->SelectObject (brush1);
pDC->Rectangle(X-c,Y-c,X+M*r+c,Y+N*r+c);
pDC->SelectObject (brush2);
pDC->Rectangle(X-2,Y-2,X+M*r+2,Y+N*r+2); DeleteObject(pen);DeleteObject(brush1); DeleteObject(brush2);DeleteObject(brush3);
ReleaseDC(pDC);
//外部框架
11
void CGameDlg::one(int Type, int i, int j) //某元格颜色 位置 { if(Runing==0) { OnDestroy(); return;
}
CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
COLORREF color,L_color=RGB(0,0,0); switch(Type) {
case 0: color=L_color=BackColor;break; case 1: color=RGB(131,129,222); break; case 2: color=RGB(250,90,130); break; case 3: color=RGB(40,220,250); break; case 4: color=RGB(40,120,50); break; case 5: color=RGB(0,250,0); break; case 6: color=RGB(131,19,222); break; case 7: color=RGB(120,190,30); break; case 8: color=RGB(140,20,150); break; case 9: color=RGB(40,120,150); break; case 10: color=RGB(23,62,180); break; case 11: color=RGB(131,129,22); break; case 12: color=RGB(20,190,130); break; case 13: color=RGB(40,234,220); break; case 14: color=RGB(140,70,150); break; case 15: color=RGB(30,150,40); break; case 16: color=RGB(78,203,30); break; case 17: color=RGB(120,100,30); break; case 18: color=RGB(240,70,20); break; case 19: color=RGB(40,180,90); break;
case 20: color=RGB(123,62,180); break;
- -
12
case 21: color=RGB(120,0,20); break; case 22: color=RGB(0,0,250); break; case 23: color=RGB(0,250,0);
break;
case 24: color=RGB(0,250,250); break; case 25: color=RGB(250,0,0);
break;
case 26: color=RGB(250,0,250); break; case 27: color=RGB(250,250,0); break; case 28: color=RGB(250,250,250);break;
case 29: color=RGB(rand()%250,rand()%250,rand()%250); break; case 30: color=RGB(rand()%250,rand()%250,rand()%250); break; case 31: color=RGB(rand()%250,rand()%250,rand()%250); break; case 32: color=RGB(rand()%250,rand()%250,rand()%250); break; case 33: color=RGB(rand()%250,rand()%250,rand()%250); break; case 34: color=RGB(rand()%250,rand()%250,rand()%250); break; } CPen pen; CBrush brush;
pen.CreatePen(PS_SOLID,1,L_color);
brush.CreateSolidBrush (color); pDC->SelectObject(pen); pDC->SelectObject(brush);
pDC->Rectangle(X+i*r,Y+j*r,X+(i+1)*r,Y+(j+1)*r); DeleteObject(pen); DeleteObject(brush); ReleaseDC(pDC);
}
(4)游戏预览功能模块
此模块用来为游戏爱好者提供下一个方块的信息, 实现此功能相关代码如下: void CGameDlg::PreView()
//预先显示组
{
if(Runing==0)
- -
13
}
void CGameDlg::OnButton1() { }
- -
14
{ }
CTime tm=CTime::GetCurrentTime();
OnDestroy(); return;
object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1; object2.x=M/2;object2.y=0;
object2.group=(tm.GetMinute()*tm.GetSecond()+rand())%7+1; ZZ2=(rand()+tm.GetDay()*tm.GetHour())%97;
b0=b1=b2=b3=b4=b5=b6=b7=0; switch(object2.group) {
case 1: b2=0;b3=1;b4=1;b5=0;b6=1;b7=1; break; case 2: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break; case 3: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break; case 4: b2=0;b3=1;b4=0;b5=2;b6=0;b7=-1; break; case 5: b2=0;b3=-1;b4=1;b5=0;b6=1;b7=1; break; case 6: b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break; case 7: b2=0;b3=1;b4=0;b5=2;b6=1;b7=1; break; }
for(int i=0;i
ChangeShape(object2);
if(object2.y+b3
object2.y=object2.y+1;
if(object2.y+b3>0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0)
object2.y=0;
CDC *pDC = GetDC(); ASSERT(pDC != NULL); OnDraw(pDC); ReleaseDC(pDC);
void CGameDlg::OnDown() { }
void CGameDlg::OnLeft() { }
void CGameDlg::OnRight() { }
void CGameDlg::OnUp() { }
void CGameDlg::MoveOn(int n) {
// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
DeleteGroup(object);int b_x=object.x,b_y=object.y; switch(n) {
- -
15
if(!Runing)
return;
MoveOn(3);
ObjectGroup(object); KillTimer(11);
SetTimer(11, 10, NULL);
if(!Runing)
return;
MoveOn(4);
if(!Runing)
return;
MoveOn(2);
if(!Runing)
return;
MoveOn(1);
}
void CGameDlg::ClearUp() {
CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
COLORREF color=RGB(233,230,214); CPen pen;
- -
16
ChangeShape(object); ObjectGroup(object); break;
case 2:
object.x = object.x
object.x=b_x;
ObjectGroup(object); break;
case 3:
object.y=object.y
case 4:
object.x=object.x>1?object.x-1:0;
if(check1())object.x=b_x; ObjectGroup(object); break;
case 5: }
Show(object); ReleaseDC(pDC);
object.y=object.y>1?object.y-1:0; if(check2())object.y=b_y; ObjectGroup(object); break;
//清空预备显示 地方
}
pen.CreatePen(PS_SOLID,1,color); brush.CreateSolidBrush (color); pDC->SelectObject(pen); pDC->SelectObject(brush);
pDC->Rectangle(J_x,J_y,J_x+118,J_y+155); DeleteObject(brush); DeleteObject(pen); ReleaseDC(pDC);
(5)收埋功能模块
此模块用来收藏游戏界面。 实现此功能相关代码如下:
void CGameDlg::OnTimer(UINT nIDEvent) //处理往下运动过程 {
//===========================2往右收埋 if(nIDEvent==2) { }
if(nIDEvent==6) {
- -
MoveWindow(p1.x,p1.y,m_W,m_H); p1.x+=10;
if(p1.x>desktopRect.Width()) { }
KillTimer(2); Set=2;
Si.left=LW-T; Si.top=Sj.top; Si.right=LW; Si.bottom=Sj.bottom;
17
p1.x-=10; if(p1.x
KillTimer(6);
}
//=============================3 if(nIDEvent==3) { }
if(nIDEvent==7) { }
//=========================1 if(nIDEvent==1) {
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y-=10;
if(p1.y+m_H+10
- -
18
往上收埋
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10;
if(p1.y>desktopRect.Height()) { }
KillTimer(3); Set=3;
Si.left=Sj.left; Si.top=LH-T; Si.right=Sj.right; Si.bottom=LH;
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y-=10; if(p1.y
KillTimer(7);
往下收埋
KillTimer(1); Set=1;
Si.left=Sj.left; Si.top=0;
Si.right=Sj.right; Si.bottom=T;
}
}
if(nIDEvent==5) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10; if(p1.y>=30)
KillTimer(5);
}
//=======================4 往左收埋 if(nIDEvent==4) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.x-=10; if(p1.x+m_W+10
Si.left=0; Si.top=Sj.top; Si.right=T; Si.bottom=Sj.bottom;
}
}
if(nIDEvent==8) {
}
if(p1.x>=30)
KillTimer(8);
(6)记分功能模块
此模块用来记录在游戏过程中,玩家所得的分数。并且一次性消去的方块行数越多,那么得到的分数也就越多。
实现此功能相关代码如下: {
G[object.x+a0][object.y+a1]=object.Type; G[object.x+a2][object.y+a3]=object.Type; G[object.x+a4][object.y+a5]=object.Type; G[object.x+a6][object.y+a7]=object.Type;
int i,j,k,p,q,o=0; for(i=0;i
if(G[i][1]>0||G[i][0]>0) { }
Runing=0;
AfxMessageBox(
void CGameDlg::KeepData()
//保存放好所在位置
for( j = N-1; j >= 0; j--) {
for(i=0,k=0;i
if(G[i][j]>0)
k++;
if(k==M) {
o++;
}
}
}
for(q=0;q
G[q][p]=G[q][p-1]; one(G[q][p],q,p);
for(q=0;q
Score+=100*o;
G[q][0]=0; one(G[q][p],q,p);
(7)鼠标控制功能模块
此模块也是本游戏的重点,玩家通过鼠标控制进行游戏。向上是变换图形,向下是很方块快速下落,向左是使方块向左移动,向右是很方块向右移动。 程序的具体实现部分如程序清单如下所示。
void CGameDlg::ChangeShape(OBJECT object)//转组 { do{
switch(object.group) {
int z[4][2] = {0}; int i,j,k; if(Runing==0) { }
OnDestroy(); return;
case1:ZZ=0;z[1][0]=1;z[1][1]=0;z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break; case 2:ZZ++; ZZ%=4;switch(ZZ) {
case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=-1;break; case 1:z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=-1;break; case 2:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break; case 3:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=1;break;
}
break;
case 3:ZZ++; ZZ%=4; switch(ZZ) {
case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break; case 1:z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=1;break; case 2:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=1;break; case 3:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=-1;break; } break;
case 4: ZZ++; ZZ%=2; switch(ZZ) {
case 1:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=2;z[3][0]=0;z[3][1]=1;break; case 0:z[1][0]=1;z[1][1]=0; z[2][0]=2;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break; } break; case 5: ZZ++; ZZ%=2; switch(ZZ) {
case 1:z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break; case 0:
z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=1;z[3][0]=1;z[3][1]=0;break; } break;
switch(ZZ) { case 1:
z[1][0]=0;z[1][1]=1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break; case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break; } break; case 7: ZZ++; ZZ%=4; switch(ZZ) { case 0:
z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break; case 1:
z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=0;break; case 2:
z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=0;z[3][0]=1;z[3][1]=0;break; case 3:
z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=0;z[3][1]=-1;break; } break; } int t[8];
for(i=0,k=0;i
t[k]=z[i][j]; k++; }
InPut(object,t);
}while(check2()||check1()); }
五 系统测试
1. 运行游戏,进入游戏界面
2. 开始游戏
(1) 选择游戏背景颜色
(2) 选择游戏级别
3. 游戏得分
4.收埋功能
5. 游戏结束
经过测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏。如利用鼠标进行图形的变换,移动和下落,在不需要此游戏界面在屏幕上显示时,我们可以对其进行收埋,即收藏,并可以从上,下,左,右四个方向时行收藏。当我们想结束游戏时,也可以直接点收埋按钮,结束游戏。
六 总结
经过我们努力的设计和开发,系统基本开发完毕。在本次课程设计中困难遇到不少,比如如何让方块随机产生,每个方块的颜色将如何对应,怎样实现方块形状的变换等待,由于设计时间较短,所以该系统还有许多不尽如人意的地方,如出错处理不够完善等多方面问题。在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以后进一步改进。经过这次的课程设计,在设计中不断完善中,我们知道要做好一件事首先要理清思路,弄懂到底要解决什么问题及相应的步骤,采取的方法和开发工具,以及对一些可能的程序异常或是常见问题的容错检测和修正方案等。对于软件系统的开发,跟应该按照软件工程的相关方法流程等规定进行。写代码并不是最首要的。应根据问题的特色详细的进行需求分析,确定概念模型,然后确定逻辑模型,选定开发工具和开发方案,同时注意文档的修订等。做到每一步思路清晰,有章可依等。
本次课程设计过程,使我们对VC++课程设计有了更深刻的认识。大大提高了模型规划、系统设计和软件编程的能力,自身的各方面的素质也得到了提高。同时也培养了我们的团队协作精神。这次课程设计不仅充实了我们的计算机专业知识,扩大了知识面,增强分析问题和解决问题的能力,也提高自学的能力与软件开发能力,为今后的工作打下了坚实的基础。
七 参考文献
[1]. 段钢 编著 加密与解密(第三版).电子工业出版社.2009年8月.
[2]. 赵树升 赵韶平. Windows信息安全原理与实现.清华大学出版社.2004年9月.
[3]. 赛奎春.Visual C++ 信息系统开发实例精选,2005
[4]. 杨永国. Visual C++ 6.0实用教程. 清华大学出版社,2004
[5]. 唐俊明. Visual C++ 6.0 编程实例与技巧. 高等教育出版,2002
[6]. 潘锦平. 软件系统开发技术. 西安电子科技大学出版社, 1997
[7]. 郑阿奇 丁有和 编著 Visual C++(第2版).机械工业出版社.2008年8月.
[8]. 侯俊杰 编著 深入浅出MFC(第2版).华中科技大学出版社.2008年1月.
[9]. 孙鑫 余安萍 编著 VC++ 深入浅出详解.电子工业出版社.2006年6月.
面向对象程序设计(C++)课程大作业
设计题目: 院 系: 计算机科学与信息工程学院 专业班级: 学号姓名: 指导教师:
2015 年 1月
目 录
一、 成员分工 .................................................. 1 二、需求分析 ................................................... 2 三、总体设计 ................................................... 3 四、详细设计 ................................................... 8 五、系统测试 .................................................. 24 六、总结 ...................................................... 30 七、参考文献 .................................................. 31
一 成员分工
我们小组成员共有三名,分别是,为了能按时圆满的完成这次VC++课程设计,我们小组进行了详细的分工,以确保设计能按时完成。经过周密的考虑和详细的调查最终确定该俄罗斯方块游戏需要以下几个功能模块:
(1) 需求分析 (2) 界面的设计 (3) 背景色的选择模块 (4) 游戏随机选择方块模块 (5) 游戏预览功能模块 (6) 收埋功能模块 (7) 记分功能模块 (8) 鼠标控制功能模块 (9) 模块联结 (10) 系统测试
经过小组成员的讨论,并根据个人的特长和具体爱好做如下具体分工:
刘国松具体完成以下模块的设计与实现:
(1 ) 需求分析 (2 ) 界面的设计 (3 ) 背景色的选择模块
吕秀锦具体完成以下模块的设计与实现:
(1) 游戏随机选择方块模块 (2) 游戏预览功能模块 (3) 收埋功能模块 (4) 记分功能模块
高婉婉主要具体完成以下模块的设计与实现:
(1) 鼠标控制功能模块 (2) 模块联结 (3) 系统测试
二 需求分析
1.系统概述
该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,自动消除并记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级和高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方块,玩家依靠自己消层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶端时游戏失败。
2.系统运行环境
(1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M,应配备,键盘,鼠标,显示器等外部设备。
(2)软件环境。本系统的设计采用Visual C++6.0编写。在Windows XP SP2环境下测试通过 (3)本游戏软件在Windows平台下都可以运行。
3.功能需求描述
这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以让人兴奋了。 这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求。
这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩家游戏池中的砖块累积到顶端时游戏失败。
三 总体设计
1.屏幕的组成
一个游戏一定要有一个界面供游戏者对游戏控制。
这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布局,有利于游戏的进行。屏幕由20行13列的网格组成;其中0~2行:初始的形状将在这里形成然后下落,这三行用户不可见;3~19区域;20,其标记已到屏幕底部。在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落),
收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。
2.形状的组成
每一种形状都是由四个方块组成,比如■■■■由四个方块横向排列而成
3.形状的统一
■■■■等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们都是“形状”。这一点是游戏成功的基础。
为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在4×4的格子中,以该4×4格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。
★□□□ ★为基础点,形状各块的相对坐标是相对于这个基础点的 □□□□ □□□□ □□□□
那么■■■■在其中就如图:其四个方块相对于基础点的网格坐标就为 (0,2)(1,2)(2,2)(3,2) □□□□ □□□□
■■■■ 02122232 □□□□
同理: □□□□ □□□□ ■■□□
■■□□ 02120313
这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也就是其形状(样子)。
4.移动与旋转的统一
从上面我们可以看出形状的移动可以这样来实现: 移动基础点的网格坐标,然后组成形状的四个方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。
旋转与移动的原理一样:设旋转前的形状为ZZ = 0,旋转后的形状为ZZ=1,组成形状A的四个方块按照B(而不是按照A)的相对于基础点坐标的相对值而改变网格坐标,则表现为旋转。
比如, □□□□ □□□□
■■■■ 02122232 □□□□
移动: 设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其向左移动一格,那么它的基础了坐标gX-=1; gY=gY; 其各方块移动后坐标 (gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。
旋转:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其旋转一次,旋转后的形状如图
□■□□
□■□□ 10111213 □■□□ □■□□
那么其旋转后的各方块坐标 (gX+1,gY+0), (gX+1,gY+1), (gX+1,gY+2), (gX+1,gY+3)
如果我们将各形状编号,比如■■■■编号0,其旋转90度以后的形状为编号1 那么0旋转目标为1,1的旋转目标为0 所以所有形状便得到了统一,如图形状 □□□□ □□□□
□□□□ □■□□ □■□□ □■□□ □■□□ □□□□ ■□□□ ■□□□ ■■□□ □□□□ □□□□ ■■■□ ■□□□ □□□□ ■■□□ □■□□ □■□□ □□□□ □□■□ ■■■□ □□□□ □□□□ □□□□ ■■□□ ■■□□ □□□□ □■□□
□□□□ ■■□□ □■■□ □□□□ □□□□ □■□□ □■□□ ■■□□ □□□□ ■□□□ ■■■□ □□□□ □□□□ □■■□ □■□□ □■□□ □□□□ □□□□ ■■■□ □□■□ □□□□ ■□□□ ■■□□ □■□□ □□□□ □■■□ ■■□□
□□□□ □■□□ ■■■□ □□□□ □□□□ □■□□ □■■□ □■□□ □□□□ □□□□ ■■■□
□■□□ □□□□ ■□□□ ■■□□ □■□□
四 详细设计
1.程序流程图 (1)数据流图
数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。本俄罗斯游戏的大致流程图如下
(2)系统功能模块
(3) 系统流程图
系统流程图是对系统的大致流程进行描述,本游戏的系统流程图如下:
2程序模块详细设计
根据上面所介绍的本系统的各个模块及其需要实现的功能,下面详细设计如下:
(1)界面的设计
程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。使程序界面更加友好,在使用上给用户一种清新怡然的感觉。其界面如图所示:
- -
9
(2)背景色的选择模块
实现此功能代码如下: void CGameDlg::OnBackcolor() { }
- -
10
//背景色
CColorDialog dlg(BackColor); if(dlg.DoModal()==IDOK)
BackColor=dlg.GetColor();
//
Back=1;
(3)游戏随机选择方块模块
在游戏中,每一个下落的方块都是随机的,包括颜色,形状。 实现此功能相关代码如下: void CGameDlg::Shape() { }
- -
int line=18; int rr=4; CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
CPen pen;
pen.CreatePen (PS_SOLID,1,RGB(0,0,0)); CBrush brush1,brush2,brush3;
brush1.CreateSolidBrush(RGB(60,60,60)); brush3.CreateSolidBrush(RGB(0,170,0)); brush2.CreateSolidBrush(BackColor);
pDC->SelectObject (pen); pDC->SelectObject (brush1);
pDC->Rectangle(X-line,Y-line,X+M*r+line,Y+N*r+line);
int b=line*2/3,c=b-rr; pDC->SelectObject (brush3);
pDC->Rectangle(X-b,Y-b,X+M*r+b,Y+N*r+b); pDC->SelectObject (brush1);
pDC->Rectangle(X-c,Y-c,X+M*r+c,Y+N*r+c);
pDC->SelectObject (brush2);
pDC->Rectangle(X-2,Y-2,X+M*r+2,Y+N*r+2); DeleteObject(pen);DeleteObject(brush1); DeleteObject(brush2);DeleteObject(brush3);
ReleaseDC(pDC);
//外部框架
11
void CGameDlg::one(int Type, int i, int j) //某元格颜色 位置 { if(Runing==0) { OnDestroy(); return;
}
CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
COLORREF color,L_color=RGB(0,0,0); switch(Type) {
case 0: color=L_color=BackColor;break; case 1: color=RGB(131,129,222); break; case 2: color=RGB(250,90,130); break; case 3: color=RGB(40,220,250); break; case 4: color=RGB(40,120,50); break; case 5: color=RGB(0,250,0); break; case 6: color=RGB(131,19,222); break; case 7: color=RGB(120,190,30); break; case 8: color=RGB(140,20,150); break; case 9: color=RGB(40,120,150); break; case 10: color=RGB(23,62,180); break; case 11: color=RGB(131,129,22); break; case 12: color=RGB(20,190,130); break; case 13: color=RGB(40,234,220); break; case 14: color=RGB(140,70,150); break; case 15: color=RGB(30,150,40); break; case 16: color=RGB(78,203,30); break; case 17: color=RGB(120,100,30); break; case 18: color=RGB(240,70,20); break; case 19: color=RGB(40,180,90); break;
case 20: color=RGB(123,62,180); break;
- -
12
case 21: color=RGB(120,0,20); break; case 22: color=RGB(0,0,250); break; case 23: color=RGB(0,250,0);
break;
case 24: color=RGB(0,250,250); break; case 25: color=RGB(250,0,0);
break;
case 26: color=RGB(250,0,250); break; case 27: color=RGB(250,250,0); break; case 28: color=RGB(250,250,250);break;
case 29: color=RGB(rand()%250,rand()%250,rand()%250); break; case 30: color=RGB(rand()%250,rand()%250,rand()%250); break; case 31: color=RGB(rand()%250,rand()%250,rand()%250); break; case 32: color=RGB(rand()%250,rand()%250,rand()%250); break; case 33: color=RGB(rand()%250,rand()%250,rand()%250); break; case 34: color=RGB(rand()%250,rand()%250,rand()%250); break; } CPen pen; CBrush brush;
pen.CreatePen(PS_SOLID,1,L_color);
brush.CreateSolidBrush (color); pDC->SelectObject(pen); pDC->SelectObject(brush);
pDC->Rectangle(X+i*r,Y+j*r,X+(i+1)*r,Y+(j+1)*r); DeleteObject(pen); DeleteObject(brush); ReleaseDC(pDC);
}
(4)游戏预览功能模块
此模块用来为游戏爱好者提供下一个方块的信息, 实现此功能相关代码如下: void CGameDlg::PreView()
//预先显示组
{
if(Runing==0)
- -
13
}
void CGameDlg::OnButton1() { }
- -
14
{ }
CTime tm=CTime::GetCurrentTime();
OnDestroy(); return;
object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1; object2.x=M/2;object2.y=0;
object2.group=(tm.GetMinute()*tm.GetSecond()+rand())%7+1; ZZ2=(rand()+tm.GetDay()*tm.GetHour())%97;
b0=b1=b2=b3=b4=b5=b6=b7=0; switch(object2.group) {
case 1: b2=0;b3=1;b4=1;b5=0;b6=1;b7=1; break; case 2: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break; case 3: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break; case 4: b2=0;b3=1;b4=0;b5=2;b6=0;b7=-1; break; case 5: b2=0;b3=-1;b4=1;b5=0;b6=1;b7=1; break; case 6: b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break; case 7: b2=0;b3=1;b4=0;b5=2;b6=1;b7=1; break; }
for(int i=0;i
ChangeShape(object2);
if(object2.y+b3
object2.y=object2.y+1;
if(object2.y+b3>0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0)
object2.y=0;
CDC *pDC = GetDC(); ASSERT(pDC != NULL); OnDraw(pDC); ReleaseDC(pDC);
void CGameDlg::OnDown() { }
void CGameDlg::OnLeft() { }
void CGameDlg::OnRight() { }
void CGameDlg::OnUp() { }
void CGameDlg::MoveOn(int n) {
// TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
DeleteGroup(object);int b_x=object.x,b_y=object.y; switch(n) {
- -
15
if(!Runing)
return;
MoveOn(3);
ObjectGroup(object); KillTimer(11);
SetTimer(11, 10, NULL);
if(!Runing)
return;
MoveOn(4);
if(!Runing)
return;
MoveOn(2);
if(!Runing)
return;
MoveOn(1);
}
void CGameDlg::ClearUp() {
CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
COLORREF color=RGB(233,230,214); CPen pen;
- -
16
ChangeShape(object); ObjectGroup(object); break;
case 2:
object.x = object.x
object.x=b_x;
ObjectGroup(object); break;
case 3:
object.y=object.y
case 4:
object.x=object.x>1?object.x-1:0;
if(check1())object.x=b_x; ObjectGroup(object); break;
case 5: }
Show(object); ReleaseDC(pDC);
object.y=object.y>1?object.y-1:0; if(check2())object.y=b_y; ObjectGroup(object); break;
//清空预备显示 地方
}
pen.CreatePen(PS_SOLID,1,color); brush.CreateSolidBrush (color); pDC->SelectObject(pen); pDC->SelectObject(brush);
pDC->Rectangle(J_x,J_y,J_x+118,J_y+155); DeleteObject(brush); DeleteObject(pen); ReleaseDC(pDC);
(5)收埋功能模块
此模块用来收藏游戏界面。 实现此功能相关代码如下:
void CGameDlg::OnTimer(UINT nIDEvent) //处理往下运动过程 {
//===========================2往右收埋 if(nIDEvent==2) { }
if(nIDEvent==6) {
- -
MoveWindow(p1.x,p1.y,m_W,m_H); p1.x+=10;
if(p1.x>desktopRect.Width()) { }
KillTimer(2); Set=2;
Si.left=LW-T; Si.top=Sj.top; Si.right=LW; Si.bottom=Sj.bottom;
17
p1.x-=10; if(p1.x
KillTimer(6);
}
//=============================3 if(nIDEvent==3) { }
if(nIDEvent==7) { }
//=========================1 if(nIDEvent==1) {
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y-=10;
if(p1.y+m_H+10
- -
18
往上收埋
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10;
if(p1.y>desktopRect.Height()) { }
KillTimer(3); Set=3;
Si.left=Sj.left; Si.top=LH-T; Si.right=Sj.right; Si.bottom=LH;
MoveWindow(p1.x,p1.y,m_W,m_H); p1.y-=10; if(p1.y
KillTimer(7);
往下收埋
KillTimer(1); Set=1;
Si.left=Sj.left; Si.top=0;
Si.right=Sj.right; Si.bottom=T;
}
}
if(nIDEvent==5) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.y+=10; if(p1.y>=30)
KillTimer(5);
}
//=======================4 往左收埋 if(nIDEvent==4) { MoveWindow(p1.x,p1.y,m_W,m_H); p1.x-=10; if(p1.x+m_W+10
Si.left=0; Si.top=Sj.top; Si.right=T; Si.bottom=Sj.bottom;
}
}
if(nIDEvent==8) {
}
if(p1.x>=30)
KillTimer(8);
(6)记分功能模块
此模块用来记录在游戏过程中,玩家所得的分数。并且一次性消去的方块行数越多,那么得到的分数也就越多。
实现此功能相关代码如下: {
G[object.x+a0][object.y+a1]=object.Type; G[object.x+a2][object.y+a3]=object.Type; G[object.x+a4][object.y+a5]=object.Type; G[object.x+a6][object.y+a7]=object.Type;
int i,j,k,p,q,o=0; for(i=0;i
if(G[i][1]>0||G[i][0]>0) { }
Runing=0;
AfxMessageBox(
void CGameDlg::KeepData()
//保存放好所在位置
for( j = N-1; j >= 0; j--) {
for(i=0,k=0;i
if(G[i][j]>0)
k++;
if(k==M) {
o++;
}
}
}
for(q=0;q
G[q][p]=G[q][p-1]; one(G[q][p],q,p);
for(q=0;q
Score+=100*o;
G[q][0]=0; one(G[q][p],q,p);
(7)鼠标控制功能模块
此模块也是本游戏的重点,玩家通过鼠标控制进行游戏。向上是变换图形,向下是很方块快速下落,向左是使方块向左移动,向右是很方块向右移动。 程序的具体实现部分如程序清单如下所示。
void CGameDlg::ChangeShape(OBJECT object)//转组 { do{
switch(object.group) {
int z[4][2] = {0}; int i,j,k; if(Runing==0) { }
OnDestroy(); return;
case1:ZZ=0;z[1][0]=1;z[1][1]=0;z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break; case 2:ZZ++; ZZ%=4;switch(ZZ) {
case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=-1;break; case 1:z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=-1;break; case 2:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break; case 3:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=1;break;
}
break;
case 3:ZZ++; ZZ%=4; switch(ZZ) {
case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break; case 1:z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=1;break; case 2:z[1][0]=-1;z[1][1]=0; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=1;break; case 3:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=1;z[3][0]=-1;z[3][1]=-1;break; } break;
case 4: ZZ++; ZZ%=2; switch(ZZ) {
case 1:z[1][0]=0;z[1][1]=-1; z[2][0]=0;z[2][1]=2;z[3][0]=0;z[3][1]=1;break; case 0:z[1][0]=1;z[1][1]=0; z[2][0]=2;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break; } break; case 5: ZZ++; ZZ%=2; switch(ZZ) {
case 1:z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=1;break; case 0:
z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=1;z[3][0]=1;z[3][1]=0;break; } break;
switch(ZZ) { case 1:
z[1][0]=0;z[1][1]=1; z[2][0]=1;z[2][1]=0;z[3][0]=1;z[3][1]=-1;break; case 0:z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=1;z[3][1]=1;break; } break; case 7: ZZ++; ZZ%=4; switch(ZZ) { case 0:
z[1][0]=0;z[1][1]=-1; z[2][0]=1;z[2][1]=0;z[3][0]=-1;z[3][1]=0;break; case 1:
z[1][0]=0;z[1][1]=1; z[2][0]=0;z[2][1]=-1;z[3][0]=1;z[3][1]=0;break; case 2:
z[1][0]=0;z[1][1]=1; z[2][0]=-1;z[2][1]=0;z[3][0]=1;z[3][1]=0;break; case 3:
z[1][0]=-1;z[1][1]=0; z[2][0]=0;z[2][1]=1;z[3][0]=0;z[3][1]=-1;break; } break; } int t[8];
for(i=0,k=0;i
t[k]=z[i][j]; k++; }
InPut(object,t);
}while(check2()||check1()); }
五 系统测试
1. 运行游戏,进入游戏界面
2. 开始游戏
(1) 选择游戏背景颜色
(2) 选择游戏级别
3. 游戏得分
4.收埋功能
5. 游戏结束
经过测试,该系统能够较好地满足游戏爱好者的需要,能够比较顺利的进行游戏。如利用鼠标进行图形的变换,移动和下落,在不需要此游戏界面在屏幕上显示时,我们可以对其进行收埋,即收藏,并可以从上,下,左,右四个方向时行收藏。当我们想结束游戏时,也可以直接点收埋按钮,结束游戏。
六 总结
经过我们努力的设计和开发,系统基本开发完毕。在本次课程设计中困难遇到不少,比如如何让方块随机产生,每个方块的颜色将如何对应,怎样实现方块形状的变换等待,由于设计时间较短,所以该系统还有许多不尽如人意的地方,如出错处理不够完善等多方面问题。在这次系统开发的过程中,我深深体会到了做一个系统,首先进行需求分析的重要性,了解了一个系统的制作,从功能分析到功能模块分析、与其他系统的关系,这些都有待以后进一步改进。经过这次的课程设计,在设计中不断完善中,我们知道要做好一件事首先要理清思路,弄懂到底要解决什么问题及相应的步骤,采取的方法和开发工具,以及对一些可能的程序异常或是常见问题的容错检测和修正方案等。对于软件系统的开发,跟应该按照软件工程的相关方法流程等规定进行。写代码并不是最首要的。应根据问题的特色详细的进行需求分析,确定概念模型,然后确定逻辑模型,选定开发工具和开发方案,同时注意文档的修订等。做到每一步思路清晰,有章可依等。
本次课程设计过程,使我们对VC++课程设计有了更深刻的认识。大大提高了模型规划、系统设计和软件编程的能力,自身的各方面的素质也得到了提高。同时也培养了我们的团队协作精神。这次课程设计不仅充实了我们的计算机专业知识,扩大了知识面,增强分析问题和解决问题的能力,也提高自学的能力与软件开发能力,为今后的工作打下了坚实的基础。
七 参考文献
[1]. 段钢 编著 加密与解密(第三版).电子工业出版社.2009年8月.
[2]. 赵树升 赵韶平. Windows信息安全原理与实现.清华大学出版社.2004年9月.
[3]. 赛奎春.Visual C++ 信息系统开发实例精选,2005
[4]. 杨永国. Visual C++ 6.0实用教程. 清华大学出版社,2004
[5]. 唐俊明. Visual C++ 6.0 编程实例与技巧. 高等教育出版,2002
[6]. 潘锦平. 软件系统开发技术. 西安电子科技大学出版社, 1997
[7]. 郑阿奇 丁有和 编著 Visual C++(第2版).机械工业出版社.2008年8月.
[8]. 侯俊杰 编著 深入浅出MFC(第2版).华中科技大学出版社.2008年1月.
[9]. 孙鑫 余安萍 编著 VC++ 深入浅出详解.电子工业出版社.2006年6月.