人工智能课程设计报告-俄罗斯方块.doc_第1页
人工智能课程设计报告-俄罗斯方块.doc_第2页
人工智能课程设计报告-俄罗斯方块.doc_第3页
人工智能课程设计报告-俄罗斯方块.doc_第4页
人工智能课程设计报告-俄罗斯方块.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1.1 项目名称俄罗斯方块游戏1.2 设计平台Visual C+ 6.0, 它是以C+语言作为其基本语言的一种可视化编程工具。1.3程序设计思想从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。俄罗斯方块游戏设计的主要步骤为以下6个方面:(1)游戏界面的设计。(2)俄罗斯方块的造型。(3)俄罗斯方块的旋转。(4)俄罗斯方块的运动情况(包括向左,向右和向下)。(5)俄罗斯方块的自动消行功能。当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。(6)游戏得分的计算。当达到一定的分数时过关。设置六关,每关方块下落的速度不同。1.4主要实现的功能我们开发的俄罗斯方块游戏,主要实现了以下几种功能:1.可以灵活控制方块在图形框中运动。2.游戏过程中方块可以自由旋转。3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,对于游戏高手来说,无疑不是一个新的挑战。2.1 需求分析随着信息技术的迅速发展,给人们带来了各种各样的信息和更多更新的娱乐。其中游戏又最为常见和普遍。所以我们实现了一个俄罗斯方块的小游戏,来对所学到的知识进行实践。2.2 关于游戏界面我们制作了一个良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。2.3 游戏的数据结构 相信大家都玩过俄罗斯方块,对这个游戏的玩法和方块形状都比较熟悉。我们这个游戏只选择了最基本的7中造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型。在旋转的过程中我们以逆时针旋转为基础。为此,我们对于方块在某一瞬间的位置标识,采用一个42的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个点的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号。123ActiveStatus00和ActiveStatus01则是第0号方块的横坐标x和纵坐标y ;ActiveStatus20和ActiveStatus21则是第2号方块的横坐标x和纵坐标y。(x0,y0)(x1,y1)(x2,y2)(x3,y3)2.3 创建主框架 首先建立一个项目工程,名为skyblue_Rect,并在AppWizard的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示: 在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg类是用作俄罗斯方块参数选择的对话框类对象。 2.4 游戏区域绘图首先将外部位图文件rect.bmp中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组GameStatusMAX_ROWMAX_COL中的内部数据将所有数据状态中为被占用状态MAP_STATE_NOT_EMPTY的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。2.5 游戏设计分析我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:CRectGameView : public CView/内部存取数据结构int m_stateMapMAX_ROWMAX_COL;/初始化操作GameInitnal(); /游戏的初始化/用于判断数据相关状态的操作IsLeftLimit(); /下坠物件是否可向左移动IsRightLitmit(); /IsBottom(); /是否已经到达了底部IsGameEnd(); /是否游戏已经结束/方块物件下坠过程中的操作RectChange(); /下坠物件变形RectDown(); /下坠物件正常下落RectArrow(); /下坠物件方向移动(左,右,下加速) /状态控制操作GameStart(); /游戏开始GamePause(); /游戏暂停GameEnd(); /游戏结束2.6正常流程设计 (1)定时制机制 从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,(2)定时处理 经过定时器的设置后,这里通过利用ClassWizard跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。 产生的随机数函数:int CSkyblue_RectView:Random(int MaxNumber)/部下随机种子srand( (unsigned)time( NULL ) );/产生随机数int random = rand() % MaxNumber;/保证非0if(random = 0 ) random+;return random;视图类创建了m_icurrentStatus和m_inextStatus两个成员变量来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而m_currentRect除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标识(17),第2位用作同种类型的不同表现方式,最多有4种状态(14)。 在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。(3)底部到达的判断与销行的实现将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定,利用数组InterFace744记录17种下坠物的14种形态的接触面信息。统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得100分,同时消2行得400分,销掉x行,则分数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。检测游戏区域中的所有行,并对每行的所有纵列状态进行检测,如果其中有一列是空闲状态则不可以销行。如果可以销行的话,将增加单位分数,并且将该行清空,再将该行上面的所有物件都向下偏移一个单位,以填充该行的空缺。例销行与积分if (m_isBottom)/判断是否已得分for (i=0;im_iRow;i+)m_bIsSucced = TRUE;for (j=0;j0;k-)for (j=0;jm_iCol;j+)GameStatuskj = GameStatusk-1j;/第1行清零for (j=0;j0) & IsLeftLimit() & !m_isBottom)/清原来的方块GameStatusx1y1=MAP_STATE_EMPTY;GameStatusx2y2=MAP_STATE_EMPTY;GameStatusx3y3=MAP_STATE_EMPTY;GameStatusx4y4=MAP_STATE_EMPTY;/InvalidateCurrent();/添加新的移动后数据状态ActiveStatus01 -= 1;ActiveStatus11 -= 1;ActiveStatus21 -= 1;ActiveStatus31 -= 1;GameStatusx1y1-1=MAP_STATE_NOT_EMPTY;GameStatusx2y2-1=MAP_STATE_NOT_EMPTY;GameStatusx3y3-1=MAP_STATE_NOT_EMPTY;GameStatusx4y4-1=MAP_STATE_NOT_EMPTY;InvalidateCurrent();Break;case RIGHT:if ( (ActiveStatus31 m_iCol-1) & IsRightLitmit() & !m_isBottom)/清原来的方块GameStatusx1y1=MAP_STATE_EMPTY;GameStatusx2y2=MAP_STATE_EMPTY;GameStatusx3y3=MAP_STATE_EMPTY;GameStatusx4y4=MAP_STATE_EMPTY;/InvalidateCurrent();/添加新的移动后数据状态ActiveStatus01 += 1;ActiveStatus11 += 1;ActiveStatus21 += 1;ActiveStatus31 += 1;GameStatusx1y1+1=MAP_STATE_NOT_EMPTY;GameStatusx2y2+1=MAP_STATE_NOT_EMPTY;GameStatusx3y3+1=MAP_STATE_NOT_EMPTY;GameStatusx4y4+1=MAP_STATE_NOT_EMPTY;InvalidateCurrent();break;case DOWN:RectDown();break; 2.9 游戏主界面 游戏设置界面 2.8总结 着手开始做的时候,发现很多东西并不容易实现。比如:如何显示每一个俄罗斯小方块,如何预测下一个俄罗斯小方块,如何控制每一个方块的下落速度,如何判断俄罗斯方块是否可以停止,如何通过键

温馨提示

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

评论

0/150

提交评论