魔法气泡的算法问题

2018/09/27

《Dr. Robotnik s Mean Bean Machine》这个是小时候玩的一个游戏,这个里面呢。


魔法气泡外传

其实,让我比较好奇的就是,这个游戏是怎么开发的,谷歌了一下,他是开发在6800的平台上的,应该是类似dos类的东西。
先不说,这部分开发的语言是什么,估计把C或者汇编的情况比较高,说不定真是汇编,但感觉90+年了,C的面应该大。整体上,这个东西如果实现的话,算法上应该不难(估计自己研究的话,也必须有一段时间,),我比较在意的是他的画面这个东西,当年是不是,已经对这部分形成库了。


好,那么下面针对这个东西的算法问题,进行一下研究,其实前两天也一直在思考,开发这个游戏包含一套数据结构和算法,那我看到的一个套路是不是也能成为一个算法,当然这个是必然的,但关键是,这个东西怎么抽象归纳出来。这就比较尴尬了。其实在设计的时候,好像不用那么麻烦,最后实在不行就弄个大数组吗,二维的。总归能弄出来。但是这话,以后做研究还是不要想了。

当然现在说这个话,有些不妥,就是这部分并不是去找规律,而是我知道规律了,但是如何将规律转化到说是程序也好,说是代码也好,反正就是要能见到相应的产出。这跟我昨天谈到的这个相应的从数据中发现一些规律好像有点相似,但又不完全一样。

对比一下,两者都是跟规律有关。
但是另外的一个研究在于,我通过自己的一些研究知道了这个规律,是不是可以通过机器学习的部分得到这个规律(因为所有的工作都是人做的,就跟机器没有关系了),当时的解决方案是得将越来越多的特征给介绍进来,才能实现。
这个问题呢,应该算是属于算法范畴的,就是,我知道到规律了,我怎么抽象出来。
(说的不完全对,我不能算非常知道规律。。。因为这个里面呢,设计的随机性因素还是很大的;刚才又玩了两下,要想达到这个目标,在一个还有干扰的情况下是挺难的。)


注意,上面说的针对这个游戏的算法,仅仅是利用套路去取得游戏胜利,只能算是对这个游戏的一种解决方案。并不是说,利用什么其他类型的算法来得到游戏的解决。


这个游戏中存在这个5中颜色的气泡(实际上是6个,第六个是那种黑色的障碍气泡),需要将颜色相同的气泡连接在一起,4个及以上连接在一起的话,就可以消除,同时可以消除掉这其中的障碍气泡。两个或这个三个气泡的话,之间有联通的效果。
每次两个气泡从上往下落,类似于俄罗斯方块一样,可以调整位置,不管是最后的下落位置,还是说这两个气泡的相互位置。
气泡在被消除后,其上的气泡会按照相应的内容落下,如果触发了相应的联通条件,之后会继续消除。
(说到这里,这个东西跟俄罗斯方块。。不行不行,这两个差距太大了,消除的办法不太一样也)
这里面的这个连接方式,也不是说像俄罗斯方块那样,一排一排的那种。他的连接方式比较灵活。只要有一个方向上有连接,他们之间就算是联通的。这个角度不错,毗邻,然后联通性,我总感觉,我好像接触过这类的东西,元胞自动机???有点像。


上面说的应该算是这个基础的内容,就是你要遵守的规则,那么如果我想将游戏跑起来,那么应该用什么算法控制他。
那么选择什么样的数据结构呢,有一个东西,一直听说,没有用过,也不知道用处大不大,那就是稀疏矩阵。这个里面倒是不用。

来看一看这个需求,因为要有一个连通性的这个概念,仿佛采用数组是最好的选择了,而且呢,因为本身这个数组就是固定大小的, 也就是顶端超过一点。所以数据结构这个东西使用数组就不用质疑了。

这里存储气泡信息的是使用了数组的形式,但是这部分呢,仍然需要把这个一些颜色信息和位置信息都合到一个结构体里面。

那么后面就是怎么样在此基础上进行这个相应的处理了,一般来说,要进行扫描操作的时间点,
一个是在一个新的气泡过来了,然后就要进行一些匹配。
另一个就是在一串气泡没消除了,他所落下的部分进行一系列的扫描操作。
扫描:指去寻找可以被消除的对象。

为了防止全表扫描,我觉的只需要将这部分中的当前运动的那几个气泡,或者因下层被消除而运动的进行检测就可以了。一般来说只有这几个里面的内容才是真正的触发条件。
这样,扫描的时间也确定了。
那么后面就是真正的扫描策略了。
最简单的还是说,我下来两个,每一个我都去做连通性比较。因为数组的原因,这样的话,也就是比较八个就可以。平均下来的话,应该是可以减少的,比如,上面的那个不需要检测他的上面,而这两个的话,又不需要检测他的上面。反正因为一系列的限制,导致最后应该平均检测的这个数量应该是减少的。


从上面我的描述来看,我仿佛并没有把这部分内容弄得很清楚。特别是,我看了几个博客写的那个连连看的算法,又是广度搜索,又是他的分类搜索,最基础的是递归,反正就是往基础的算法上靠。
其实我这个关系看来应该也是一种递归的过程,很想是那种就是洪范的算法。然后一个一个往后扩展。这个东西就涉及到。洪泛不能波及到自身。
这也让我思考了一个问题,如果递归可以解决这么多问题,那么为什么那些个数据结构还要定义那么多的算法进行说明呢,一句递归不就完事了。


其实这个东西有点想流式数据处理的框架哦,每个气泡来了,就需要你把这部分按照一定的策略排整好。
往好的地方说,这个东西就是一个简单的(有限元)状态机一样。只是这样理解,具体我也不明白。

晚上在梳理一下,这个东西,我感觉还是应该抽象成一个问题比较好。就像是那个连连看里面说的,那个就比较不错,最终落下来的算法,是一个搜索算法。这个过程哦,我感觉,还是没有建立好这个抽象过程。

!!!
这部分文章,还需要进一步好好的梳理,主题还是不够明确,还是没有把核心问题给阐述出来。
其实本质还是这个问题的抽象过程。

你可能感兴趣的:(魔法气泡的算法问题)