《3125.连连看(EZWindows)设计.doc》由会员分享,可在线阅读,更多相关《3125.连连看(EZWindows)设计.doc(13页珍藏版)》请在三一办公上搜索。
1、面向对象程序设计(C+语言)课程设计设计说明书连连看(EZWindows)起止日期: 2009年 12 月 1日 至 2009 年 12月 5日学生姓名 班级软件081学号 成绩指导教师(签字)计算机与通信学院2009年1月4日目 录一、设计背景2二、需求分析2三、概要设计3四、详细设计6五、用户使用说明9六、参考资料11七、总结12一、 设计背景在进行C+语言的学习中,我逐渐学习并且掌握到了面向对象的C+编程的基本知识和要求。在这一次的课程设计中,有对可视化窗口的实现提出要求。窗口的实现可以使用MFC或者第三方库来进行实现。综合考虑,我们决定通过现有所学知识,并使用EZWindows(第三方
2、库)作为自己课外学习的内容,来完成此次课程设计。二、 需求分析关于连连看的功能描述如下:运行游戏并自动进行初始化工作,将整个游戏区域分成纵向和横向拓展的若干个小方块,并且这些小方块是由多种图案成对地分布于游戏区域的不同位置。玩家可以通过选取相同的两个物件来对它们进行消除的操作,直到将游戏区域中的所有方块对都被消除后为胜利。游戏的整体运行效果如图:三、 概要设计程序运行基本流程:打开应用程序鼠标点击窗口中任意位置开始游戏随机分配方块位置,画出地图进行游戏点击方块,按照规则消除方块游戏胜利,点击窗口任意位置重新开始游戏主要类定义如下:1. 游戏主体LLK类定义如下:class LLKpublic:
3、Creat(int,int,int); void StartNewGame(); /初始化游戏bool IsLink(const int,const int,const int,const int); /判断两方块是否消除函数。布尔类型返回值void WinGame();void DrawBox_Unchoose(const int,const int,const int,const int); /粘贴图片(无背景)void DrawBox_Choose(const int,const int,const int,const int); /粘贴图片(有背景)void EraseBox_Choo
4、se(const int,const int,const int,const int); /删除图片(有背景)friend int ClickStart(const Position &);friend int W1MouseClick(const Position &); /设置友元函数,可以调用LLk类中成员friend void DrawMap(LLK&); /设置友元关系。方便调用m_map。protected:int m_mapCOLCOUNTROWCOUNT; /定義地圖二維數組。int m_nRow,m_nCol; /储存鼠标坐标行与列。int RestBox; /标记剩余的方块
5、数bool LineLinkX(const int,const int,const int); /判断直连X函数bool LineLinkY(const int,const int,const int); /判断直连Y函数bool OneCornerLink(const int,const int,const int,const int); /判断一个折点连接函数bool TwoCornerLink(const int,const int,const int,const int); /判断两个折点连接函数;2. 程序窗口化的实现:使用第三方库EZWindows类库的导入 #include #i
6、nclude using namespace std;主要包括如下模块:1. 游戏的初始化此模块具体功能为游戏数据的初始化。即对方块地图的随机分配。剩余方块计数的重置。通知绘图函数的重新绘制等等功能。均包含于自定义函数void StartNewGame();中。2. 游戏界面的绘制此模块实现可视化窗口的绘图功能以及地图的绘制功能。通过对EZWindows第三方库的函数调用。实现对窗口的打开。图片的载入和更新、擦除等等功能。此模块函数定义为:friend void DrawMap(LLK&);。3. 鼠标交互的实现 此模块实现鼠标响应,将鼠标的坐标信息转换为二维数组地图信息之后,实现方块的消除,
7、还原,更改等功能。鼠标响应的功能均在函数:friend int W1MouseClick(const Position &)中。4. 核心实现(判断方块是否可连)当选定两个方块时,调用此模块来判断这两个方块是否能消除。模块分别要考虑到两方块直连、一个折点相连、两个折点相连的位置关系。具体功能为多个函数互相调用实现,均包含于bool IsLink(const int,const int,const int,const int);函数中。5. 游戏胜利的判断判断剩余方块数为零时,游戏胜利,然后嵌套函数,游戏重新开始。功能实现在函数WinGame()中。所有模块之间的关系如下图:ClickStart
8、StartNewGameDrawMapW1MouseClickIsLinkWinGameClickStartIsLinkLineLinkXLineLinkYOneCornerLinkTwoCornerLink四、 详细设计1. 方块地图的定义根据游戏规则的描述,游戏地图为一个矩形,并且在每一个坐标上都可能分布不同图案的方块。因此我们将地图定义为一个二维整形数组: int m_mapCOLCOUNTROWCOUNT; 其每一个数值代表着所指坐标的方块图案类型。0代表无方块。2. 游戏的初始化游戏的初始化需要做到在全盘游戏地图中对方块的随机分配,且分配数要达到游戏的基本要求,即应该考虑到各种方块类
9、型的种类数,且每一种方块数必须为偶数,以达到方块两两消除的基本游戏目的。在这里我们先根据用户选取的不同方块图案数目MAPCOUNT(即游戏难度)计算出每一种方块应该在游戏地图中所分配的总数。然后使用的随机布种函数和时间函数的嵌套使用:srand(time(NULL);并在之后用rand%(MAPCOUNT+1)让其随机在0MAPCOUNT之间取值,来达到对二维数组进行一一赋值的目的。其中运用到了时间函数的嵌套使用是为了使相邻两次随机数取值不同。3. 窗口和图形方块的绘制因为整个游戏是建立在EZWindows的第三方库之上,所以窗口的建立和图形方块以及地图的绘制只需要通过对函数的调用即可达到目的
10、。关于窗口的建立函数:进行申请窗口对象:SimpleWindow W1(连连看, 15., 13., Position(5., 5.);对窗口进行操作:W1.Open(); /打开窗口assert(W1.GetStatus() = WindowOpen);图形对象的申请,注明对象基于W1窗口:BitMap m1(W1);图像的载入:m1.Load(1-1.bmp); /读取方块图案assert(m1.GetStatus() = BitMapOkay);图像的绘制与擦出,需要事先对m1对象的坐标成员进行赋值:m1.SetPosition(Position(X,1.2*Y);m1.Draw();m
11、1.Erase();4. 核心实现(判断方块是否可连)判断方块是否可连是游戏中最重要的一个核心环节,根据游戏的规则,如果两个方块图案相同,并且可以通过一条不间断的(即他们之间没有其他方块阻碍)直线或者一个折点或者两个折点将他们相连,则判断他们能够消除。其思路为:. 首先判断两个方块坐标是否相同,相同自然不可能相连,因此返回FALSE,否则继续判断。. 判断两方块X坐标是否相同,相同即调用LineLinkX()函数进行判断是否可X直连,能够则返回TRUE,不能或者X坐标不相同则继续判断。. 判断两方块Y坐标是否相同,相同即调用LineLinkY()函数进行判断是否可Y直连,能够则返回TRUE,不
12、能或者Y坐标不相同则继续判断。. 调用函数OneCornerLink()函数判断两方块是否可通过一个折点进行相连,其中可知折点具体坐标,切可能值只有两种,因此分别调用直连函数判断即可,若能够相连则返回TRUE,不能则继续判断。. 调用函数TwoCornerLink()函数判断两方块是否可通过两个折点进行相连,这是最繁琐的也是最后一种可能的连接判断方式,首先以其中一个方块为基准,分别向上、向下、向左、向右将坐标进行一一遍历,每取一个点,判断是否能与第一个方块直连,在能够的情况下再继续判断此点是否能于第二个方块进行一个折点的相连。如此遍历过后,若其中能找到达到标准的两个折点,则返回TRUE,否则继
13、续到最后一步。. 以上方式若均没有成功,则执行返回FALSE语句。将整个思路整理过后,核心函数的具体流程如下:传入两个方块的坐标点是否为同一方块X坐标是否相等Y坐标是否相等通过一个折点是否可连通过两个折点是否可连返回FALSEX方向是否可以相连Y方向是否可以相连返回TRUE是否是是否否是是否否是否是否五、 用户使用说明整个游戏的操作和规则都很简单,在双击运行了程序之后,将弹出一个游戏欢迎界面的窗口:在屏幕中点击鼠标左键即可进行连连看游戏,游戏中只需要移动鼠标并进行鼠标左键的点击,根据游戏的规则合理选取图案方块并且消除即可,当所有的方块都消除之后将出现游戏成功的胜利手势。享受到完成游戏的成就感之
14、后,继续在屏幕中点击鼠标左键即可开始新的一轮连连看:六、 参考资料1. 周瑜萍 Visual C+ 6编程宝典 电子工业出版社2. 罗伟坚 Visual C+ 经典游戏程序设计 人民邮电出版社3. 仁哲 MFC Windows 应用程序设计 清华大学出版社4. 吕凤翥 C+语言程序设计(第2版) 电子工业出版社5. 徐刚、薛雷、于健 C+游戏编程入门教程 人民邮电出版社七、 总结这一个学期对C+语言的学习过程中,我从老师的教学和书本中了解了面相对象的编程概念,并且通过平时的编程和这一次的课程设计,我感觉到我所掌握的知识程度和需要了解的知识范围相差太多。在这一次的课程设计中,我们原本打算通过MF
15、C来编写这一次的游戏工程,最开始的决心和准备工作我们都做得十分踏实,当时对此次课程设计抱有很大的信心和期望。但在实际的编写工程中,我们倒在了MFC的基础知识上,虽然我们了解了连连看的整体思路和算法,看懂了关键的函数运用比方说图像的载入和鼠标的交互,但是我们却忽视了MFC最基础的知识,在没有了解MFC是如何运作起来的前提下,我们开始了对自己所选的题目的幻想,结果最终几乎导致放弃并打算重新选题。之后在我和徐宇的讨论过程中,我们顿时发现了EZWindows的可行性,并且马上通过实验证明了我们的想法。当时的抉择对我们来说无疑是很有意义的,因为放弃的滋味与失败相差无几。在后来的程序编写过程中,虽然也遇到
16、了一些比较棘手的问题,比方说如何方便的载入图片,鼠标的交互与坐标取值的实现等等问题,但我们也很顺利的跨过了,最后完成了我们的作品。编写游戏成功的果实当然是美好的,但是我们并没有感到很高兴,因为这并不是我们想要达到的最终水平,因为时间和知识有限,我们放弃了时间载入的功能和难度选择。并且在核心实现的算法上,我们采取的是最简单的遍历法,可以说在算法上我们并没有下多少功夫去优化它,没考虑到时间与空间上的问题。这些都是我们在这次课程设计中感触到的东西。这一次的课程设计包含了多种味道,有酸有甜也有苦,但毋庸置疑它是很有意义的。它让我们学到了一些教材内无法得到的知识,增强了我们的动手能力,树立了我们的信心,并且让我对以后专业方向该如何下功夫指明了方向。“知识是缺乏的,所以才需要用功刻苦,不然只能无力的放弃。”-这也是我所学到的知识。