怎样判断你点击的两个相同的图案是否可以消除?---------练练看算法

      他山之石,可以攻玉。    -------(诗经小雅鹤鸣)     

     练练看是一款非常有意思的游戏,在光棍节的时候记得玩连连看。

     看到屏幕上面一对一对的被消掉,呵呵,心里那感觉就······。

     花了几段小的时间来关注了其中的代码实现。

     可以引进 二维数组相应下标记录按钮(图标)的位置,索引值存储“0” 即按钮为空;

     练练看当中的核心也是最能体现效率的地方

    怎样判断你点击的两个相同的按钮(图案)是否可以消除?

     我们分三种情况分别分析一下:

1)两个相同的图案是相邻的(没有拐弯):

 

具体实现代码如下:

//(X0,Y0)是第一次点击的图案坐标   (X1,Y1)是第二次点击图案的坐标

//remove()函数具体实现是擦除图案,并将对应坐标赋值为“0”

if ((x0 == x && (y0 == y + 1 || y0 == y - 1))|| ((x0 == x + 1 ||       x0 == x - 1) && (y0 == y))) { 

successFlag = remove(typeFlag);

}

2)两图案之间需要转一个弯;

 

3)两图案之间需要两个拐弯;

 

从复杂的3)情况下手,后面你会发现其实2)情况只是其中的一个特列,判断是否可消除有以下的思路:

对你点击的每两个相同的按钮(即先判断你点击的两个按钮是否相同,接着判断能否相消),对于两按钮能否相消,

可以分为行遍历和列遍历(下面思路适用于行遍历);

1)(在行上)找到和第一个按钮同行的一个空按钮;

2)(在行上)判断第二个按钮同行到空按钮之间是否畅通;

3)(在行上)判断第一个按钮同行到空按钮之间时候通畅;

4)(在列上)判断第一个按钮到第二个按钮在所在那个空按钮列上是否畅通;

 

相应的列遍历只是改变其中的循环参数以及变量的值,就不赘言了。

贴个实现行遍历的代码:

 1 //其中的 grid[][] 为二维数组,globeRows 列边界值
 2             for (j = 0; j < globeRows + 2; j++) {   //行遍历
 3                 if (grid[x0][j] == 0) { // 判断第一个按钮同行哪个按钮为空
 4                     //当找到那个空按钮之后,第二个按钮的位置就相当关键,分三种情况
 5                     //第一种情况
 6                     if (y > j) {       // 如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边
 7                         for (i = y - 1; i >= j; i--) { // 判断第二按钮左侧直到刚才那个空格之间能不能走通(行比较)
 8                             if (grid[x][i] != 0) {
 9                                 k = 0;
10                                 break;
11                             } else {
12                                 k = 1;
13                             } // K=1说明通过了第一次验证
14                         }
15                         if (k == 1) {
16                             linePassOne();  // 这个函数没有写出但具体实现:
17                                             // 判断第一个按钮到空按钮之间能不能走通(行之间比较)
18                         }
19                     }
20                     //第二种情况
21                     if (y < j) {                       // 如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边
22                         for (i = y + 1; i <= j; i++) { // 判断第二按钮右侧直到空按钮之间能不能走通(行之间比较)
23                             if (grid[x][i] != 0) {
24                                 k = 0;
25                                 break;
26                             } else {
27                                 k = 1;
28                             }
29                         }
30                         if (k == 1) {
31                             linePassOne();
32                         }
33                     }
34                     // 第三种情况    ,上面描述的只有一个拐弯的就是这种特殊情况
35                     if (y == j) {
36                         linePassOne();
37                     }
38                 }
39                 // 判断第一个按钮到第二个按钮在刚在所在空按钮的那个列上能不能走通(列之间比较)
40                 if (k == 2) {
41                     // 第二个按钮和第一个按钮在同一行
42                     if (x0 == x) {
43                         successFlag = remove(typeFlag);
44                     }
45                     //第二个按钮在第一个按钮的下面
46                     if (x0 < x) { 
47                         for (n = x0; n <= x - 1; n++) {
48                             if (grid[n][j] != 0) {
49                                 k = 0;
50                                 break;
51                             }
52                             if (grid[n][j] == 0 && n == x - 1) {
53                                 successFlag = remove(typeFlag);
54                             }
55                         }
56                     }
57                     //第二个按钮在第一个按钮的上面
58                     if (x0 > x) { 
59                         for (n = x0; n >= x + 1; n--) {
60                             if (grid[n][j] != 0) {
61                                 k = 0;
62                                 break;
63                             }
64                             if (grid[n][j] == 0 && n == x + 1) {
65                                 successFlag = remove(typeFlag);
66                             }
67                         }
68                     }
69                 }
70             }
posted @ 2013-06-06 16:40  Orson  阅读(2370)  评论(0编辑  收藏  举报