ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:803.94KB ,
资源ID:6838244      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6838244.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式大作业连连看文档.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式大作业连连看文档.docx

1、嵌入式大作业连连看文档 嵌入式系统课程设计题目: 连 连 看 姓名: 学号: 班级: 一、 系统分析与总体设计1.1、 系统分析1.1.1、 项目概要 游戏“连连看”顾名思义就是找出相关联的东西,它来源于街机游戏四川麻将和中国龙,是给一堆图案中的相同图案进行配对的简单游戏,在2003年,一个叫做朱俊的网友将这种形式搬到了PC上,立刻成为办公一族的新宠,并迅速传遍了世界各地。之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的新世界。连连看游戏主要通过在游戏界面内连接相同图案来进行消除,以最终完全消除游戏界面内的图案为游戏完成的标准。

2、这项小游戏操作简单,只需用鼠标进行点击操作即可,并且对玩家观察力、判断力、反应能力起到很好的煅炼作用,故一经推出就受到了广大玩家的喜爱。1.1.2、 选题的意义 随着社会节奏的加快,平常工作的竞争强度也加大,生活的压力也跟着加重。所以休息时或下班后大家都需要个休闲的娱乐工具,来放松自己,缓解自己的压力,消除紧张的疲劳状态。连连看游戏是一种意趣休闲的小游戏,不仅能调节精神,还能在游戏中锻炼我们的眼力视野,注意力的专心的程度,开发我们的思维能力,同时可以充实自己,向高等级挑战,培养我们面对困难时自己所具有攻克困难的信心。当今基于EVC4.0编程技术的游戏开发十分流行,被游戏开发者所普遍应用。而“连

3、连看”是近来网络上非常流行的一种休闲游戏,它对电脑配置要求不高,娱乐性强,简单易玩。目前大学生课程涉及基于EVC编程技术游戏开发方向的相对较少,这次通过连连看游戏的设计开发将对理解EVC技术以及EVC技术在游戏方面的应用起到很大的帮助作用,同时为EVC+编程技术及游戏设计打下坚实的基础1.1.3、 主要问题 开始制作游戏时,主要要解决的问题有以下几个方面:如何设置整个游戏的界面;如何控制连连看游戏中随机图片的生成且每种图片必须为偶数个;游戏开始后,判断鼠标两次点击的图片能否消去,即图片是否相同且图片之间路径的判断1.1.4、 需求分析 整个游戏程序通过在处理鼠标响应事件中伴随着绘图。程序通过调

4、试运行,实现了设计目标,能够满足连连看游戏玩家的需要,关于连连看的功能描述如下:运行游戏并进行初始化工作,将整个游戏区域分成纵向和横向扩展的若干个小方块,并且这些小方块是由多种动物图案成对地分布于游戏区域的不同位置。玩家可以通过选取相同的两个物件来对它们进行消除的操作,直到将游戏区域中的所有方块对都被消除后为胜利1.2、 总体设计1.2.1、 系统的开发环境 Intel(R) Core(TM) i5-2430M 4G内存 500G硬盘 Microsoft Windows 7 Microsoft eMbedded visual C+ 4.0 New Emulator_SDK1.2.2、 系统的总

5、体功能 1.2.3、 系统的结构及模块 1.2.4、 功能说明1)游戏地图设计对于整个游戏区域,可以把它看作一个是由若干个小方块构成的地图,而且每一个小方块放置着不同的动物图案,可将其称之为图案小方块。这些图案小方块零散地分布在地图的不同位置区域,并且每一个图案小方块都有与其对应的完全一样的另外一个小方块,整个游戏游戏区域被抽象成一个有坐标位置属性的平面,平面上零散地分布着若干个小方块,并且这些小方块的物种起码是成对出现的。经过前面的描述和分析后,可以把游戏区域地图用一个数组m_Player;来表示。m_Player;是把地图设计成一个动态分配的int整形一维数组,对地图中的行列数的表达,用一

6、个转换法则即可。可以在PocketLianDlg类对象定义中添加地图核心数据的成员变量,具体如下: /地图位置相关属性组 int* m_Player; /动态地图数据头指针(一维数组) int m_nRow; /地图的行数(虚拟) int m_nCol; /地图的列数(虚拟) 2) 初始化游戏界面 该部分主要由执行窗口创建函数及位图加载函数来实现。通过数据的初始化及位图资源的加载为用户呈现一个游戏初始的界面。 3) 图片的选择该功能主要由鼠标来完成。在OnLButtonDown()事件函数中通过鼠标的点击事件选取所要消除的两个相同图片。4) 图形的判断与消除对于第(2)步所选的两个图片,对其连

