Android小游戏之推箱子(1.27更新)

关于推箱子(Sokoban)

From:Sokoban
Sokoban (倉庫番 sōkoban?, warehouse keeper) is a type of transport puzzle, in which the player pushes boxes or crates around in a warehouse, trying to get them to storage locations. The puzzle is usually implemented as a video game. Sokoban was created in 1981 by Hiroyuki Imabayashi, and published in 1982 by Thinking Rabbit, a software house based in Takarazuka, Japan.
相信大家肯定都玩过推箱子这样的小游戏吧 推箱子 规则很简单:

初始思路

基本想法

大体思路

  1. 利用布局控制菜单
  2. 通过算法来实现游戏逻辑
  3. 细节优化

游戏逻辑

大概思路

要想角色自如的移动不是太难的问题。但是如何想去判断他的行为,如遇到箱子可以继续前进,遇到墙壁无法前进等等,这才是需要着重考虑的事情。 因此,我们姑且将背景设置为一个二维的坐标系,通过坐标(x,y)来获得当前人物的具体位置。当然与之对应的就是在计算机中通过数组来表示。 但是难题出现了,若用二维数组表示坐标的话,能快速定位,但是具体的逻辑判断就很复杂。这样来说吧,若用上面的想法,对于墙,人,道路,箱子,每一个不同的物品我们就要分别使用不同的数组加以区分,更坏的是在逻辑判断的时候,我就得费很大的功夫去来调度控制它们,让诸如 人穿墙而不能推箱子 的事情不要发生。

换个思路

若我们将整个坐标简单话,比如原本的(2,3)变为(23),这样一来是不是咱们就将二维的数据换成一个一维的。同样是使用二维数组,那样咱们就可以空出一个位置来存放标志位了,标志位的作用嘛,大家都是懂的: 不要问我3 哪里去了,我不是芒果台。

实施过程

人物移动判断处理

咱们将一个背景看作是一个二维坐标,在本例中我使用 8*12的坐标,假定其为一个二维的数组matirx[8][12],数组中保存的是一堆imageView的图片。关卡使用的是另一个数组,从@string/中读取关卡数据,就是一串字符串而已。游戏中,人的移动通过4个方向键控制移动的位置。例如 通过这个简单的过程,便能实现游戏人物和箱子逻辑的实现。 背景音乐及音效(1.27更新) 说起背景音乐,是一个让人头疼的问题,做过Android Mp3播放器的我,很是让它折磨。由于要有一定的线程知识,而我以前对于线程的理解很烂。所以到这个步骤,还是比较头疼。得解决如下的问题: 其实上面的MediaPlayer和SoundPool各有所长,所以我们要做的就是将他们mix up。 OK,接下来就是将他们封装起来,留出简单的调用API,实现我们的需求。

To Be Continue...

PS:最近刚刚放假回家,很奇怪不知道怎么的情况上火非常严重,每天鼻子会流血,牙齿会不定期出血,舌头疼,脸上非常缺水分。 想到了13年夏天,那个牙医再给我补那4颗牙的时候给我说的话:“等你这四个牙齿好了后,过来把你的那4个智齿拔了去,不然以后很影响我的生活。”现在是真心的体会到了,不要说熬夜了,晚上11点多睡觉,第二天牙齿还疼的厉害。So,我得想想办法下下火,解解肝热。 因此等我有所好转,就开始继续写Blog了,刚好趁着我在家,也好抽多点时间,帮老妈打扫家,老妈一年到头了,还那么幸苦,回家能帮点就帮点,洗完什么的早已经承包下来了,希望大家还是能多多尽一份自己的孝心,不要整天坐在电脑前面1.27更新:

Published with Ghost | Moegi