Word版可编辑-俄罗斯方块程序设计与系统分析精心整理.doc_第1页
Word版可编辑-俄罗斯方块程序设计与系统分析精心整理.doc_第2页
Word版可编辑-俄罗斯方块程序设计与系统分析精心整理.doc_第3页
Word版可编辑-俄罗斯方块程序设计与系统分析精心整理.doc_第4页
Word版可编辑-俄罗斯方块程序设计与系统分析精心整理.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式项目作业俄罗斯方块程序设计与系统分析 作 者 姓 名: 专业、班级 : 计科103 学 号 : 指 导 教 师: 牛玉军 完 成 日 期: 2013年06月20 日 大连大学Dalian University目录一、系统分析与总体设计21.1开发背景及其开发意义21.2需求分析31.3总体设计31.3.1开发环境描述31.3.2系统总体功能设计31.3.3 游戏界面设计41.3.4操作设计51.3.5 系统说明(帮助)功能61.3.6模块实现的功能6二、系统的详细设计与实现82.1算法分析82.2.1定义方块的数据结构82.2程序流程图8三、系统实现与调试93.1调试过程:错误信息和解决方法93.2系统运行的结果10四、程序代码14五、总结26六、参考文献26一、 系统分析与总体设计1.1开发背景及其开发意义在现代信息高速发展的时代,电子游戏已经成为人们生活中不可缺少的一部分,也是老少皆宜的娱乐方式。在电子科技还不是很发达的中国,游戏的发展还是受到技术的限制,随着游戏行业的迅速发展,游戏研发称为国家科技和经济上重大的突破方向。掌上游戏机和电视游戏机在80年代和90年代风靡一时,此时由苏联人阿列克谢帕基特诺夫制作的俄罗斯方块在掌上游戏机和电视游戏机上流行,其造成的轰动和经济价值成为游戏史上的大事。俄罗斯方块是一个老少皆宜的小游戏,它实现由四个正方形的色块组成,然后存储于一个数组的四个元素中,计算机随机产生七种不同类型的方块,根据计算机时钟控制他在一定的时间不停地产生,用户根据键盘的四个方向近些年向左、向右、向上、向下,翻转操作。然后程序根据这七种方块折叠成各种不同的类型。基于Windows的游戏设计方式很多,如基于Java的跨平台设计,基于.net平台的设计,基于JAVA的设计由于运行在虚拟机上运行,效率比较低;而.net的设计通用性不是很好,为了避免这些缺点,本文采用EVC在ARM平台上进行设计来完成俄罗斯方块游戏。1.2需求分析俄罗斯方块是一个比较简单的游戏。它游戏过程仅需要玩家将不断下落的各种形状的方块移动、翻转,如果某一行被方块充满了,那就将些行消掉;而当窗口中无法再容纳下落的方块时,就宣告游戏的结束。游戏的需求分析如下:界面设计需求:(1) 实验功能需求虽需要的按钮(2) 显示积分和等级的文本(3) 下一个方块下落提示界面,需要用不同的颜色表示(4) 游戏运行界面功能需求:(1) 实现各种方块的生产,包括形状和颜色等信息;(2) 实现各个方块的上下左右移动和旋转的功能(鼠标操作和键盘操作)。(3) 实现消行的功能;(4) 实现得分的统计功能;(5) 实现开始,暂停,结束等功能;1.3总体设计1.3.1开发环境描述俄罗斯方块游戏软件基于ARM的wince5.0平台,利用PXA270RP实验箱模拟仿真器,利用evc编程来具体实现,在实验箱的触摸屏上进行游戏。嵌入式系统作为芯片和软件的集成体,在科学研究、工业控制、军事技术、医疗卫生、消费电子等方面有着普遍的应用,此软件基于ARM处理器和windows CE 的研究平台,windows CE是由优先级的多任务操作系统它允许多重功能、进程,在相同的时间系统中运行Windowns CE 支持最大的32位同步进程,微软Windowns CE被设计成针对小型设备的通用操作系统,它可以通过设计一层位于内核和硬件之间代码来设定硬件平台。嵌入式工具包包括设备驱动器(DDK)和软件开发包(SDK),DDK提供了关于写驱动器的附加文本,SDK提供库、头文件、样本代码、文本以允许,开发者对基于Windowns CE的平台进行写操作,Windowns CE提供了相同的程序界面,以用来为其他的视窗操作系统开发功能。1.3.2系统总体功能设计首先需要对俄罗斯方块的设计和功能需求进行详细的了解和分析,一个具有功能完全满足基本需要的系统需要包括以下几个功能模块。如图1-1所示是俄罗斯方块总体设计功能图。图1-1 俄罗斯方块总体设计功能图1.3.3 游戏界面设计游戏界面设计包括:游戏界面的布局,分伟5大板块,分别是游戏显示界面,下一个方块下落是界面,积分和等级记录界面,开始结束暂停按钮,方块形态位置变化操作按钮。如图1-2所示,游戏界面设计图:图1-2游戏界面设计图1.3.4操作设计操作设计包括:游戏开始结束暂停操作设计:在游戏界面上有开始、结束、暂停按钮,用鼠标操作,选择是否要进入游戏。方块形状转换操作:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。如表1-1所示俄罗斯方块定位点设置表俄罗斯方块定位点设置,以黑色点为(0,0)坐标状态类型12341234567表1-1 俄罗斯方块方块形状图键盘处理事件:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。消行操作:当方块落到游戏界面最底部并且铺满最后一行,就能消去所在这一行,积分增加100分,而积分增加到一定数值时,玩家等级增加。积分等级记录设计:随着玩家对游戏的熟悉程度,对游戏的掌握程度,当玩家进行操作所消的行数越多,积分增加得越多,玩家等级也随之增加。1.3.5 系统说明(帮助)功能在此功能中需要完成的功能有:提供给用户系统使用的的详细说明和玩家如何玩游戏的详细说明,以便玩家熟练的操作此游戏。使用说明:俄罗斯方块的基本规则是移动(向左、向右、下移),旋转和摆放游戏自动的输出的各种方块,使之排列成完整的一行或者多行并且消除得分,由于上手简单,老少皆宜,从而家喻户晓,风靡世界。游戏帮助:打开游戏时,点击“开始”按钮就可以开始游戏了,游戏过程中可以点击“左”“右”“下”“转换”按钮对随机出现的方块进行操作,使之排列成整行从而得分;得分越高,等级越高,方块下降的速度也会随着等级的增加而加快。1.3.6模块实现的功能(1) 绘图刷新模块:在此模块中可以绘制新的方块模型void CBrickDlg:RefreshBricks(void)int i;for(i=0;iFillSolidRect(180,50,100,60,RGB(0,0,255);return;void CBrickDlg:OnPause() if(GameState=RUNNING) GameState=PAUSED;myDraw();else if(GameState=PAUSED)GameState=RUNNING;(3) 方块的旋转操作:按向上的键就会使方块的旋转void CBrickDlg:OnUp() if(GameState=RUNNING) nChar=VK_NUMPAD9; OnKey( nChar) ;二、 系统的详细设计与实现2.1算法分析2.2.1定义方块的数据结构对于方块在某一瞬间的位置的标识,我们采用了4*2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一个字块的位置,也就是说,用4个存储空间存储当前下坠唔的每一个字块的位置进行标识,而每一个存储空间的大小就是一个点的坐标值(x,y),二每个方块按照从左到右的方式进行编号,并且在编号的过程中对于同一列的方块实行从上带下进行编号,如图所示2-1:图2-1示例方块的表示方法:即四个小方块的坐标设定,其中一个方块是原点,坐标为(0,0);右侧方块坐标(1,0);下面的方块坐标(0,1),以此类推。2.2程序流程图如下图2-2所示,为程序流程图:图2-2 程序流程图三、 系统实现与调试3.1调试过程:错误信息和解决方法开发俄罗斯方块程序中,要解决的技术难题如下:1 错误信息:C:UsersqingxueDesktop brickbrick.rc(10) : fatal error RC1015: cannot open include file afxres.h. 解决方法:C:WINCE500OTHERSMFCINCLUDE路径添加到Microsoft eMbedded Visual C+ 4.0中ToolsOptionsDirectoriesinclude files下即可。2 错误信息:LINK : fatal error LNK1104: cannot open file mfcs42d.lib解决方法:C:WINCE500OTHERSMFCLIBX86路径添加到Microsoft eMbedded Visual C+ 4.0中ToolsOptionsDirectoriesLibrary files下即可。3 下落时,如果确定方块是否可以下落,即是否已经落到“地”if(GameState=RUNNING) if(Isbottom()/如果未到底 RefreshBricks();/刷新for(int i=0;i4;i+)CurrentBricki.x+;/方块下降X增加else /如果到底了IsGameOver();CanEraseALine();/消去一行DrawNextBrick();/绘制下一个方块以提示 GenerateABrick();/生成新的方块 Number0=Number1; CreateNumber();/获取随机的数据myDraw();3.2系统运行的结果(1) 游戏开始:点击游戏界面上的开始按钮,玩家就可以进行游戏的一系列操作。如图3-1所示图3-1游戏开始运行界面(2) 方块转换及下一个方块提示:点击界面上转换按钮或者按键盘上向上的按钮,都会使当前方块变换形式。如图3-2和3-3所示为方块形状转变前后的情形。图3-2方块变换前视图图3-3方块变后前视图(3) 消行及积分累加等级变化操作:当当方块落到游戏界面最底部并且铺满最后一行,就能消去所在这一行,积分增加100分,而积分每增加500时,玩家等级增加1。如下图所示为消行前后游戏运行图以及积分等级变化图:图3-4 消行前游戏运行图图3-5 消行后游戏运行图图3-6 积分变化前游戏运行图图3-7 积分变化后游戏运行图(4) 游戏结束:当方块累计顶到游戏运行界面上方边缘的时候,就结束游戏。图3-8游戏结束图四、 程序代码void CBrickDlg:OnKey(UINT nChar) switch(nChar)case VK_NUMPAD1:/左方向if(!(IsOutOfRect(1)=2)RefreshBricks();for(int a=0;a4;a+)/a为循环用变量CurrentBricka.y-;/Y表示的是横向坐标,左起为0,向左移动Y减小break;case VK_NUMPAD3:/右方向if(!(IsOutOfRect(2)=1)RefreshBricks();for(int a=0;a4;a+)CurrentBricka.y+;/右移动Y增加break;case VK_NUMPAD7:/下落OnTimer(1);break;case VK_NUMPAD9:/旋转RefreshBricks();RotateBrick();break;myDraw();void CBrickDlg:OnTimer(UINT nIDEvent) switch(nIDEvent)case 1:if(GameState=RUNNING)if(Isbottom()/如果未到底 RefreshBricks();/刷新 for(int i=0;i4;i+)CurrentBricki.x+;/方块下降X增加else /如果到底了IsGameOver();CanEraseALine();/消去一行 DrawNextBrick();/绘制下一个方块以提示 GenerateABrick();/生成新的方块 Number0=Number1; CreateNumber();/获取随机的数据myDraw();break; CDialog:OnTimer(nIDEvent);void CBrickDlg:OnPaint() CPaintDC dc(this); / device context for paintingdc.FillSolidRect(180,50,100,60,RGB(0,0,255);EraseALine=TRUE;myDraw();void CBrickDlg:InitBricks()for(int i=0;i20;i+)for(int j=0;j10;j+)MatrixOfBricksij=0;RefreshAll();/ 刷新方块区域void CBrickDlg:RefreshBricks(void)int i;for(i=0;i4;i+)MatrixOfBricksCurrentBricki.xCurrentBricki.y=0;/消去原先的方块LastPositionOfBricki.x=CurrentBricki.x;/记录原先位置LastPositionOfBricki.y=CurrentBricki.y;/旋转void CBrickDlg:RotateBrick()int i,j;/循环变量int IndexOfCenter=0;/旋转轴的方块序号Brick CenterBrick;/用于存放中间方块的位置Brick TempBrick4;CenterBrick.y=0;CenterBrick.x=0;if(CurrentBrick4.x=0) return;for(i=0;i4;i+)TempBricki.x=CurrentBricki.x;TempBricki.y=CurrentBricki.y;if(CurrentBrick0.x=CurrentBrick1.x=CurrentBrick2.x=CurrentBrick3.x)|(CurrentBrick0.y=CurrentBrick1.y=CurrentBrick2.y=CurrentBrick3.y)/如果是长棒,则以第二块为轴心,否则以第一块为轴心CenterBrick.x=CurrentBrick2.x;CenterBrick.y=CurrentBrick2.y;IndexOfCenter=2; elseCenterBrick.x=CurrentBrick1.x;CenterBrick.y=CurrentBrick1.y;IndexOfCenter=1;for(i=0;i9)|/如果右出界(CurrentBricki.y19)|/如果下出界(CurrentBricki.x0)/如果上出界/如果已出界,则不能旋转,用备份方块还原for(j=0;j4;j+)CurrentBrickj.x=TempBrickj.x;CurrentBrickj.y=TempBrickj.y;break;/是否出界int CBrickDlg:IsOutOfRect(int w)if(w=2)/右移for(int a=0;a=9)/如果即将右移出界或碰到已有方块|(MatrixOfBricksCurrentBricka.xCurrentBricka.y+1=2)return 1;/表示已到右边界if(w=1)/左移for(int a=0;a4;a+)if(CurrentBricka.y=0)/如果即将左移出界或碰到已有方块|(MatrixOfBricksCurrentBricka.xCurrentBricka.y-1=2)return 2;/表示已到左边界return 3;/未到边界int CBrickDlg:Isbottom()BrickAtBottom=TRUE;for(int a=0;a4;a+)if(CurrentBricka.x=19)/如果当前方块已经到了最底端,X是纵向的坐for(int c=0;c4;c+)MatrixOfBricksCurrentBrickc.xCurrentBrickc.y=2;/2表示不再自由下落return 0;/到底了if(MatrixOfBricksCurrentBricka.x+1CurrentBricka.y=2)/如果当前方块碰到了别的方块 for(int c=0;c=0;a-)flagover=0;for(int b=0;b0;t-)/方块下移for(b=0;b10;b+)MatrixOfBrickstb=MatrixOfBrickst-1b;/标识移位MatrixOfBrickst-1b=0;/本位置置空 n+;/如果可以消一行,则n值增加1a=a+1;/重新判断这一行switch (n)case 5:Level=1;break;case 10:Level=2;break;case 15:Level=3;break;case 20:Level=4;break;case 25:Level=5;break;case 30:Level=6;break;case 35:Level=7;break;case 40:Level=8;break;case 45:Level=9;break; void CBrickDlg:IsGameOver()int a;for(a=0;aFillSolidRect(180,50,100,60,RGB(0,0,255);void CBrickDlg:Stop() GameState=STOP;KillTimer(1);/停计时器InitBricks();void CBrickDlg:Exit() EndDialog(0);HBRUSH CBrickDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);if(nCtlColor=CTLCOLOR_STATIC)pDC-SelectObject(&StaticFont);pDC-SetTextColor(RGB(255,100,0);return hbr;BOOL CBrickDlg:PreTranslateMessage(MSG* pMsg) if (pMsg-message = WM_KEYDOWN)switch(pMsg-wParam) case VK_RETURN: return true; case VK_SPACE: return true;case VK_LEFT:/左方向case VK_NUMPAD4:nChar=VK_NUMPAD1;OnKey( nChar) ;return true;case VK_RIGHT:/右方向case VK_NUMPAD6:nChar=VK_NUMPAD3;OnKey( nChar) ;return true;case VK_DOWN:/下落case VK_NUMPAD2:nChar=VK_NUMPAD7; OnKey( nChar) ;return true;case VK_UP:/旋转case VK_NUMPAD8:case VK_NUMPAD5:nChar=VK_NUMPAD9;OnKey( nChar) ; return true;void CBrickDlg:OnGameStart() Start();Number0=rand()%7;Number1=rand()%7;return;void CBrickDlg:OnUp() if(GameState=RUNNING) nChar=VK_NUMPAD9; OnKey( nChar) ;void CBrickDlg:OnDown() if(GameState=RUNNING) nChar=VK_NUMPAD7;OnKey( nChar) ;void CBrickDlg:OnLeft() if(GameState=RUNNING) nChar=VK_NUMPAD1;OnKey( nChar) ;void CBrickDlg:OnRight() if(GameState=RUNNING) nChar=VK_NUMPAD3; OnKey( nChar) ;void CBrickDlg:DrawNextBrick()CDC*dc=GetDC();int i;if(GameState=RUNNING) switch (Number1)case 1:/-/CBrickDlg:CurrentBrick0.x=0;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=0;CBrickDlg:CurrentBrick1.y=5;CBrickDlg:CurrentBrick2.x=0;CBrickDlg:CurrentBrick2.y=3;CBrickDlg:CurrentBrick3.x=0;CBrickDlg:CurrentBrick3.y=2;CBrickDlg:CurrentBrick4.x=1;break;case 2:CBrickDlg:CurrentBrick0.x=0;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=0;CBrickDlg:CurrentBrick1.y=5;CBrickDlg:CurrentBrick2.x=1;CBrickDlg:CurrentBrick2.y=5;CBrickDlg:CurrentBrick3.x=1;CBrickDlg:CurrentBrick3.y=6;CBrickDlg:CurrentBrick4.x=2;break;case 3:CBrickDlg:CurrentBrick0.x=1;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=1;CBrickDlg:CurrentBrick1.y=5;CBrickDlg:CurrentBrick2.x=0;CBrickDlg:CurrentBrick2.y=5;CBrickDlg:CurrentBrick3.x=0;CBrickDlg:CurrentBrick3.y=6;CBrickDlg:CurrentBrick4.x=3;break;case 4:CBrickDlg:CurrentBrick0.x=0;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=0;CBrickDlg:CurrentBrick1.y=5;CBrickDlg:CurrentBrick2.x=0;CBrickDlg:CurrentBrick2.y=6;CBrickDlg:CurrentBrick3.x=1;CBrickDlg:CurrentBrick3.y=6;CBrickDlg:CurrentBrick4.x=4;break;case 5:CBrickDlg:CurrentBrick0.x=1;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=1;CBrickDlg:CurrentBrick1.y=5;CBrickDlg:CurrentBrick2.x=1;CBrickDlg:CurrentBrick2.y=6;CBrickDlg:CurrentBrick3.x=0;CBrickDlg:CurrentBrick3.y=6;CBrickDlg:CurrentBrick4.x=5;break;case 6:CBrickDlg:CurrentBrick0.x=0;CBrickDlg:CurrentBrick0.y=4;CBrickDlg:CurrentBrick1.x=1;CBrickDlg:CurrentBrick1.y=4;CBrickDlg:CurrentBrick2.x=1;CBrickDlg:CurrentBrick2.y=5;CBrickDlg:CurrentBrick3.x=1;CBr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论