基于visualc的“连连看”游戏的设计与实现内容摘要:

++) for(int j=0。 j4。 j++) (i)。 //每次从上面的临时地图中取走 (获取后并在临时地图删除 ) //一个动物放到地图的空方块上 for(int i=0。 im_nRow*m_nCol。 i++) { //随机挑选一个位置 int nIndex=(int(rand()*+rand()*+rand()))%()。 //获取该选定物件放到地图的空方块 m_map[i]=(nIndex)。 5 //在临时地图除去该动物 (nIndex)。 } //更新显示 Invalidate(TRUE)。 } 图案方块的连接判断模块设计 设计思路 对于选中的两个方块的销毁,必须符合以下 三 个条件。 (1) 选中的两个方块图案相同。 (2) 选中的两个方块之间在没有障碍的情况下,可以用若干垂直的直线线段连接起来。 (3) 这些将 两个相同方块 连接起来的直线线段的折点不超过两个。 同种物件的连接方式大致可以分成以下 三 种 [7]: (1) 直连方式 该方式要求所选定的两个方块 在同一水平直线上,并且两个方块之间没有任何其他图案方块。 直连方式 如图 32 所示 : 图 32 直连方式 (2) 有一个折点的垂直线段连接 方式 有一个折点的垂直线段连接 方式如图 33 所示。 所选定的两个方块如果通过折点的方式连接,那么对于折点来说,每个折点必定 有且 只 有 一个坐标是和其中一个目标6 的点是相同的,即折点必定在两个目标点所在的 x 方向或 y 方向的直线上。 对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线或横向线相交而得。 在这些所有 可能连接的交线经过的每一个 图案方块区域,都不允许被障碍物所阻挡。 折点 图 33 一个折点的连接方式 (3) 有两个折点的垂直线段连接 方式 有两个折点的垂直线段连接 方式如图 34 所示。 这种方式的两个折点所连成的直线与两物件的直接连接可以构成平行线,因此可以根据这个规律,将这条水平线在游戏区域允许的条件上下移动,然后通过判断整条带垂直折点的曲线之间有无的障碍物方式来确定是否可以连通。 图 34 两个折点的连接方式 流程设计 根据上面分析 , 针对选定方块是否可以作抵消操作,设计出连接判断流程图如图35 所示。 7 图 35 连接判断流程图 代码设计 (1) 判断选中的两个方块是否可以消除的代码设计 根据上面的流程设计 , 判断两个方块消除的代码如下所示 : BOOL C_LLK_Dlg:: IsLink(int x1, int y1, int x2, int y2) { //X 直连方式 if(x1==x2) { if(X1_Link_X2(x1, y1, y2)) return TRUE。 } 开始 直连方式成功判断 成功 两个折点连接方式成功判断 一个折点连接方式成功判断 结束 成功 是 否 是 否 8 //Y 直连方式 else if(y1==y2) { if(Y1_Link_Y2(x1, x2, y1)) return TRUE。 } //一个转弯直角的联通方式 if(OneCornerLink(x1, y1, x2, y2)) { return TRUE。 } //两个转弯直角的联通方式 else if(TwoCornerLink(x1, y1, x2, y2)) { return TRUE。 } return FALSE。 } 上面的实现中,先是对直连方式中的 X 方向直连 Y1_Link_Y2()以及 Y 方向直连X1_Link_X2()这两种情况作判断,如果尚未取得结果,再通过调用 OneCornerLink()函数对一个折点的情况进行判断,如果还是没取得结果的时候,调用 TwoConerLink()函数对两个折点的情况进行判断,然后得出结果。 (2) 直连方式的代码设计 下面主要介绍其中一个子功能模块直连 X1_Link_X2()的实现。 直连方式可分成直通、左通和右通三种情况: a) 直通:在选定的两个方块的直连线中没 有被任何方块所阻碍。 如图 36 所示。 图 36 直通 9 b) 左通(右通):选定的两个方块的直连线之间有其他地方阻碍,但是通过其左(右)侧可以无障碍的连通,如果两侧都无障碍,便将其默认为左通。 如图 37 所示。 左通 右通 左通 图 37 左通(右通) 直连 X1_Link_X2()函数具体实现,代码如下 : //X 直接连通 BOOL C_LLK_Dlg:: X1_Link_X2(int x, int y1, int y2) { //保证 y1 的值小于 y2 if(y1y2) { //数据交换 int n=y1。 y1=y2。 y2=n。 } 10 //直通 for(int i=y1+1。 i=y2。 i++) { if(i==y2) return TRUE。 if(m_map[i*m_nCol+x]!=BLANK_STATE) break。 } //左通 if(XThrough(x1, y1, FALSE)amp。 amp。 XThrough(x1, y2, FALSE)) return TRUE。 //右通 if(XThrough(x+1, y1, TRUE)amp。 amp。 XThrough(x+1, y2, TRUE)) return TRUE。 return FALSE。 } 鼠标事件处理 功能模块的设计 设计思路 该游戏选择 鼠标事件处理 方式实现用户交互功能。 鼠标选取两个图案方块后,程序将自动判断所选定的两个方块是否能进行抵消操作,能则 进行抵。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。