helloPe的android项目实战之连连看—设计篇
此篇为本系列文章第一篇,只为记下android小项目的是设计,实现过程。本文将首先介绍连连看项目的设计,以及涉及到的相关的内容与项目中所需算法.
本系列文章记录只是为了增加android项目实战经验,将所学的知识用于相应的项目开发当中。首先介绍一下android中连连看项目的架构及所用到的技术进行简要分析,框架基本如下图所示:
本程序主要包含两大模块:即(1)表示层模块;(2)后台逻辑模块;
其中表示层模块可以理解为游戏的UI及一些游戏辅助效果,表示层模块中,重要的是实现游戏的布局地图,项目中实现中,游戏的布局将使用自定义View的方式,在屏幕上贴图实现。而菜单模块及选关的dialog,只是为用户提供一些常见的选择,如重玩,过关继续,音效开关等等,为了有一个更好的用户交互环境,dialog的实现将通过自定义dialog的方式。而游戏音效是MediaPlayer在不同的状态场景下播放不同的游戏音效。
而后台逻辑模块中,即时对于程序计算的实现与程序各种状态的监听,将是整个程序运行的基础。此模块中将实现对于游戏剩余时间限制和游戏状态的监听与处理。对于游戏剩余时间的监听,将开启单独的线程进行处理,从而不至于影响主程序逻辑的运行;游戏的状态的监控处理中,将会实现对于连通的两个图标的消除(即游戏界面的更新),游戏输赢的监听判断,游戏暂停与否等(暂停状态需要同时将剩余时间暂停,而时间监听线程需要知道所处状态,此二者紧密联系)。对于本程序中最重要的还是程序中核心算法模块的实现,在游戏中,最主要的算法是判断两个选中的图标是否能够连通,其余两个算法也依赖于此算法而进行。下面着重介绍一下连接算法:
在介绍连接算法之前,先简单介绍一下连连看的布局算法,为了简单起见,我们使用4*4的棋盘,假设棋子有四种:
首先在程序初始化时,我们先将要加载的图片在棋盘上按序绘制出来,注意每一种图标我们绘制的时候需要一次性绘制两次,这样,才能保重绘制出来的每种图标的个数都是偶数个。假设最初如下图(1):
图(1)最初绘制 图(2)调换后棋盘
这样绘制后,我们进行一次遍历,随机的调换棋盘中的图标(是现有棋盘中的图标之间的调换,并不是更改成为其他的图标)。经过调换的棋盘可能如图(2)所示这样就完成了棋盘的初始化,当然我们的棋盘在最外面一层中是不添加图标的,为的是我们连线时候能够使用最外层画线,而不会出现穿过图标画线的情况,棋盘如下图:
现在看看连接算法的原理:
首先两个图标能够连接的充分条件是:(1)两个图标是相同的;(2)两个图标之间有一条路相连,其中这条“路上”没有其他的图标“阻碍”;(3)这一条路不能有两个以上的拐角;满足这三个条件即可认为两个图标是相连通的;对于连通的判断中,图标连通时有三种情况,分为以下:
(1)直线型:这就是横向或者是纵向方向判断即可,这种情况最容易判断,只要两者之间没有其他图标即可,就不多说;
(2)一折型:其实在两个选中图标确定的两个对角顶点画一个矩形,若是其余两个顶点中有能够满足与两个选中图标都能够“直线型”相连的,即可认为此两个选中图标可以相连,实例如下,判断两个红色的图标相连的情况:
一折型的示例
(3)二折型:对于二折型的判断是重点。判断二折型主要是做两个方向的扫描,即横向扫描与纵向扫描:
首先说横向扫描:
需要判断的两个红色图标 进行横向扩展 扩展中两点能够满足直线型相连
横向扫描中:首先将两个需要判断的比图标进行横向的扩展,扩张规则是在没有遇到其他图标时一直扩展,知道遇到此行的其他图标或者到达棋盘的边缘,扩展后的点如图中X表示,如果扩展后的点种能够存在两点满足直线型相连通的情况,即可判断两个图标是可以相连通的,连通的画线也是根据这两个辅助点相连而成的;
类似的,对于纵向扫描中:
需要判断的两个红色图标 进行纵向扩展 扩展中存在两点能够满足”直线型“
连连看连接算法到此也算完成了,至于hint的帮助算法,判断当前棋盘是否还有解的算法都是依赖于次算法。
此项目文章下一步将是进行每一个功能模块及算法的一步步实现。之所以写本系列的文章,为了记录android小项目的经历,增加实战的能力,做个总结。并不是为了做出多么新颖的项目,当然也向不少的网友学习了!