首页 毕业设计论文 俄罗斯方块游戏

毕业设计论文 俄罗斯方块游戏

举报
开通vip

毕业设计论文 俄罗斯方块游戏毕业设计论文 俄罗斯方块游戏 毕业设计(论文)正文 题 目 俄罗斯方块游戏 专 业 班 级 姓 名 学 号 指导教师 职 称 俄罗斯方块游戏 摘要: 在现代信息高速发展的时代,电子游戏已经深入了人们的日常生活,成为了老少咸宜的娱乐方式,但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的艺术,设计,声音和软件,所以并不是人人皆知,直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如汽车,家电等传统行业,也正因为如此,游戏人才的教育培养远落后于行业的发展。 俄罗斯方块是...

毕业设计论文  俄罗斯方块游戏
毕业 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 论文 俄罗斯方块游戏 毕业设计(论文)正文 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目 俄罗斯方块游戏 专 业 班 级 姓 名 学 号 指导教师 职 称 俄罗斯方块游戏 摘要: 在现代信息高速发展的时代,电子游戏已经深入了人们的日常生活,成为了老少咸宜的娱乐方式,但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的艺术,设计,声音和软件,所以并不是人人皆知,直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如汽车,家电等传统行业,也正因为如此,游戏人才的教育培养远落后于行业的发展。 俄罗斯方块是一个老少咸宜的小游戏,它实现有四个正方形的色块组成,然后存储于一个数组的四个元素中,计算机随机产生七种不同类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键进行向左,向右,向下,翻转操作。然后程序根据这七种方块折叠成各种不同的类型。 论文描述了游戏开发的背景,意义,算法分析,功能实现,功能测试。以C++为开发语言进行设计与实现。 关键词:电子游戏,算法,C++,测试 The Russian square piece Abstract : In the era of high-speed development of electronic of information, computer game has enter people’s daily life, become an amusement adapt to old and young. But game design is a combination of fast-moving technology ,the complexity of integrating design,art,audio and software into a single production,so this thechnology isn’t known by everyone .up-to-date,there are few people work at game design all the same,whereas,thedevelopment of game industry more faster than traditional industry as home appliances and automobile,by the reason of this situation,the education and training of person with ablity of game design drop behind the development of game industry. The Russian square piece is a get-away drama with all proper old young ,it carry out to be constitute by four pieces of colours of exact square piece ,then save in one four chemical elements of the piece set ,random creation dissimilarity of calculator seven the square piece of the category type ,control it according to the calculator clock in certain time continuously creation , the customer is inside out according to four directions key control of the keyboard ,to left ,rightwards and get down ,(the realization of the control key is to be carry out by the event handing of the direction key of the keyboard) Then the procedure pileds according to these seven kinds of square pieces various different model. The thesis has described the game history ,has developed this game history ,has developed this game environment, development significance of game .Knowledge abiding by a software engineering ,definition begins from software problem ,proceed to carry out feasibility study ,need analysis ,essentials design,the at last has carried out a testing on the software engineering knowledge hierarchy . The computer games design and practice are designed o eclipse developing platform with C++ developing instrument ,under Microsoft Windows XP system this time. Key Words: electronic game calculate way C++ test 目 录 1引言 ....................................................................................................................... 1 1.1课题背景 ..................................................................................................... 1 1.2毕设意义 ..................................................................................................... 2 2需求与算法分析 .................................................................................................... 3 2.1需求分析 ..................................................................................................... 3 2.1.1 游戏需求 ......................................................................................... 3 2.1.2游戏界面需求 ................................................................................... 4 2.1.3 游戏形状(方块)需求 ...................................................................... 4 2.2算法分析 ..................................................................................................... 5 2.2.1定义方块的数据结构 ....................................................................... 5 2.2.2俄罗斯方块 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 ............................................................................... 6 3系统功能实现 ........................................................................................................ 8 3.1产生主窗口 ................................................................................................. 8 3.2定义俄罗斯方块数据结构 .......................................................................... 9 3.3游戏的主逻辑 ............................................................................................10 3.4销行功能实现 ............................................................................................12 3.5中断操作流程的实现 .................................................................................14 3.6变形的实现 ................................................................................................16 3.7 游戏区域绘图的实现 ................................................................................17 3.8 游戏方块绘制 ...........................................................................................21 3.9 烟花燃放功能 ...........................................................................................23 4功能测试 ..............................................................................................................27 4.1测试环境 ....................................................................................................27 4.2图像功能测试 ............................................................................................27 4.3销行和计分功能测试 .................................................................................30 4.4速度功能测试 ............................................................................................32 5总结 ......................................................................................................................34 [参考文献] .............................................................................................................35 致谢 .........................................................................................................................36 毕业设计 俄罗斯方块的程序设计 1引言 计算机游戏产业在随着网络的发展有了长足的发展。游戏最早起源于纯文字的交 互游戏MUD,MUD是英文Multi-user Dungeons的缩写。纯文字交互,顾名思义,是? ? 一纯文字的形式来进行游戏。即,所有的场景描述、物品的样子、所有人的行动、时? ? 间的描述都是用文字的方式表达的。总之,文字MUD是一个很需要想象力的游戏形式, ? 需要从文字转化成玩家自己脑海中的现实场景。 ? ? 随着电子元器件的发展,电子产品迅速发展。掌上游戏机和电视游戏机在80年? ? 代和90年代风靡一时,此时由苏联人Alex Pajitnov制作的游戏俄罗斯方块在掌上? 游戏机和电视游戏机上流行,其造成的轰动和经济价值成为游戏史上的大事。所以本? ? 文通过用C++实现俄罗斯方块学习游戏的整个设计和测试过程,学习用基于Windows? 装 的游戏程序设计。 ? ? ? 1.1课题背景 ? ? 俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存订 ? 储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟? ? 控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右? ? 和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七 线 种方块堆叠成各种不同的模型。 ? ? 基于Windows的游戏设计有很多方式,如基于java跨平台的设计,基于.net平? ? 台的设计和基于MFC的设计,三种设计各有优缺。基于java的设计能够充分运用java ? 跨平台的特性,便于移植,可以做到一次代码在不同环境下的运行,从而大大提高可? ? 移植性,便于在移动设备上运行,但是基于java的设计由于运行在虚拟机上,效率? ? 比较低。基于.net平台的设计可以利用.net平台提高的接口大大简化设计过程,然? ? 而其通用性不好,需要.net平台支持,在执行效率上也不如MFC程序。基于MFC的? 程序设计具有执行高效的特点,跟windows的契合比较好,但不具有跨平台能力。 ? 相比三种设计方案,为了能够在Windows平台上以更好的性能运行,本文采用 VC++基于MFC的设计,来完成俄罗斯方块的游戏。 第 1 页 毕业设计 1.2毕设意义 此次毕设通过用C++设计与实现俄罗斯方块游戏。包括系统的需求分析;系统总 框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现; 游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;以及游戏的测? ? 试和改进。 ? ? 通过此次毕业设计,我对软件设计的过程有了清晰的认识,通过编写游戏的各个 ? 方面工作学习了设计思想,程序架构,数据结构和算法,同时也对windows程序设计? ? 特别是基于MFC的程序设计有了直观的认识。通过游戏的测试学习到了常用的测试过? ? 程,测试方法。 ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 2 页 毕业设计 2需求与算法分析 2.1需求分析 2.1.1 游戏需求 ? ? ? 功能性需求如下:随机给出不同的形状(长条形、Z字形、反Z形、田字形、7? ? 字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,若同时消 ? 去两行以上则会放烟花来庆祝,游戏可以设置难度,难度主要由方块的下降速度决定,? ? 下降速度越大难度越大,若在游戏中各形状填满了给定区域,为输者。如下表(表? ? 2.1)为游戏功能性需求表。 ? ? 功能 简介 ? 顺时针旋转 顺时针旋转转块 装 ? 逆时针旋转 逆时针旋转转块 ? ? 绘制转块 指定画板上绘制转块 ? ? 擦除矩形 指定画板上擦除矩形 订 ? 右移动 右移动转块 ? 左移动 左移动转块 ? ? 下移动 下移动转块 ? 线 丢下转块 在画板上丢下转块 ? ? 燃放烟花 在面板内根据一次得分多少燃放烟 ? 花 ? ? 计分 根据用户消去的行数计分 ? ? 表2.1示例 ? ? 作为玩家,玩家可以控制难度,查看帮助等,对于操作性的需求如下: ? ? 玩家可以自己来控制方块下落的速度。 ? ? ? 玩家可以自己来控制游戏的难度。 ? ? 玩家可以看到游戏的积分。 ? 对本游戏有帮助说明和作者介绍等 第 3 页 毕业设计 2.1.2游戏界面需求 良好的用户界面,有提示显示和分数显示。让方块在一定的区域内运动和变形, 该区域用一种颜色表明,即用一种颜色作为背景,最好设为黑色。还需用另一种颜色把 黑色围起来,宽度适中,要实现美感。将整体界面分为三部分:左侧半部分用来存放? ? 俄罗斯方块,是游戏的活动区,用户操作的图形变化在这个主界面区完成。右上侧部? ? 分显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。右 ? 侧下半部分用来显示用户的分数和当前等级,以便让用户有成就感增加可玩性。 ? ? 如图为整体的界面设计需求效果,将整个界面分成了三部分,显得简易清爽,作? ? 为用户界面让玩家感觉比较舒服得体。如图2.1所示: ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? 图2.1示例 ? ? ? 2.1.3 游戏形状(方块)需求 ? ? ? 良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田 字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时 针变形,一般为逆时针。 第 4 页 毕业设计 为了使游戏更加美观更具可玩性,在绘制方块的过程中不采用默认的绘制方式, 而是用经过处理的图片效果,这样让组成的方块更加美观,同时彩色的方块也让人赏 心悦目,增加了游戏的可玩性。下图(图2.2)就是用来拼接方块颜色的样板色。 ? ? 图2.2示例 ? ? 由图可见这种带有实体效果的方块比一般的二维方块更具立体效果,更美观,会? ? 更吸引玩家。 ? ? ? 2.2算法分析 ? ? ? 2.2.1定义方块的数据结构 ? 装 对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4? ? 个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间? ? 存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空 ? 间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且订 ? 在编号过程中对于同一列的方块实行从上到下进行编号。如图2.3所示: ? ? (x,y) 00? (x,y) 00 ? 2 (x,y) 11(x,y) 线 11 3 0 1 ? (x,y) 22 0 2 (x,y) 22? 3 1 ? (x,y) 33(x,y) 33 ? ? ? ? 方块编号 ? ? 图2.3示例 ? ? 方块表示方法,即四个小方块的坐标设定:其中一个方块是原点,坐标为(0,0); ? 右侧方块坐标(1,0),下面的方块坐标(0,1),以此类推。 如下为程序中定义的各种方? 块的数据结构定义。 第 5 页 毕业设计 2.2.2俄罗斯方块流程 俄罗斯方块流程(图2.4): 开始 ? ? ? 到达底部 ? ? ? 销行操作 ? ? ? ? 生成下一个下坠物 ? 下降一个单位 ? ? 装 将新生的下坠物代替旧的“下一 ? 个下坠物“ ? ? ? ? 将旧的“下一个下坠物”用作当前 订 下坠物 ? ? ? 到达底部 ? ? 线 ? 销行操作 ? ? ? ? 游戏结束 ? ? ? ? ? 游戏结束处理 ? ? ? 结束 图2.4示例 第 6 页 毕业设计 如图中所示是俄罗斯方块的处理流程,从开始判断是否到底底部,到达则做销 行操作,然后生成下一个下坠物,将新的下坠物代替旧的下一个下坠物,将旧的下 ? 坠物当做当前的下坠物,下到底部判断是否做销行操作,然后判断游戏是否结束, ? 未结束则继续新一轮的生产方块,若方块达到了顶部,占满了空间则游戏结束。 ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 7 页 毕业设计 3系统功能实现 3.1产生主窗口 通过InitInstance函数来初始化窗口的各个信息,包括窗口的位置,位图信息? ? 按钮和时钟初始化等。InitInstance函数的实现如下,程序首先调用CreatWindow? 函数创建初始窗口句柄,然后设置窗口显示坐标,将窗口居中,用空的位图来初始? ? 化使界面内都是是空的。定义好窗口和时钟最后讲窗口显示出来。 ? ? BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) ? { ? HWND hWnd; ? int x,y; ? hInst = hInstance; // Store instance handle in our global variable ? ? hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 装 ? CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); ? if (!hWnd) ? { ? return FALSE; ? } 订 //窗口居中, 高度包含标题栏的30 ? x=GetSystemMetrics(SM_CXSCREEN); ? ? y=GetSystemMetrics(SM_CYSCREEN); ? MoveWindow(hWnd,(x-GAMEWIDTH)/2,(y-GAMEHEIGHT-30)/2,GAMEWIDTH,GAME ? HEIGHT+30,false); 线 ? //设置dc ? hdcwindow=GetDC(hWnd); ? hdcmem=CreateCompatibleDC(hdcwindow); ? ? hdccanvas=CreateCompatibleDC(hdcwindow); ? //用空位图初始化DC ? hmapnull=CreateCompatibleBitmap(hdcwindow,GAMEWIDTH,GAMEHEIGHT); ? SelectObject(hdccanvas,hmapnull); ? SelectObject(hdcmem,hmapnull); ? //位图初始化 ? bmStart.Init(hInstance,IDB_BITMAP_START); ? ? bmStart.SetDevice(hdccanvas,hdcmem); bmStart.InitSizeList(1,PICW,PICH); bmBack.Init(hInstance,IDB_BITMAP_BACK); bmBack.SetDevice(hdccanvas,hdcmem); bmBack.InitSizeList(1,200,200); 第 8 页 毕业设计 bmSquare.Init(hInstance,IDB_BITMAP_SQUARE); bmSquare.SetDevice(hdccanvas,hdcmem); bmSquare.InitSizeList(5,22,22); bmBomb.Init(hInstance,IDB_BITMAP_BOMB); bmBomb.SetDevice(hdccanvas,hdcmem); bmBomb.InitSizeList(5,22,22,1); ? ? ? //按钮 ? mybutton.Init(hInstance,IDB_BITMAP_BUTTON); ? mybutton.SetDevice(hdccanvas,hdcmem); ? mybutton.InitButton(6,BtRect);//按钮 ? myclock.Init(hWnd,TIME_INFO);//时钟 ? srand((unsigned)time(NULL));//初始化随机函数 ? ? //////////// 显示窗口 ? ShowWindow(hWnd, nCmdShow); ? UpdateWindow(hWnd); ? return TRUE; 装 } ? ? ? 3.2定义俄罗斯方块数据结构 ? ? 俄罗斯方块通过坐标来实现,其数据结构如下: 订 //每四个点,表示一种方块 ? //(一维,二维都可以做) ? ? 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,0},{1,0}, ? ? //Z ? {-1,1},{0,1},{0,0},{1,0}, ? //L ? {-1,-1},{-1,0},{0,0},{1,0}, ? //L ? {-1,0},{0,0},{1,0},{1,-1}, ? // ? ? {-1,0},{0,0},{1,0},{0,-1}, }; 第 9 页 毕业设计 3.3游戏的主逻辑 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此 需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。 而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为? ? 被占用状态来确定,利用数组记录1,7种下坠物的1,4种形态的接触面信息。 ? ? 统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量 ? 的值决定分数的多少,程序统计分数是:消一行得10分,同时消2行得30分,消? ? 得3行得60分,消得4行得100分。如果总分数达到过关条件就过关,改变游戏速? ? 度。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。如图3.1所示: ? ? 堆积方块,判断接触面 ? 状态及是否得分 ? 装 ? ? ? 1.判断行满、处理销行、? 堆积方块向下移动 ? 订 ? ? ? ? 2.统计分数 ? 线 ? 关数增加,游戏速 ? 度将变快。调用游 是 ? 戏速度模块增加游判断是否过关 ? 戏速度 ? ? 否 ? ? ? ? ? ? 视图重绘(InvalidateView()) ? 图3.1示例 第 10 页 毕业设计 以下为实际代码中游戏的主要逻辑检测函数Checkgame的代码部分,根据系统 的状态确定是否生产新的方块还是移动当前方块直到其落到底部判断是否该销行, 进行下次的循环。 if(INVALID==squareNow.id) ? { ? //如果没有当前移动的方块 ? ? //生成当前方块 ? ? memcpy(&squareNow,&squareNext,sizeof(squareNext)); ? ? squareNow.pos.x=4; ? squareNow.pos.y=0; ? ? iTime=0; ? ? 装 if(!CanMove()) ? ? { ? ? //如果新生成的方块无法移动,失败 ? 订 iState=GAME_FAIL; ? myclock.ReStart(TIME_FAIL); ? ? } ? ? 线 //生成下一个 ? ? CreateNext(); ? ? } ? ? else ? { ? ? //移动当前方块 ? ? iTime++; ? if(iTime>=12-iSpeed) ? { iTime=0; if(!CanMove()) 第 11 页 毕业设计 { //清除当前方块 squareNow.id=INVALID; //写入数组 ? PutSpare(); ? } ? ? else ? ? { ? ? squareNow.pos.y++; ? } ? ? } ? ? } 装 ? ? 3.4销行功能实现 ? ? 当俄罗斯方块占满了空间内的一块或者多行时,系统就该消去一行,同时给用? 订 户相应的得分,当用户得分达到20分以上时则根据分数等级给予用户烟花表演以? ? 示鼓励。用户游戏空间有19行,10列,每次判断销行时从最低行开始判断是否十 ? 列都被俄罗斯方块填满,填满则清楚该行然后循环判断。其代码如下。 ? ? void GAMEBOX::ClearRow() 线 ? { ? ? int i; ? int m,n;//行列 ? ? int iNum; ? ? int iScoreRow[]={0,10,30,60,100};//分值,1行10分,2行30,3行60,4行? 100 ? ? int iRow;//消去多少行 ? ? iRow=0; //第19行,是最底一行 for(m=19;m>0;m--) 第 12 页 毕业设计 { iNum=0; for(n=0;n<10;n++) { ? iNum+=gamemap[m][n]; ? } ? ? //消去一行 ? ? if(iNum==10) ? ? { ? iRow++;//统计消去多少行 ? ? ? ? for(i=m;i>0;i--) 装 { ? ? //移动 ? ? memcpy(gamemap[i],gamemap[i-1],10*sizeof(int)); ? 订 } ? memset(gamemap[0],0,10*sizeof(int)); ? ? m++;//重要,再次检测这一行 ? ? } 线 if(iNum==0) ? ? { ? ? //空行,不再判断 ? ? break; ? } ? ? } ? ? //以下代码会根据消去的行数,判断是否然后烟花,以及燃放烟花的级数。 ? iScore+=iScoreRow[iRow];//增加分数 ? if(iRow>=2) { //消除两行以上 第 13 页 毕业设计 BeginBomb(iRow); } } ? ? 3.5中断操作流程的实现 ? ? ? (1)处理键盘事件 ? 关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并? ? 重写来实现,下面是对该处理函数KeyProc。根据输入的字符选择适当的操作。 ? ? void GAMEBOX::KeyProc(int iKey) ? { ? ? //只有游戏进行中,才响应按键 装 ? if(iState!=GAME_IN) ? ? return; ? ? 订 switch(iKey) ? ? { ? case VK_UP: ? ? Rotate(); 线 ? break; ? ? ? case VK_LEFT: ? ? MoveLeft(); ? ? break; ? ? ? case VK_RIGHT: ? ? MoveRight(); break; case VK_DOWN: 第 14 页 毕业设计 MoveDown(); break; 以上就是在输入上下左右键时要做的操作,程序会根据键盘输入选择是向哪移 动。以下为一些功能键输入后的反应,如输入F2可燃放2级的烟花,输入F3可燃放 ? 3级烟花,输入F4可燃放4级烟花。按F12可以加快游戏的速度,按ESC可以退回 ? 到主菜单然后退出游戏。 ? ? case KEY_F2: ? ? BeginBomb(2); ? break; ? ? ? ? case KEY_F3: ? ? BeginBomb(3); 装 break; ? ? ? ? case KEY_F4: ? 订 BeginBomb(4); ? break; ? ? ? ? case KEY_F12: 线 if(iSpeed<9) ? ? { ? ? iSpeed++; ? ? } ? break; ? ? ? ? case VK_ESCAPE: ? iState=GAME_MENU; ? break; default: 第 15 页 毕业设计 break; } } 3.6变形的实现 ? ? ? 当按下向上键时,将会执行方块变化事件(change())。常见的方块有7种(长条? ? 形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有图形都是用两个一维 ? 数组来统计它的横坐标和纵坐标,每个方块有4种不同的变化形状。 ? ? void GAMEBOX::Rotate() ? ? { ? int i; ? ? int m,n;//行列 装 ? int iCan=1; ? ? int temp; ? ? 订 //正方形不旋转 ? ? if(ID_SQAURE==squareNow.id) ? return; ? ? 线 ? for(i=0;i<4;i++) ? ? { ? //旋转后的小块坐标 ? ? //旋转公式(x,y)旋转90度变为(-y,x),再加上当前位置 ? ? m=squareNow.pos.y+squareNow.chip[i].x; ? n=squareNow.pos.x-squareNow.chip[i].y; ? ? if( n<0 || n>9 ? ? || m<0 || m>19 || VALID==gamemap[m][n]) { iCan=0; 第 16 页 毕业设计 break; } } ? if(iCan) ? { ? ? for(i=0;i<4;i++) ? ? { ? ? temp=squareNow.chip[i].x; ? //旋转后的小块坐标 ? ? squareNow.chip[i].x=-squareNow.chip[i].y; ? ? squareNow.chip[i].y=temp; 装 } ? ? } ? ? } ? 订 ? ? 3.7 游戏区域绘图的实现 ? ? ? 首先将外部位图文件square.bmp中的位图动态导入(映射)到内存位图里面,根线 ? 据游戏区域中的二维数组中的内部数据将所有数据状态中为被占用状态的小方块区? ? 域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝 ? 到与屏幕关联的设备环境中,从而达到屏幕的显示。程序中通过MYBITMAP类来实现? ? 游戏区域的绘图工作,以下代码为MYBITMAP类中显示函数Show和ShowNoBack函数。 ? ? void MYBITMAP::Show(int id,int x,int y) ? { ? ? SelectObject(hdcsrc,hBm); ? ? BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id],SRCCOPY); } 第 17 页 毕业设计 void MYBITMAP::ShowNoBack(int id,int x,int y) { SelectObject(hdcsrc,hBm); ? BitBlt(hdcdest,x,y,wlist[id],hlist[id], ? hdcsrc,0,ylist[id]+hlist[id],SRCAND); ? ? ? ? BitBlt(hdcdest,x,y,wlist[id],hlist[id], ? ? hdcsrc,0,ylist[id],SRCPAINT); ? } ? ? 游戏的主要逻辑类GAMEBOX中定义了游戏的基本数据状态结构,用来定义游戏的? ? 显示状态,游戏中根据显示状态的不同显示不同的界面程序。 装 //游戏数据 ? ? //基本数据 ? ? enum eGameState{ ? 订 GAME_INFO, ? GAME_MENU, ? ? GAME_MENU_HELP, ? ? GAME_MENU_SET, 线 GAME_LOAD, ? ? GAME_IN_PRE, ? ? GAME_IN, ? ? GAME_WIN, ? GAME_ITEM, ? ? GAME_FAIL, ? ? GAME_PASS ? }; ? 根据上面定义的游戏状态值,在GAMEBOX类中用类方法Show来显示不同状态下 的程序,其具体实现如下,程序用Switch语句判断当前的状态值,然后根据状态进 行相应的操作。 第 18 页 毕业设计 void GAMEBOX::Show() { int i; ? ? switch(iState) ? ? { ? ? case GAME_INFO: ? ? //黑色背景 ? SelectObject(hdccanvas,hBrush); ? ? SelectObject(hdccanvas,hPen); ? ? Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); 装 bmStart.Stretch(PIC0,30,100,GAMEWIDTH-60,GAMEHEIGHT-200); ? ? //第一秒 从左至右显示图片 ? ? if(iAni<=25) ? 订 { ? i=25-iAni; ? ? Rectangle(hdccanvas,GAMEWIDTH-i*i,0,GAMEWIDTH,GAMEHEIGHT);//按平方公? ? 式变化 线 } ? ? break; ? ? ? ? case GAME_MENU: ? bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); ? ? //显示按钮 ? ? mybutton.HideAll(); ? mybutton.Show2(BT_START); ? mybutton.Show2(BT_HELP); mybutton.Show2(BT_SET); break; 第 19 页 毕业设计 case GAME_MENU_HELP: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); mybutton.HideAll(); ? mybutton.Show2(BT_OK); ? ShowHelp(); ? ? break; ? ? ? ? case GAME_MENU_SET: ? bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); ? ? mybutton.HideAll(); ? ? mybutton.Show2(BT_LEFT); 装 mybutton.Show2(BT_RIGHT); ? ? mybutton.Show2(BT_OK); ? ? ShowSet(); ? 订 break; ? 当游戏进入界面后,游戏界面的显示如下将游戏界面分成3个部分,用黑色部分? ? 显示背景,然后在右上角显示下一次产生的俄罗斯方块,右下角显示分数和速度等。 ? ? case GAME_IN: 线 //黑色背景 ? ? SelectObject(hdccanvas,hBrush); ? ? SelectObject(hdccanvas,hPenWhite); ? ? Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); ? // ? ? Rectangle(hdccanvas,20,18,244,462); ? ? Rectangle(hdccanvas,LEFT_RECT_X,LEFT_RECT_Y,242,460); ? //右上角 ? Rectangle(hdccanvas,RIGHT_RECT_X,RIGHT_RECT_Y, RIGHT_RECT_X+132, RIGHT_RECT_Y+132); 第 20 页 毕业设计 ShowInfoNow();//分数,速度文字 ShowSquare();//方块 ShowBomb();//特效 break; ? ? 3.8 游戏方块绘制 ? ? ? 一个游戏方块被定义成一个MYBITMAP的对象,在俄罗斯方块定义位图对象 ? bmSquare,然后通过对bmSquare的相关操作来达到达到绘图的目的,GAMEBOX类通? ? 过调用ShowSquare来显示方块,首先显示在右上角的方块,定义好原始坐标后,通? ? 过方块位图对象bmSqure调用MYBITMAP类的show方法绘制方块坐标。 ? ? ? void GAMEBOX::ShowSquare() 装 ? { ? ? int i; ? int x0,y0;//坐标原点 ? 订 int m,n; ? ? ? //右上角显示下一个 ? ? x0=RIGHT_RECT_X+2*ITEM_EDGE; 线 ? y0=RIGHT_RECT_Y+2*ITEM_EDGE; ? ? ? for(i=0;i<4;i++) ? ? { ? ? bmSquare.Show(squareNext.icolor, ? x0+squareNext.chip[i].x*ITEM_EDGE, ? ? y0+squareNext.chip[i].y*ITEM_EDGE); ? ? } 绘制完右上角的方块后则继续绘制当前移动的方块,定义方块的初始坐标,判断 方块是否在界面内如果方块在界面内则显示。 //当前移动的方块 第 21 页 毕业设计 x0=LEFT_RECT_X+squareNow.pos.x*ITEM_EDGE; y0=LEFT_RECT_Y+squareNow.pos.y*ITEM_EDGE; if(squareNow.id!=INVALID) ? { ? for(i=0;i<4;i++) ? ? { ? ? //方块在界面内,则显示 ? ? if(squareNow.pos.y+squareNow.chip[i].y>=0) ? { ? ? bmSquare.Show(squareNow.icolor, ? ? x0+squareNow.chip[i].x*ITEM_EDGE, 装 y0+squareNow.chip[i].y*ITEM_EDGE); ? ? } ? ? } ? 订 } ? 最后在整个界面内,20行,10列根据当前的gamemap确定每一个方块格是否该? ? 绘图,如果该相应的map中需要绘制则绘制其图像。 ? ? //已经放置的方块 线 for(m=0;m<20;m++) ? ? { ? ? for(n=0;n<10;n++) ? ? { ? if(VALID==gamemap[m][n]) ? ? { ? ? bmSquare.Show(PIC0, ? LEFT_RECT_X+n*ITEM_EDGE, ? LEFT_RECT_Y+m*ITEM_EDGE); } } 第 22 页 毕业设计 } 3.9 烟花燃放功能 为了使游戏更具有娱乐性,在游戏销行的过程中消一行得10分,同时消2行得 ? 30分,消得3行得60分,消得4行得100分。根据销行的得分数放烟花,得分多者? ? 放的烟花也多。燃放烟花分为两个部分,一个是初始化烟花过程,就是根据得分级数? ? 决定燃放烟花的级数,通过GAMEBOX类中的BeginBomb进行初始化,其代码如下。 ? void GAMEBOX::BeginBomb(int isize) ? ? { ? ? int iSizeTable[]={3,4,5,10,20}; ? ? ? //isize范围:0至4,共5种烟花规模 装 ? if(isize<0 || isize>4) ? ? return; ? ? 订 iStartBomb=1; ? ? magicobj[0].x=120; ? magicobj[0].y=430; ? ? magicobj[0].xoff=0; 线 ? magicobj[0].yoff=-16-isize*2;//设置初始上抛速度 ? ? iScene=SCENE0; ? iScale=iSizeTable[isize];//设置粒子数量 ? ? } ? ? ? 烟花的具体燃放过程通过GAMEBOX类中的ShowBomb函数燃放烟花,然后过程会? ? 将粒子上抛到空中,然后通过MYBITMAP燃放烟花对象bmBomb来显示烟花。 ? void GAMEBOX::ShowBomb() ? { int i; if(iStartBomb) 第 23 页 毕业设计 { if(SCENE0==iScene) { //一个粒子上抛至顶点 ? bmBomb.ShowNoBack(PIC0,magicobj[0].x,magicobj[0].y); ? //刷新坐标 ? ? magicobj[0].y+=magicobj[0].yoff; ? ? magicobj[0].yoff++; ? ? ? if(magicobj[0].yoff>=0) ? ? { ? ? iScene=SCENE1;//动画2 装 ? ? for(i=0;i15) ? { ? ? iStartBomb=0;//停止 ? ? } ? ? } ? } ? ? } ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 25 页 毕业设计 ? ? ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 26 页 毕业设计 4功能测试 对于编写好的游戏软件,需要进行各种测试来保证软件的正常运行,常见的测试 手段包括黑盒测试和白盒测试,软件测试主要工作内容是验证(verification)和 确认(validation ),验证(verification)是保证软件正确地实现了一些特定功 能的一系列活动,即保证软件做了你所期望的事情。确认(validation)是一系 列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。? ? 即保证软件以正确的方式来做了这个事件。本文中着重用黑盒测试来测试软件 ? 的各个功能是否正确。 ? ? 4.1测试环境 ? 本文中俄罗斯方块的测试环境如下: ? 硬件环境:联想pC机,Intel 5300双核CPU,2GB内存,250G硬盘 ? 软件环境:windows XP操作系统 ? ? 4.2图像功能测试 ? 当游戏在刚刚启动后会进入其启动界面,在启动界面中显示学号和姓名,启动过? 程如下图4.1所示: ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? 图4.1示例 ? ? 程序正常运行过程中,其初始界面如上图显示,初始界面后会显示游戏的控制界? 面如下,在控制界面上显示开始,操作和设置等几个按钮,如图4.2所示: ? ? ? ? 第 27 页 毕业设计 ? ? ? ? ? ? ? ? 图4.2示例 ? ? ? 当选择操作按钮时,显示操作的提示页面如下图显示操作按键的用法等。如下图 ? 4.3所示: ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? 图4.3示例 ? ? 在主界面选择设置按钮则可以显示设置游戏速度的窗口,如下图4.4所示,通过? ? 点击左右来调整速度 ? ? ? ? ? 第 28 页 毕业设计 ? ? ? ? ? ? ? ? ? ? ? 图4.4示例 ? ? 当选择游戏开始时,就进入游戏的主界面,如图主界面分为以下三部分,主游戏装 窗口,右上角的下一个方块窗口和游戏的分数级速度窗口。如下图4.5所示: ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? 图4.5示例 ? ? 当游戏失败时就会显示游戏失败的窗口,如下图4.6所示: 第 29 页 毕业设计 ? ? ? ? ? ? ? ? ? ? ? ? ? 图4.6示例 装 ? ? 4.3销行和计分功能测试 ? 当游戏完成了一行时就会消去一行,当消去的行数大于2行时系统就会通过燃? 放烟花来庆祝,以增加游戏性,如下就是游戏的销行后加分的情况。以下就是消去2? 行时,燃放的烟花数目。同时燃放2行加30分,计分情况正常。如下图4.7所示: 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 图4.7示例 当同时消去3行时,程序加60分,同时燃放大烟花庆祝,燃放效果如下,燃放 的烟花效果更大。如下图4.8所示: 第 30 页 毕业设计 ? ? ? ? ? ? ? ? ? ? ? ? ? 图4.8示例 装 ? 当同时消去4行时,程序加100分,同时燃放的烟花数目增大,效果增强,如? 下图4.9所示: ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? 图4.9示例 ? 第 31 页 毕业设计 4.4速度功能测试 当玩家的分数等级达到一定等级后游戏的速度就会增大,游戏有9个速度等级, 根据游戏当前的等级来设置下落的速度,根据测试结果显示,游戏中速度设置合适, 下落速度等级满足用户习惯。 ? ? ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 32 页 毕业设计 ? ? ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 33 页 毕业设计 5总结 通过此次完整的游戏设计实现过程,学习了游戏开发的各个 步骤 新产品开发流程的步骤课题研究的五个步骤成本核算步骤微型课题研究步骤数控铣床操作步骤 ,从游戏的需求 设计,概要设计,到游戏的流程设计,详细设计,最后代码实现,测试。通过这一系 列的流程加深了对软件过程的理解,对软件的需求分析方式方法有清晰的认识,运用 ? 软件开发过程的瀑布模型按照软件的开发流程一步一步进行开发,最终完成了毕业设? ? 计。 ? ? 对于游戏的主体设计,当软件的开发过程一步步进行时,需要对软件进行详细的 ? 设计,以便各个软件功能能够被分成模块进行操作,从而将复杂的软件划分成一个个? ? 小的单元,使任务能够清晰明了,对于需要重复使用的功能可以用类的形势让其复用,? ? 大大增加了软件的灵活度。 ? ? 通过基于MFC的完整的游戏编码和设计工作,让我对基于MFC的程序设计掌握程 ? 度大大提高,提高了编写代码的能力,也对如何运用开发工具提供的类库有了更深的装 ? 认识。最终给通过完整的编码完成了毕设,其中对划分好的模块进行了白盒测试,保? ? 证了单元功能的正确,对于最后的整体软件进行了黑盒测试从而保证了用户状态下的 ? 正确运行。 ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 34 页 毕业设计 [参考文献] [1]Ben Sawyer. 游戏软件设计与开发指南[M].北京:人民邮电出版社,1998.8,46 [2]王映华. 游戏设计步骤.共创软件2003年2期,14~18 [3] 钦科技. Visual c++ 游戏设计.北京:科海电子出版社,2003.7 [4] 肖永亮, 耿卫东, 陈为. 计算机游戏程序设计. 北京: 电子工业出版社,2005.9 ? [5] 何健辉. 游戏软件设计与开发大揭秘. 北京: 人民邮电出版社,2000.2 ? ? [6] 房晓溪, 陈黎. 电脑游戏设计. 北京: 中国水利水电出版社,2007.4 ? [7] R ROUSE. 游戏设计原理与实践. 北京: 电子工业出版社,2003.5 ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 35 页 毕业设计 致谢 本文是在老师的悉心指导下完成的,其中还有同学的热心帮助。经过半年的忙 碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮 乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学 ? 们的支持,想要完成这个设计恐怕是难以想象的。老师一丝不苟的作风,严谨求实的? ? 态度,踏踏实实的精神,不仅授我以知识,还教给了我不少做人的道理。时间虽短,? ? 却让我受益匪浅,对常老师的感激之情无法用言语来表示。 ? 此外,我还想借此次毕业设计即将完成之际,感谢曾经教导过我的老师们。在大? ? 学四年,我不仅学习了基础专业课程,还掌握了不少学习的技巧,更重要的是我的自? ? 身能力得到了很大的提高,同时也学到了不少为人、处事、治学等方面的知识和严谨? ? 认真的态度,这些都与曾经教导过我的老师分不开,与襄樊学院理工学院这个大的家 ? 庭分不开,深深的感谢你们~另外,还要衷心的感谢我的室友和同学们,感谢你们对装 ? 我的支持和给予我的帮助。我们一起学习、一起生活、一起奋斗,你们的支持是对我? ? 的最大的鼓舞。在毕业设计的过程中,我们又一起收集、学习资料,互相探讨,交流 ? 思想,直至本文的完成,这其中对我的帮助让我无法忘记,衷心的感谢你们~ ? 订 在论文即将完成之时,我的心情无法平静,从开始进入课题到论文的顺利完成,? ? 有多少可敬的师长、同学、朋友给予了我无言的帮助,在这里请接受我诚挚的谢意! ? ? 在此,我还要感谢培养我长大含辛茹苦的父母,谢谢你们! ? 最后,感谢在百忙之中抽出时间审阅本文的老师,谢谢你们~ 线 ? ? ? ? ? ? ? ? ? ? ? ? ? 第 36 页
本文档为【毕业设计论文 俄罗斯方块游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_083599
暂无简介~
格式:doc
大小:202KB
软件:Word
页数:62
分类:
上传时间:2017-09-28
浏览量:45