连的魅力(3)──时尚游戏《魔法宝石》制作指南

软件世界

  前言:在前两期的《连的魅力》里,根据纵横相连的道理,我们为大家讲述了一个热门游戏(《连连看》)和一个经典游戏(《五子棋》)的制作方法。在这个基础上,这次将为大家介绍的是在Windows下如何开发时尚手机游戏《魔法宝石》,从而结束这次的《连的魅力》。

  摩托罗拉的手机(如E360和E365)上有一款挺有意思的游戏,叫《魔法宝石》,玩起来颇为有趣。这个游戏和俄罗斯方块极为相似,玩法是一次掉落竖着的三个小球,要将同一行列上连续的相同颜色的图案消除。只要在行列方向上有连续3个相同颜色的图案,就能消除。其实自己动手做一个这样的游戏在PC下玩玩也相当不错,下面我们就来看看如何制作。

  核心的问题──雪崩

  这个游戏和《俄罗斯方块》类似,三个有颜色的图案下落,下落过程中可以调节连珠从上到下的排列顺序,当落到底部或下面有别的彩珠时,停止下落。这个时候就要开始判断行列是否有连续超过3个相同颜色的彩珠可以消除。

  这个游戏的最大的特点就在于在竖直方向不允许彩球间存在空点。这就意味着如果中间有彩球能消除,可能导致上面的彩球再次落下后出现新的能消除的情况,引发雪崩的效应,消掉大量的彩球。

  例如:若用1、2、3表示3种不同颜色的彩球,开始时出现下面的情况:

  1 3 3

  3 2 1

  1 2 2

  当最右边落下一个排列为222的彩球时,如:

  1 3 3 2

  3 2 1 2

  1 2 2 2

  则会先消掉行列上的2,变成:

  1

  3 3 3

  1 2 1

  这个时候行上的3也能被消除,变为

  1

  1 2 1

  所以有了前面两期的基础后,要判断纵横相连的彩球就不是最重要的问题了。如何在程序中实现这种雪崩式的效应则成了核心的问题。只有解决了这个问题,才能令一个玩家绝处逢生,挽回快要GAME OVER的局面,展现出游戏的魅力。

  雪崩前的准备

  既然看到了雪崩式的效应,那就不难发现,如果采用《五子棋》里的那种消除方式,在出现连消的时候,可能处处都有消除的可能,无法找到所有的基点。因此,这里不能套用《五子棋》里的算法。

  这个时候全遍历的方法很简单,也是一种可靠的方法,不会漏掉任何能消的情况。不过直接全遍历所有点会出现大量重复的判断,因此需要进行简化。

  (1)判断消行前连珠移动方法

  我们先来解决雪崩前的连珠移动。用一个数组表示游戏里彩珠能移动到的点。0表示空位置,1、2、3分别表示3种不同颜色的彩珠,而10表示最外层的边框,方便判断移动时是否会超过边框。连珠下落可以通过Timer控件来控制时间,每隔半秒钟使彩珠在数组里的位置下落。而左右移动可以在FormKeyDown事件中来判断获取Key的值,修改相应数组里的值。在编程时要确保移动时所占用的数组里新的位置值必须为0,若非0,则表示不能向那个方向移动。一旦不能再下落,则需要随机产生下一串彩珠继续游戏。

  (2)行列的消除方法

  首先,需要备份消掉前原始的数组,因为在每次消的过程中,一些位置上点的坐标可能需要用到几次。因此备份数组能对原始数据起到保护作用。我们只对原始数组读取数据,需要修改时,就对备份数组下手。当判定有位置的点能消的时候,在备份的数组里将能消除的位置的值改为0,即实现了稳妥的消除。

  行的消除算法

  以行消除为例,在每行里,从第2个点开始取点,一直取到最后的边界点。每次取点时,判断这个点是否为0以及与前面的点是否相同,如果相同且不为0,说明出现连续相同点,将记录连续点个数变为s++,随后判断s是否大于等于3,满足条件,就根据s推出前面几个点的位置,并把它在备份数组里的相应位置的值记为1。此时,然后再将s值记为1即可。这样全遍历所有行方向后。所有能消除的点在备份数组里的值都为0,变成空位置。

  控制层层雪崩

  由于这个游戏里每列从下到上的彩球间不能有空隙,如出现空隙,上面的彩球就要自动下落,这里通过每列的遍历,将所有空位置都由其上面可能存在的彩球填补,再将备份的数组值全部写入原始数组里,得到新的矩阵表。

  这里通过clear这个变量来判断是否出现雪崩情况。在最初开始判断消点的时候clear值为0,当消完所有点,判断是否有彩球需要填补下面空隙的时候,只要出现有一个彩球需要自动下落填补消除后的空隙的情况,就将clear值改成1。如果最后clear值为1,则需要再对新的数组进行判断,看是否还有新的雪崩存在的情况。

程序效果图

  例如,在前面的举例中,当放下2、2、2这串数时,clear值记为0,然后对横竖方向找可消点,且找到两串能消的行列。消除后,由于存在空点上有数字的情况,clear记为1,且使空点上的数值填补空点在数组里的位置,最后循环判断clear值为1,说明出现雪崩情况,再从头进行一遍前面的判断,把为3的横行消除掉。

  小结

  通过这个游戏,充分体现了备份数组的作用,所有修改数据的操作都在备份数组中进行,确保了判断点时读取的数据是最初的值。对雪崩情况的预见,确保了算法大方向的正确性,在引发雪崩情况时,不会出现查找不到基点的情况发生。完整的程序代码及相应的解释请到http://www.cpcw.com/46/rec.rar查阅。

  本文就游戏中最重要的雪崩问题作了初步的讲解,希望大家在下载程序后能有更多的收获。另外,在程序中,并未就斜方向上相同颜色球的消除加以处理,在游戏结束方面也还有工作可做,大家有兴趣的话可以在源代码相应的位置做进一步的完善(已经在程序中预留了相应的注解和位置)。同时,也欢迎大家将自己的趣味程序及编码思路发到我的信箱(liz@cpcw.com),以便供广大读者参考交流。