基于vc的俄罗斯方块游戏系统设计与开发内容摘要:

ument()来获取其所对应的 Document 文档数据。 (三)文挡操作 由于 MFC 机制设计出文档类对象专门负责数据的 I/O 存取和数据的运算和操作等。 一般来说 ,数据运算是通过 Document 类里面的扩展功能来实现的 ,这样做可以 形成一种密集数据处理 ,达到方便易用和管理的好处。 对于一个文件而言 ,如果文件内对象的排列顺序是固定的 ,那么对于文件读和写从形式上只有使用的运算符的不同。 在 MFC 的文档 视图 框架结构中 ,一个文档的内部对象的构成往往是固定的 ,在这种情况下 ,写到文件中的对 象在文件中的布局也是固定的。 因此 8 CDocument 是利用其基类 CObject 提供的 Serilize()虚函数实现自动文档的读写操作的。 当用户在界面上选择文件菜单或打开文件 (ID_FILE_OPEN)时 ,CWinApp 派生类的 OnFileOpenO 函数将被自动调用 ,它通过文档模板创建或重用框架、文档和视图对象 ,并最终调用 CDocument: :OnOpenDocument()来读文件。 当用户选择菜单文件或文件保存 (ID_FILE_SAVE) ,选择文件或另存 (ID_FILE_SAVEAS) 时 ,是通过呼叫函数调用 CDocument: :OnSaveDocument() 实现的。 (四)文档 视图的关联 视图与文档和窗口的关联和协调工作可以从视图类对象的 OnDraw() 函数开始 ,找出关联的物件与关系。 在 MFC 机制中 ,关于 DocumentNiew 架构的项目工程和 OnDrawO 函数的驱动绘图触发的流程 : CDocument::UpdateAIIViews()CView::OnUpdate() CWnd: :Invalidate()OnPaint()OnDraw() 从流程可知当用于装载重要数据的 Document 类对象中的数据发生变化时 ,为了能让与其关联的各个视图实时表现出数据的特征性质 ,需要通知所有这些关联的视图进行更新重绘 , 而Document 类对象就拥有通知所有视图重绘的这样的一个功能函数。 UpdateAIIViews() 函数实现对各个视图类对象对数据。 显示的更新是通过文档类内部 CPtrlist类型的成员变量 m_viewList来维护和管理所有相关联视图对象 实现 的。 而对于该文档关联视图的增添 ,与将 DocumentTemplte 文档模 板添加到模板类表一样 , 也是有相应的处理函数 ,对于文档模板在模板管理列表的添加是在 App类的 Initlnstance()里面使用 AddDocTemplate() 函数去实现 ,而对于视图在视图列表的添加 , 可以使用 Document 类对象的成员函数 AddView() 去实现。 当与文档类关联的视图类收到文档类通过 UpdateAIIViews() 函数发出的更新重绘通知后 , 会触发视图类的 OnUpdate() 函数的实现。 9 四、 需求与算法分析 (一) 需求分析 功 能性需求如下: 随机给出不同的形状(长条形、 Z字形、反 Z形、田字形、 7字形、反 7形、 T字型)下落填充给定的区域,填满一条便消掉,记分 , 游戏可以设置难度,难度主要由方块的下降速度决定,下降速度越大难度越大 ,若在游戏中各形状填满了给定区域,为输者。 如下表 为游戏功能性需求表。 表 功能 简介 顺时针旋转 顺时针旋转转块 逆时针旋转 逆时针旋转转块 绘制转块 指定画板上绘制转块 擦除矩形 指定画板上擦除矩形 右移动 右移动转块 左移动 左移动转块 下移动 下移动转块 丢下转块 在画板上丢下转 块 计分 根据用户消去的行数计分 作为玩家,玩家可以控制难度,查看帮助等,对于操作性的需求如下: 玩家可以自己来控制方块下落的速度。 玩家可以自己来控制游戏的难度。 玩家可以看到游戏的积分。 对本游戏有帮助说明和作者介绍等 良好的用户界面,有 提示 显示和分数显示。 将整体界面分为三部分:左侧半部分用来存放俄罗斯方块,是游戏的活动区,用户操作的图形变化在这个主界面区完成。 右上侧部分显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。 右侧 下半部分用来显示用户的分数和当前等级,以便让用户有成就感增加可玩性。 10 如图为整体的界面设计需求效果,将整个界面分成了三部分,显得简易清爽,作为用户界面让玩家感觉比较舒服得体。 如 下 图 : 图 (方块)需求 良好的方块形状设计,绘制七种常见的基本图形(长条形、 Z字形、反 Z形、田字形、 7字形、反 7形、 T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。 为了使游戏更加美观更具可玩性,在绘制方块的过程中不采用默认的绘制方式,而是用经过处理的图片效果,这样让组成的方 块更加 美观,同时彩色的方块也让人赏心悦目,增加了游戏的可玩性。 下图 就是用来拼接方块颜色的样板色。 这种带有实体效果的方块比一般的二维方块更具立体效果,更美观,会更吸引玩家。 如 下 图 : 图 (二) 算法分析 对于方块在某一瞬间的位置标识,我们采用一个 42 的小数组标识出来 ,即用 4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用 4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值 (x,y),而每个方块按照 从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号。 如图 : 11 图 方块表示方法,即四个小方块的坐标设定:其中一个方块是原点,坐标为 (0,0);右侧方块坐标 (1,0),下面的方块坐标 (0,1),以此类推。 如下为 程序中定义的各种方块的数据结构定义。 图 ,从开始判断是否到底底部,到达则做销行操作,然后生成下一个下坠物,将新的下坠物代替旧的下一个下坠物,将旧的下坠物当做当前的下坠物,下到底部判断是否做销行操作,然后判断游戏是否结束,未结束则继续新一轮的生产方块,若方块达到了顶部,占满了空间则游戏结束。 俄 罗斯方块流 程如下 : (x0,y0) (x1,y1) (x2,y2) (x3,y3) 2 3 0 1 (x0,y0) (x1,y1) (x2,y2) (x3,y3) 0 1 2 3 12 图 到达底部 游戏结束 到达底部 结束 销行操作 生成下一个下坠物 将新生的下坠物代替旧的 “下一 个下坠物 “ 将旧的 “下一个下坠物 ”用作当前 下坠物 销行操作 游戏结束处理 下降一个单位 开始 13 五 、 俄罗斯方块游戏的 实现 (一) 窗体 设计 窗体的 设计 , 包括 工具栏的实现,按钮长度、宽度、数目、图标的设置,文字的设置 等。 程 序 调用 OnCreate函数创建窗口,然后设置窗口。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == 1) return 1。 //工具栏的实现 CImageList img。 CString str。 if (!(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)) { return 1。 } //设置按钮的宽度和长度 ().SetButtonWidth(40, 100)。 //改变属性 (0, TBSTYLE_FLAT |CBRS_TOOLTIPS | TBSTYLE_TRANSPARENT|TBBS_CHECKBOX )。 //设置按钮数为 6 (NULL,4)。 // 添加图像 //设置 热 /hot状态的的位图 (28, 28, ILC_COLOR8|ILC_MASK,2,2)。 (RGB(0, 0, 102))。 //顺序增添按键 的图标 (AfxGetApp()LoadIcon(IDI_ICON_START))。 (AfxGetApp()LoadIcon(IDI_ICON_PAUSE))。 (AfxGetApp()LoadIcon(IDI_ICON_END))。 (AfxGetApp()LoadIcon(IDI_ICON_SET))。 ().SetHotImageList(amp。 img)。 ()。 //设置 冷 /cold状态的位图 (32, 32, ILC_COLOR8|ILC_MASK, 2,2)。 (::GetSysColor(COLOR_BTNFACE))。 //顺序增添按键的图标 (AfxGetApp()LoadIcon(IDI_ICON_START))。 (AfxGetApp()LoadIcon(IDI_ICON_PAUSE))。 (AfxGetApp()LoadIcon(IDI_ICON_END))。 14 (AfxGetApp()LoadIcon(IDI_ICON_SET))。 ().SetImageList(amp。 img)。 ()。 // 设置文字 (0, ID_GAME_START, TBSTYLE_BUTTON, 0)。 (0, 开始 )。 (1, ID_GAME_PAUSH, TBSTYLE_BUTTON, 1)。 (1, 暂停 )。 (2, ID_GAME_END, TBSTYLE_BUTTON,2)。 (2, 结束 )。 (3, ID_GAME_OPTION, TBSTYLE_BUTTON,3)。 (3, 设置 )。 CRect rectToolBar。 //设置按钮的大小 ((), CSize(32,32))。 (CBRS_ALIGN_ANY)。 EnableDocking(CBRS_ALIGN_ANY)。 DockControlBar(amp。 m_wndToolBar)。 return 0。 } (二) 定义俄罗斯方块数据结构 俄罗斯方块通过坐标来实现,其数据结构如下: //每四个点,表示一种方块 //(一维,二维都可以做 ) POINT gl_square[28]={ //方形 {0,0},{1,0},{0,1},{1,1}, //长条 {0,1},{0,0},{0,1},{0,2}, //Z {1,1},{0,1},{。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。