人家说情人节嘛,单身的要玩连连看,能消一对算一对,所以,当时突然有想做个连连看的冲动……
想了一想,表示C++的界面编程还不会- -|||下学期才学……所以勉强用vb做一个算了……
其实我下面讲的是和算法有关的东西,不会砸代码上来……所以不会vb的也没事……
做连连看首先要解决几个问题
1.如何实现“消去”的效果(可以用到visible属性,消去就直接设置为不可见的就好了)
2.如何判定两个方块是否能够消去(下面重点阐述)
3.如何判定在某个局面里还有没有可以被消去的方块(如果第二个问题解决了,第三个问题就简单了,只需要两两判断一下)
对于方块能够消去,必须满足以下两个条件
1.图案要相同
2.之间相连的直线不能大于3
因此,我们可以把一个局面表示成一个二维数组,每种图案都用一个不同的序号来表示,如果是没有方块的地方用0表示,因此,接下来的步骤都在二维数组里完成就可以了,很方便。
既然每种图案都用一个不同的序号表示,因此,只需要看一下玩家鼠标点的两个方块在对应的二维数组里的值是否相等就可以了,如果不相等,管他第二个条件成不成立,直接先pass掉,但是第二个条件就没有那么容易解决了。
首先肯定会想到bfs,用个队列向四个方向拓展,然后用step记录拐弯的次数,大于3就出队,这个很显然的,但是在写起来的时候会比较复杂(我很偷懒的……),而且容易写错,如果在情人节第二天才完成制作的话那这个寓意就没了……
所以想了一下,既然最多只连三条线的话,用双向BFS不就能将他拓展的部分控制在一个很小的范围内么……起点拓展用了一条直线,终点拓展又用了一条直线,那不就是说,如果存在一条直线能将这两条直线连接起来的话,那么就能消去,否则就不能消去。再想一下,如果起点终点各拓展一条直线是一个水平一个垂直的,那么一定有交点(两条直线不是相交就是平行……),所以,只需要判断首尾两点拓展的是平行线就行了,因此这个问题就很容易解决了,就先拓展直线(其实是线段,到有方块的地方就不拓展了……),然后看看一条线能不能把他们连上就ok了……附个图吧……