7、通性进行判断:如果两图片直线连通,则相互消去;如果两图片连接为一个拐点且相通,则相互消去;如果两图片连接为两个拐点且相通,则相互消去;否则,不能消去。 5) 判断游戏是否死锁或结束如果所有的图片全部消去,则提示“游戏结束!”的信息。当游戏玩家不可能在消去任意两个图片时,游戏进入死锁状态。此时提示相关信息二、 系统的详细设计2.1、 游戏地图设计对于整个游戏区域,可以把它看作一个是由若干个小方块构成的地图,而且每一个小方块放置着不同的动物图案,可将其称之为图案小方块。这些图案小方块零散地分布在地图的不同位置区域,并且每一个图案小方块都有与其对应的完全一样的另外一个小方块,整个游戏游戏区域被抽象成

8、一个有坐标位置属性的平面,平面上零散地分布着若干个小方块,并且这些小方块的物种起码是成对出现的。经过前面的描述和分析后,可以把游戏区域地图用一个数组m_Player来表示。m_Player是把地图设计成一个动态分配的int整形一维数组,对地图中的行列数的表达,用一个转换法则即可。可以在PocketLianDlg类对象定义中添加地图核心数据的成员变量,具体如下: /地图位置相关属性组 int* m_Player; /动态地图数据头指针(一维数组) int m_nRow; /地图的行数(虚拟) int m_nCol; /地图的列数(虚拟)上面的成员变量中定义了一个整形指针标量m_Player,用于

9、记录动态分配出来的一维数组地图空间的首地址。对于地图区域中的某个小方块的类型,可以用一个整形的ID来进行识别。这里为标识地图的行列位置分别添加m_nRow和m_nCol变量,到此,地图的数据结构已经设计好。 在PocketLianDlg类的构造函数对地图数据进行相关的初始化:#define ROWCOUNT 7 /7 /8 /9 #define COLCOUNT 12 /12 /14 /16CPocketLianDlg:CPocketLianDlg(CWnd* pParent /*=NULL*/) : CDialog(CPocketLianDlg:IDD, pParent) m_hIcon =

10、 AfxGetApp()-LoadIcon(IDR_MAINFRAME); m_nY1=-1; m_nX1=-1; m_nRow=ROWCOUNT; m_nCol=COLCOUNT; m_Player=new intm_nRow*m_nCol;CPocketLianDlg:CPocketLianDlg() delete m_Player;PocketLianDlg类对象的实现中,定义了一些关于地图行列数的宏,如ROWCOUNT和COLCOUNT,并且在PocketLianDlg类对象的构造函数中,进行了行列的真实确认赋值,并根据当前行列数的大小对地图数据空间进行动态创建。因为地图数据是用new

11、在堆栈动态创建的,所以在销毁该对象时要将这些内存空间释放,见代码所示在PocketLianDlg类对象的析构函数中调用delete将m_Player指向的所有空间都释放掉。2.2、 初始化界面首先调用CenterWindow()函数创建一个居中的窗口,再执行m_bitmap.LoadBitmap()函数来加载指定的位图资源,然后通过调用m_MemDC.CreateCompatibleDC() 创建一个与指定设备兼容的内存设备上下文环境(DC),再调用CreateCompatibleBitmap()函数创建与指定的设备环境相关的设备兼容的位图;最后调用FillMemDC()函数填充所创建的窗口。

