1、湘潭大学软件设计实践 副本软件设计实践报告单 位: 信息工程学院班 级: 计算机二班 学 号: 姓 名: 韩林波任课教师: 周维湘 潭 大 学2016年9月软件设计实践项目名称:俄罗斯方块一、 项目概述1、 概述作为家喻户晓的游戏,俄罗斯方块可谓是大名鼎鼎。不过,尽管它看起来比较简单,实际上对于我们新手而言确实是一个具有挑战性的项目。我们准备先简单的理解下俄罗斯游戏开发的大概算法和需要的知识,然后把这些知识组合开发俄罗斯方块。基本上实现俄罗斯方块游戏的控制和操作。并使用windows IDE搭建一个完整的windows应用程序。通过这个项目,提高自身的动手能力。2、 目的和用途我们在实际动手过
2、程中,将C+课程中所学的概念、理论和方法加以运用,按照C+程序设计的基本步骤,设计出了一个适当规模的程序来实现设计课程内容中的全部功能;设计了主控模块程序对给出的程序源代码给出了各部分的详细注释自己根据能力及需要添加相应功能模块,增强模拟系统功能。完整的项目内容也增强了我在课堂中的理论学习,为实习工作打下了基础。3、 需求说明利用Microsoft Visual stdio 2010编写一个windows窗口应用程序下的俄罗斯方块游戏。要求:(1)利用面向对象的方法编写。(2)能够记录游戏得分。(3)俄罗斯方块的多种类和旋转操作(4)信息提示时显示颜色变化。(5)暂停和重新开始4、 环境要求本
3、程序采用Microsoft Visual stdio 2010的专业版本进行编译。Microsoft Visual stdio 2010是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C+规范,有相当多的编程人员使用Microsoft Visual stdio 2010进行应用系统的开发。关于稳定性,经测试,本程序可以在windows操作系统中稳定运行,较为稳定。VC+是由Microsoft公司制作,基于WINDOWS环境的一款编程软件。由于WINDOWS操作
4、系统比起MS-DOS操作系统优越了许多。作为与之相搭配的编程软件自然也是功能非常强大,其最大的特点也就是可视化。不过在提供可视化的编程方式的同时,它采用了面向对象的程序设计方法,同传统的结构化程序设计方法相比,缩短了软件开发的周期,提高了软件的开发效率,使程序员可以更好地理解和管理庞大且复杂的程序。VC+中还集成了大量的最新技术,如ActiveX,COM等技术适合开发大型工程,这是相对于VB的一个优势。它的兼容性较好,还为用户提供了极为丰富的文档和范例。关于VC的参考资料也非常多,程序开发人员可以紧紧地把握住软件开发技术发展的方向,开发出功能强大的应用程序。二、 系统分析与设计1、 系统分析根
5、据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏、游戏的暂停继续、游戏控制和退出游戏。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。程序结构如图。 2、 系统设计根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加
6、快。同时可以响应Esc按键,提示是否退出程序。如图所示。 3、 模块/函数设计根据程序的结构,将俄罗斯方块需要实现的功能细化为相应的类成员函数。程序有三个类,一个Block类,作为程序的元素块组成其他元素。一个MyMap类,用于整个俄罗斯方块的地图相关操作。一个Manage类,用于整个游戏的相关操作。-Block类设计声明class CBlockpublic: CBlock(void); CBlock(void); void initBlock(); void _initNextBlock(); /初始化下一个方块 void SetBlockMove(bool isLeft); /方块移动 v
7、oid SetBlockDown(); void SetBlockChange(); /方块坐标变化public: BLOCK_POS * GetBlockHead() return m_blockDate; int GetBlockType() return m_blockType; int GetNextBlockType() return m_NextblockType; int GetBlockChangeType() return m_blockChangeType; BLOCK_POS * GetNextBlockHead() return m_NextblockDate;priv
8、ate: BLOCK_POS m_blockDateBLOCK_NUM; int m_blockType; int m_blockChangeType; BLOCK_POS m_NextblockDateBLOCK_NUM; int m_NextblockType; int m_NextblockChangeType;-MAP类设计声明(MyMap类)class CMyMappublic: CMyMap(void); CMyMap(void); void initMap(); /初始化地图 void DrawMap(HDC hdc); /绘制窗口地图 void SetMapVal(int ro
9、w,int col,int val); void SetMinMapVal(int row,int col,int val); int GetMapVal(int row,int col) return m_mapDaterowcol; /地图大小行列 int GetNum(); bool IsOver();/游戏是否结束 void SetBlockColor(int type); /地图块颜色 void SetNextBlockColor(int type);/下一个板块颜色private: int m_mapDateMAP_ROWMAP_COL; int m_NextMapDateBLOC
10、K_NUMBLOCK_NUM;private: RECT m_FillRect; HBRUSH m_BlockHr; HBRUSH m_FrameHr; HBRUSH m_RunBlockHr; HBRUSH m_MapHr; HBRUSH m_NextBlockHr;-Manager类设计声明(Manager类)class CManagepublic: CManage(HDC hdc); CManage(void); void initGame(); /初始化游戏 void UpdateGame(); /更新重新绘制游戏 void DrawGame(HDC hdc); /绘制游戏 void
11、MyHandleMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void addGameSpeed(); /增加游戏速度 int getPause(); /是否暂停游戏 void setPause(int n); /暂停游戏 int getplayNum(); /获取游戏分数 void updateScoreList(int s); /更新游戏分数 private: HDC m_BuffDc; HBITMAP m_BuffBitmap;private: CMyMap *m_pMap; CBlock *m_pBloc
12、k; float m_GameSpeed; char m_Key; int m_PlayNum; int pause; /暂停标志;三、 系统实现1、 关键模块/函数的实现A游戏界面俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。具体实现:#include StdAfx.h#include My
13、Map.hCMyMap:CMyMap(void) for(int i = 0; i MAP_ROW; i+) for(int j = 0; j MAP_COL; j+) m_mapDateij = MAP_NULL; memset(m_NextMapDate,0,sizeof(int) * BLOCK_NUM * BLOCK_NUM); m_FillRect.top = 0; m_FillRect.bottom = 0; m_FillRect.left = 0; m_FillRect.right = 0; m_BlockHr = NULL; m_FrameHr = NULL; m_RunBlo
14、ckHr = NULL; m_MapHr = NULL; m_NextBlockHr = NULL;CMyMap:CMyMap(void) if(m_BlockHr) DeleteObject(m_BlockHr); if(m_FrameHr) DeleteObject(m_FrameHr); if(m_RunBlockHr) DeleteObject(m_RunBlockHr); if(m_MapHr) DeleteObject(m_MapHr); if(m_NextBlockHr) DeleteObject(m_NextBlockHr);void CMyMap:initMap() for(
15、int i = 0; i MAP_ROW; i+) for(int j = 0; j MAP_COL; j+) if(i = 0 | i = MAP_ROW - 1 | j = 0 | j = MAP_COL - 1) m_mapDateij = MAP_FRAME; else m_mapDateij = MAP_NULL; memset(m_NextMapDate,0,sizeof(int) * BLOCK_NUM * BLOCK_NUM); m_FrameHr = CreateSolidBrush(RGB(127,127,127); m_BlockHr = CreateSolidBrush
16、(0x373737); m_MapHr = CreateSolidBrush(RGB(0,64,128);void CMyMap:DrawMap(HDC hdc) for(int i = 0; i MAP_ROW; +i) for(int j = 0; j MAP_COL; +j) switch(m_mapDateij) case MAP_RUNBLOCK: SetRect(&m_FillRect,200 + j * MAP_SIZE,15 + i * MAP_SIZE, 200 + (j + 1) * MAP_SIZE,15 + (i + 1) * MAP_SIZE); FillRect(h
17、dc,&m_FillRect,m_RunBlockHr); FrameRect(hdc,&m_FillRect,m_FrameHr); break; case MAP_BLOCK: SetRect(&m_FillRect,200 + j * MAP_SIZE,15 + i * MAP_SIZE, 200 + (j + 1) * MAP_SIZE,15 + (i + 1) * MAP_SIZE); FillRect(hdc,&m_FillRect,m_BlockHr); FrameRect(hdc,&m_FillRect,m_FrameHr); break; case MAP_FRAME: Se
18、tRect(&m_FillRect,200 + j * MAP_SIZE,15 + i * MAP_SIZE, 200 + (j + 1) * MAP_SIZE,15 + (i + 1) * MAP_SIZE); FillRect(hdc,&m_FillRect,m_MapHr); FrameRect(hdc,&m_FillRect,m_FrameHr); break; for(int i = 0; i BLOCK_NUM; +i) for(int j = 0; j 4; -i) bool isClear = true; for(int j = 1; j 4; -m) for(int n =
19、1; n MAP_COL - 1; +n) m_mapDatemn = m_mapDatem - 1n; i+; return num;void CMyMap:SetMinMapVal( int row,int col,int val ) m_NextMapDaterowcol = val;bool CMyMap:IsOver() bool isOver = false; for(int m = 1; m MAP_COL - 1; +m) if(m_mapDate4m != MAP_NULL) return true; return isOver;void CMyMap:SetBlockCol
20、or( int type ) if(m_RunBlockHr) DeleteObject(m_RunBlockHr); switch(type) case 0: m_RunBlockHr = CreateSolidBrush(RGB(255,0,0); break; case 1: m_RunBlockHr = CreateSolidBrush(RGB(0,255,0); break; case 2: m_RunBlockHr = CreateSolidBrush(RGB(0,0,255); break; case 3: m_RunBlockHr = CreateSolidBrush(RGB(
21、255,255,0); break; case 4: m_RunBlockHr = CreateSolidBrush(RGB(255,0,255); break; case 5: m_RunBlockHr = CreateSolidBrush(RGB(0,255,255); break; case 6: m_RunBlockHr = CreateSolidBrush(RGB(255,0,128); break; void CMyMap:SetNextBlockColor( int type ) if(m_NextBlockHr) DeleteObject(m_NextBlockHr); swi
22、tch(type) case 0: m_NextBlockHr = CreateSolidBrush(RGB(255,0,0); break; case 1: m_NextBlockHr = CreateSolidBrush(RGB(0,255,0); break; case 2: m_NextBlockHr = CreateSolidBrush(RGB(0,0,255); break; case 3: m_NextBlockHr = CreateSolidBrush(RGB(255,255,0); break; case 4: m_NextBlockHr = CreateSolidBrush
23、(RGB(255,0,255); break; case 5: m_NextBlockHr = CreateSolidBrush(RGB(0,255,255); break; case 6: m_NextBlockHr = CreateSolidBrush(RGB(255,0,128); break; B生成方块本程序中生成的方块有六种形状,每一种方块以shapeindex标记,在程序运行生成方块时,调用shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数make(),将先产生的赋给游戏当前方块,第二个赋给预览图方块
24、。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。具体如图所示。具体实现:void CBlock:_initNextBlock() m_NextblockType = rand() % 7; switch(m_NextblockType) case 0: m_NextblockChangeType = rand() % 2; switch(m_NextblockChangeType) case 0: m_NextblockDate0.row = 2; m_NextblockDate0.col = 0; m_NextblockDate1.row = 2; m_Nextblo
25、ckDate1.col = 1; m_NextblockDate2.row = 2; m_NextblockDate2.col = 2; m_NextblockDate3.row = 2; m_NextblockDate3.col = 3; break; case 1: m_NextblockDate0.row = 3; m_NextblockDate0.col = 1; m_NextblockDate1.row = 2; m_NextblockDate1.col = 1; m_NextblockDate2.row = 1; m_NextblockDate2.col = 1; m_Nextbl
26、ockDate3.row = 0; m_NextblockDate3.col = 1; break; break; case 1: m_NextblockDate0.row = 1; m_NextblockDate0.col = 1; m_NextblockDate1.row = 1; m_NextblockDate1.col = 2; m_NextblockDate2.row = 2; m_NextblockDate2.col = 1; m_NextblockDate3.row = 2; m_NextblockDate3.col = 2; break; case 2: m_NextblockChangeType = rand() % 4; switch(m_Nex
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1