如何断定你点击的两个雷同的图案是否可以打消?---------练练看算法
添加时间:2013-6-6 点击量:
参考之资,可以攻玉。 -------(诗经小雅鹤鸣)
练练看是一款很是有意思的游戏,在光棍节的时辰记得玩连连看。
看到屏幕上方一对一对的被消掉,呵呵,心里那感触感染就······。
花了几段小的时候来存眷了此中的代码实现。
可以引进 二维数组响应下标识表记标帜录按钮(图标)的地位,索引值存储“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 }
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
参考之资,可以攻玉。 -------(诗经小雅鹤鸣)
练练看是一款很是有意思的游戏,在光棍节的时辰记得玩连连看。
看到屏幕上方一对一对的被消掉,呵呵,心里那感触感染就······。
花了几段小的时候来存眷了此中的代码实现。
可以引进 二维数组响应下标识表记标帜录按钮(图标)的地位,索引值存储“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 }