12、该部分的实现代码下:BOOL CPocketLianDlg:OnInitDialog() CDialog:OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); CenterWindow(GetDesktopWindow(); /创建一个居中的窗口 m_bitmap.LoadBitmap(IDB_BITMAP_129); /加载指定的位图资源 CClientDC dc(this);/创建一个与指定设备兼容的内存设备上下文环境 m_MemDC.CreateCompatibleDC(&dc); CBitmap bitmap;

13、 bitmap.CreateCompatibleBitmap(&dc,m_nCol*FRONTWIDTH+5,m_nRow*FRONTHEIGHT+5); /创建与指定的设备环境相关的设备兼容的位图 m_MemDC.SelectObject(&bitmap); int n=GetTickCount(); srand(n);/time(NULL); CDWordArray arPlayer; for(int i=0;i(m_nCol*m_nRow)/4;i+) for(int j=0;j4;j+) arPlayer.Add(i); for(i=0;im_nRow*m_nCol;i+) int n

14、Index=(int(rand()*0.1+rand()*0.01+rand()%arPlayer.GetSize(); m_Playeri=arPlayer.GetAt(nIndex); arPlayer.RemoveAt(nIndex); FillMemDC(); return TRUE; / return TRUE unless you set the focus to a control2.3、 图形的判断与消除在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。对于选中的两个图片的销毁,它们必须符合下面3个条件:(1)选中的两个图片图案相同。

15、(2)选中的两个图片之间没有障碍物阻碍的情况下,可以用若干个垂直的直线线段连接起来。(3)这些将它们连接起来的直线线段的折点不超过两个(连接线由x轴和y轴的平行线组成)。现在针对(2)和(3)进行分析,同种物件的连接方式大致可以分成以下3种:(1) 直接方式(2) 有一个折点的垂直线段连接。(3) 有两个折点的垂直线段连接.。1. 直接连接方式或 在直接连接方式中,必须要求所选定的两个方块在同一水平直线上(可以为x方向或y方向),并且两个方块之间没有任何其他图案方块。 2.一个这点连接方式 所选定的两个方块如果通过折点的方式连接,那么对于折点来说,每个折点必定有且至少有一个坐标(x或y)是和其

16、中一个目标点相同的,即折点必定在两个目标点所在的x方向或y方向的直线上。此外,对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线和横向线相交而得出。3.两个折点的连接方式 或这种方式的两个折点所连成的直线与两物件的直接连线可以构成平行线,因此可以根据这个规律,将这条水平线在游戏区域允许的条件上下移动,然后通过判断整条带垂直折线点的曲线之间有无障碍物方式来确定是否可以连同。这种情况可以分为两种情况:(1)选中的两图案方块在同一直线,两折点间的直连线可在其这两个方块之间的空间位置作移动,其约束是不超过游戏边界区域。(2)选中的两图案方块不在同一直线,两折点间的

17、直连线可在两个方块之间的空间位置作移动,其约束是两方块之间的区域。经过上面详细的分析后,可以对选定的两方块是否可以作抵消操作可以这样设计下去。首先,对简单的直接连情况进行判断,看其是否符合条件,假如不能,再加深一个级别的复杂度,对一个折点的情况进行判断,依次类推具体判断流程图为: 2.4、 鼠标交互功能 对于用户交互的实现,这里选择鼠标交互方式。下面简单描述一下通过鼠标交互方式实现的功能。鼠标选取两个图案方块后,程序将自动判断所选定的两个方块是否能进行抵消操作,能则进行抵消操作。在游戏过程中,我们不断重复上面描述的功能,直到游戏的胜利结束。下面将鼠标事件处理工作归纳为如图所示的流程下面将按照流

18、程的子功能模块的划分方式,对整个功能模块的具体协调和实现过程进行简单的描述。(1)首先,利用鼠标的当前坐标位置point对每个小单元方块的宽度FRONTWIDTH和高度FRONTHEIGHT分别取模,获取当前鼠标落点所在的游戏区域的具体行列数(x,y)。(2)判断出该行列数(x,y)是否符合条件。保证运算出来的行数x和列数y的预定义区域最大的行数m_nCol和列数m_nRow内,并且点击的区域状态不是空白方块区域(3)对判断此次鼠标书剑的选取是否与第一个方块的选取一样,只需通过用于记录第一个被选中的方块的行列数的成员变量m_nX1是否为有效即可。这里将m_nX1以及m_nY1来记录它所在的行、

19、列数,并且每次经过判断后都会将它们的状态恢复为空白无选中状态BLANK_STATE。关于这两个用作记录第一个选中图案方块行列数的成员变量,在对话框类中的具体定义如下所示: int m_nX1; /鼠标选中的记录方块列数 int m_nY1; /鼠标选中的记录方块行数(4)对于本次选中的方块为第一选中的情况,先用m_nX1和m_nY1对当前的选中方块位置做记录,然后直接在屏幕的该区域绘制图像,为该方块区域添加一个红色的矩形外边框,用以提示用户当前的第1个图案方块选中所在的位置。需要注意的是,对于标记方块的加亮边框绘制是通过GetDC()函数来获取对话框窗体(屏幕)的设备环境,对绘制的图像数据没有

20、作历史记录的方式来绘制的。(5)在这一处理中,对该选定方块作一些判断,以便更高效地处理。判断选中的方块与前一方块是否为同一图案方块,并且此次选择不与上一次选定的方块为同一方块,然后才跳到下一步对两个选定的方块是否可以抵消的流程中去。(6)调用前面已经实现的答功能函数IsLink()来判断当前所选定的两个图案方块是否可以抵消。(7)如果可以抵消,对选中的两个方块在内部核心地图对应的数据状态作适当的修改,将它们的状态记作已经被销毁的空方块状态BLANK_STATE。(8)完成第二个图案的选取与相关的功能操作后,我们需要前面已经选去第1个方块位置的记录作清理工作,以便下一个新方块的选择。(9)最后,

21、判断此次的鼠标操作是否已经胜利结束,如果是则给予用户结束提示,否则继续。5、游戏结束 要判断游戏的结束,只需对地图中的所有区域的状态进行检测就可以了,若检测到地图中所有的图片都被消除,则证明游戏结束。BOOL CPocketLianDlg:IsWin() /检测所有是否尚有非未被消除的方块 for(int i=0;i=0) return false; return true;三、 系统实现与调试3.1、 调试过程刚开始调试程序时出现错误如图: 解决方法:当安装的文件目录查找文件,然后拷贝文件地址Microsoft eMbedded visual C+ 4.0 下的菜单栏 toolOptions

22、Directories如图调试程序时再次出现错误如图: 解决方法:当安装的文件目录查找文件,然后拷贝文件地址Microsoft eMbedded visual C+ 4.0 下的菜单栏 toolOptionsDirectories如图调试程序时再次出现错误如图:解决方法:当安装的文件目录查找文件,找到文件然后把查找的文件名分别修改为mfcee400d.libmfcce500d.lib olecc500d.lib olecc500d.lib3.2、 系统运行的结果1)、初始界面截图2)、相邻图像的消除和边界双折线图像的消除3)、图像选定的标志4)、单折线图像的消除 5)、游戏结束 四、 附有程序

