连连看原理

忽然来了兴致,给自己做一个小游戏玩玩,限于水平有限,最终把目标定位在一款经典游戏上--连连看

游戏本身很简单,两个一个的图片点击相连后被消除,根据难度不同,消除的规则不同,消除后的效果也有所不同,这个先不谈,不是重点

  我们先看一张图

好吧,有点密集。。。那个恐惧。。。这其实不算什么,作为一个程序猿,实际上你看到的应该是一串数字的随机排列组合

嗯,类似这样:

8 9 8 7 1 5 4 ...

4 5 8 7 1 4 9 ...

8 6 6 2 3 3 2 ...

...

透过那个表象看那个本质,就酱紫,虽然有些无聊,但这却是一个合格程序猿眼中的世界

很明显,这是一个矩阵,或者说是二维数组。想到这里,剩下的就理所当然了。

 

/ *******************************  一点都不华丽的分割线  ***********************************************/

首先,我们要做的就是初始化一个二维数组。

三个关键参数:行x、列y、个数n(也就是元素个数);

两个关键要求:元素随机排列、元素成对出现

  其次,定义消除基本规则

 直线消除

一折线消除

二折线消除

最后,处理页面表现

把数字元素换成图片

图片点击事件以及是否可消除判断

扩展,增加难度选择、关卡、道具等等

难度受 x/y/n 这三个基本参数的影响,也会收到消除规则的影响(比如消除后,原本的元素都跟着移动)

关卡依据难度来自己做决定 

 

 / *******************************  一点都不华丽的分割线  ***********************************************/

 

 伪代码部分:

首先,是二维数组生成部分,一个想法是,先创建一个一维数组,然后随机产生一个数字,往该一维数组里面添加两次,最后随机取一维数组里面的数据添加到二维数组里面,添加一个就删掉一个,直到一维数组内的数据全部被删光

既然有第一个想法,那么肯定就会有另外的想法,但这里我偏就不说,会动脑的自会去动脑去想,嘿嘿嘿嘿嘿嘿。好吧,原谅我的懒惰,我不想写。

消除规则,这个才是重点嘛。

开始想到这三种消除规则,想想第三种还是蛮复杂的,但是写着写着,就不是这样了,请看分解:

直线消除: 最简单的一种,可以是行消,也可以是列消,用程序语言描述就是,要不x相同,要不y相同(x,y为元素在二维数组中的坐标),然后不同的那个之间所有的值都为空(引入元素值概念,其实就是二维数组中对应坐标的值,空值暂定-1),我们只需要遍历一条直线上的值,不为空就中止,所有值遍历完,都为空,则为可以消除。

    举个栗子: 

有两个点:p[5][1]=4,p[5][6]=4 (如果点的值不一样你还要去遍历是否可消,我可不可以说你傻!)

x坐标相等,那么我们只需要遍历y坐标的值在[2,3,4,5] 之间的时候,点的值是否为-1(空值设定)

好了,说到这里就可以结束了,直线消除嘛,简单。

一折线消除:这种情况,出现在x,y都不相同的时候,只有一个折线即可连线使得元素点消除,那么那个折线的折点,很容易猜到,以当前的两个为一个正方形的对角点,那么折点必定跑不出去这个正方形的另外两个对角点,那么剩下的事情就是,找到那俩折点,看折点是否可以与当前的两个点形成直线消除,对,把两个点当作参数传递给直线消除的方法,判断一下即可。

    栗子来了:

两个点:p[5][1]=4,p[6][2]=4

折点应该是:p[5][2]、p[6][1],然后剩下的事情,就是重复第一步了,不再做过多描述

二折线消除:同样,x,y都不同,但和一折线不同,这里情况太复杂了,想想都复杂,都别拉我,我要薅(hao)头发,啊啊啊啊啊啊啊啊

但实际上,也只是想想比较复杂而已,我们在两个点中随意选择一个点,然后上下左右去遍历就好了。 

说的明白点,假定我们选了点p1,首先让y不变,x+1,那么就得到了第二个点,用这个点去和原来的p2点去判断是否可以一折消除,不可以则说明x变大的路子不同,那继续x变小,然后再试x不变,变y。只要遇到不通的,即可否定整条路,遇到一个通的即可跳出循环外,不在五行中了,呃呃,遇到通的就是可以消除了,还愣着干嘛。

二折线消除会遇到一种特殊情况,如果点在矩形的四个边上,怎么办?能问出这种问题的,首先要夸赞你一下,你还是有想法的。然后,你丫拿了萝卜还不走,真等棒子啊,好 给你,你个猪头,会不会动点脑子,你不会在矩阵最外面增加一圈空元素?非的和猪一样撞到墙上啊。

 

  / *******************************  一点都不华丽的分割线  我又来了 ***********************************************/

 上面虽然说是伪代码部分,但是一句代码都木有,充分说明作者是一个比猪还懒的家伙,或者说他自己对自己的水平也是看不起的,不敢把代码拿出来看。。。。

闲话少说,说点正题,代码写到这里,我们完成的仅仅是逻辑部分,距离一个完整的游戏,还有着十万八千里距离呢

首先,元素展现,页面上你肯定不能把矩阵里面的1234写出来,当然,一般人都知道把它换成图片:水果、物品、人、美美美美女(呃,当然也有可能会出现帅锅),换的方法也不难,不多做描述

接着,关卡、难度。没有关卡和难度设定的游戏,是游戏?你在逗我吧,一共那么点东西,我就是瞎子也有点完的一天吧,所以时间限制啊,复杂度限制啊什么的,应该加上了。通关奖励也是要给的,不然谁喜欢玩你的游戏,当然这游戏写出来早就没人玩了,囧

最后,扩展部分。我曾玩过一种连连看,第二关的时候,消除一对元素之后,其他所有元素都会跟着移动,或上或下或左或右或中间或四边,霍霍霍霍,管它霍霍什么,其实就是在简单的流程上,增加一点变化,这写东西你只要想到了,代码我相信难不倒人的

 

好了,就写到这里,虽然这个游戏做出来真的没人在玩了,但是作为一个练习项目,还是很有意思的,祝你能早日独自完成属于你自己的游戏。

 

posted @ 2016-07-06 17:07  玄一飞  阅读(971)  评论(0)    收藏  举报