23、代码打印 PocketLianDlg.cpp程序代码: / PocketLianDlg.cpp : implementation file#include stdafx.h#include PocketLian.h#include PocketLianDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#define BKCOLOR RGB(128,128,128)#define FRONTWIDTH (39+2)#define FRONTHEIGHT (39+1

24、2)#define BKWIDTH 46#define BKHEIGHT 56#define ROWCOUNT 7 /7 /8 /9#define COLCOUNT 12 /12 /14 /16/ CPocketLianDlg dialogCPocketLianDlg:CPocketLianDlg(CWnd* pParent /*=NULL*/) : CDialog(CPocketLianDlg:IDD, pParent) /AFX_DATA_INIT(CPocketLianDlg) / NOTE: the ClassWizard will add member initialization

25、here /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); m_nY1=-1; m_nX1=-1; m_nRow=ROWCOUNT; m_nCol=COLCOUNT; m_Player=new intm_nRow*m_nCol;CPocketLianDlg:CPocketLianDlg() delete m_Player;void CPocketLianDlg:DoDataExc

26、hange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CPocketLianDlg) / NOTE: the ClassWizard will add DDX and DDV calls here /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CPocketLianDlg, CDialog) /AFX_MSG_MAP(CPocketLianDlg) ON_WM_LBUTTONDOWN() ON_WM_PAINT() /AFX_MSG_MAPEND_MESSAGE_MAP()/ CPocketLi

27、anDlg message handlersBOOL CPocketLianDlg:OnInitDialog() CDialog:OnInitDialog(); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon CenterWindow(Get

28、DesktopWindow(); / center to the hpc screen / TODO: Add extra initialization here m_bitmap.LoadBitmap(IDB_BITMAP_129); /ZeroMemory(m_Player,sizeof(m_Player); CClientDC dc(this); m_MemDC.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc,m_nCol*FRONTWIDTH+5,m_nRow*FRONTHEIGHT+

29、5); m_MemDC.SelectObject(&bitmap); int n=GetTickCount(); srand(n);/time(NULL); CDWordArray arPlayer; for(int i=0;i(m_nCol*m_nRow)/4;i+) for(int j=0;j4;j+) arPlayer.Add(i); for(i=0;im_nRow*m_nCol;i+) int nIndex=(int(rand()*0.1+rand()*0.01+rand()%arPlayer.GetSize(); m_Playeri=arPlayer.GetAt(nIndex); arPlayer.RemoveAt(nIndex); FillMemDC(); return TRUE; / return TRUE unless you set the focus to a controlvoid CPocketLianDlg:FillMemDC() CClientDC dc(this); CDC MemDC; MemDC.CreateCompatibleDC(&dc); CBitmap bitmap1; bitmap1.LoadBitmap(IDB_BITMAP_129); MemDC.SelectObject(&bitmap1); m_MemDC.Fill

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1