概要
最近想写一个消消乐自动消除的脚本,研究了一下,总结出这种三个相连消除的逻辑
消除逻辑
大多数的消消乐,都是x轴或者y轴三个相同颜色相连便可以消除,总结出12中消除方法,这里先讲一下消除逻辑,再将具体的代码逻辑
先判断x轴
1.x轴 ,以当前检测的颜色坐标为原始坐标x,y,向当前行的下一列x,y+1检测,是否跟原始坐标颜色一样,如果一样就有四种可能,不一样就继续检测下一个颜色
判断这四种可能的颜色值和原始坐标的颜色值是否相同,相同执行相应的滑动即可
2.x轴 ,以当前检测的颜色坐标为原始坐标x,y,向当前行的下2列x,y+2检测,是否跟原始坐标颜色一样,如果一样就有2种可能,不一样就继续检测下一个颜色
如果相同就检测中间上下颜色是否跟原始坐标相同
接着判断y轴
能看到这里,这几张图能看明白就理解逻辑
如果图片没看懂,就看一下总结的文字逻辑
12种情况
1、x轴颜色相同相邻的两个格子,分别判断左边格子的左上方和左下方的一格格子的颜色,是否跟当前相邻的两个格子的颜色相同,左上方相同就向下滑动,左下方相同就向上滑动;分别判断右边格子的右上方和右下方的一格格子的颜色,是否跟当前相邻的两个格子的颜色相同,右上方相同就向下滑动,右下方相同就向上滑动
2、y轴颜色相同相邻的两个格子,分别判断上边格子的左上方和右上方的一格格子的颜色,是否跟当前相邻的两个格子的颜色相同,左上方相同就向右滑动,右上方相同就向左滑动;分别判断下边格子的左下方和右下方的一格格子的颜色,是否跟当前相邻的两个格子的颜色相同,左下方相同就向右滑动,右下方相同就向左滑动
3、x轴相邻的三个格子,中间颜色不同,左右颜色相同,滑动中间不同颜色格子的上下格子
4、y轴相邻的三个格子,中间颜色不同,上下颜色相同,滑动中间不同颜色格子的左右格子
横排x轴判断:判断当前颜色x1的下一个格子x2颜色是否相同,相同的话行数不变,列数加一,判断12,不相同就继续识别
5、左上相同:x1的行-1,列-1,相同x3坐标下滑
6、左下相同:x1的行+1,列-1,相同x3坐标上滑
7、右上相同:x2的行+1,列+1,相同x3坐标下滑
8、右下相同:x2的行+1,列+1,相同x3坐标上滑
竖排y轴判断:判断当前颜色y1的下一列格子y2颜色是否相同,相同的话列数不变,行数加一,判断12,不相同就继续识别
9、左上相同:y1的行-1,列-1,相同y3坐标右滑
10、右上相同:y1的行-1,列+1,相同y3坐标左滑
11、右上相同:y2的行+1,列-1,相同y3坐标右滑
12、右下相同:y2的行+1,列+1,相同y3坐标左滑
CODE
提示:具体的代码我相信跟业务有关,代码也各不相同,理解逻辑就好办了,有思路问问gpt代码就出来了
- 颜色检测方法
把颜色分成一个个小块,检测这个小块的颜色,检测到就返回颜色值和当前颜色方块的xy坐标
function 当前颜色检测(x, y) {
// 颜色检测范围:region(起始x, 起始y, 宽116, 高110)
//当前颜色识别数据: 1 绿色 2 蓝色 3 橘色 4 黄色 5 红色 6 绿色
var colors = {color: [0, 1, 2, 3], x: 0, y: 0}
color("#199e10", [[-24, 0, "#29be21"], [-8, -2, "#29ae19"], [8, -6, "#21a210"]]).region(x, y, widht, height).click(0, 0).clickAfter(function (xy) {
colors.x = xy.x;
colors.y = xy.y;
colors.color = [1];
}).start()
color("#00c6ff", [[8, 0, "#00b2ff"], [14, 4, "#00aeff"], [20, -18, "#00cef7"]]).region(x, y, widht, height).click(0, 0).clickAfter(function (xy) {
colors.x = xy.x;
colors.y = xy.y;
colors.color = [2];
}).start()
color("#ffba3a", [[-2, -4, "#ffb63a"], [-6, -8, "#ffa631"], [16, -20, "#f7b23a"], [20, -18, "#ff9229"]]).region(x, y, widht, height).click(0, 0).clickAfter(function (xy) {
colors.x = xy.x;
colors.y = xy.y;
colors.color = [3];
}).start()
return colors;
}
2.根据行列检测颜色
根据当前的行和列来返回当前颜色的位置等信息
function 获取当前信息(当前行, 当前列) {
var 当前x坐标 = 开始坐标x + (当前行 * widht);
var 当前y坐标 = 开始坐标y + (当前列 * height);
//这里需要屏幕的边缘坐标减去一个方块的位置
if (当前x坐标 >= 964 || 当前y坐标 >= 1810 || 当前x坐标 <= 0 || 当前y坐标 <= 0) {
return null;
}
// 调用当前颜色检测函数
var 当前颜色信息 = 当前颜色检测(当前x坐标, 当前y坐标);
// 判断 x 和 y 是否为 0,如果不为 0,则返回当前行、列以及颜色信息
if (当前颜色信息.x !== 0 && 当前颜色信息.y !== 0) {
return {
行数: 当前行 + 1,
列数: 当前列 + 1,
颜色信息: 当前颜色信息.color,
x: 当前颜色信息.x,
y: 当前颜色信息.y
};
} else {
// 如果 x 和 y 为 0,则返回空对象
return null;
}
}
- 循环扫描每行每列的块颜色
我这里代码行列循环有bug,建议不要c我这段代码
for (当前列 = 0; 当前列 < 15; 当前列++) {
for (当前行 = 0; 当前行 < 9; 当前行++) {
var 当前信息 = 获取当前信息(当前行, 当前列);
if (当前信息 !== null) {
var 右侧信息 = 获取当前信息(当前行 + 1, 当前列);
if (右侧信息 && 当前信息.颜色信息.toString() === 右侧信息.颜色信息.toString()) {
log("右侧信息:" + JSON.stringify(右侧信息));
var 左上信息 = 获取当前信息(当前行 - 1, 当前列 - 1);
if (左上信息 && 左上信息.颜色信息.toString() === 当前信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (左上信息.y + 滑动距离 < 1920) swipe(左上信息.x, 左上信息.y, 左上信息.x, 左上信息.y + 滑动距离, 500);
}
var 左下信息 = 获取当前信息(当前行 + 1, 当前列 - 1);
if (左下信息 && 左下信息.颜色信息.toString() === 当前信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (左下信息.y - 滑动距离 > 0) swipe(左下信息.x, 左下信息.y, 左下信息.x, 左下信息.y - 滑动距离, 500);
}
var 右上信息 = 获取当前信息(当前行 + 2, 当前列 - 1);
if (右上信息 && 右上信息.颜色信息.toString() === 右上信息.颜色信息.toString()) {
// 相同,执行下滑
console.log("右上相同,执行下滑");
if (右上信息.y + 滑动距离 < 1920) swipe(右上信息.x, 右上信息.y, 右上信息.x, 右上信息.y + 滑动距离, 500);
}
var 右下信息 = 获取当前信息(当前行 + 1, 当前列 + 2);
if (右下信息 && 右下信息.颜色信息.toString() === 右下信息.颜色信息.toString()) {
// 相同,执行上滑
console.log("右下相同,执行上滑");
if (右下信息.y - 滑动距离 > 0) swipe(右下信息.x, 右下信息.y, 右下信息.x, 右下信息.y - 滑动距离, 500);
}
}
var 横排第三格信息 = 获取当前信息(当前行 + 2, 当前列);
if (横排第三格信息 && 当前信息.颜色信息.toString() === 横排第三格信息.颜色信息.toString()) {
log("横排第三格信息:" + JSON.stringify(横排第三格信息));
var 中上信息 = 获取当前信息(当前行 + 1, 当前列 - 1);
if (中上信息 && 当前信息.颜色信息.toString() === 中上信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (中上信息.y + 滑动距离 < 1920) swipe(中上信息.x, 中上信息.y, 中上信息.x, 中上信息.y + 滑动距离, 500);
}
var 中下信息 = 获取当前信息(当前行 + 1, 当前列 + 1);
if (中下信息 && 当前信息.颜色信息.toString() === 中下信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (中下信息.y - 滑动距离 > 0) swipe(中下信息.x, 中下信息.y, 中下信息.x, 中下信息.y - 滑动距离, 500);
}
}
var 竖排第三格信息 = 获取当前信息(当前行, 当前列 + 2);
if (竖排第三格信息 && 当前信息.颜色信息.toString() === 竖排第三格信息.颜色信息.toString()) {
log("竖排第三格信息:" + JSON.stringify(竖排第三格信息));
var 中左信息 = 获取当前信息(当前行 - 1, 当前列 + 1);
if (中左信息 && 当前信息.颜色信息.toString() === 中左信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (中左信息.x + 滑动距离 < 1080) swipe(中左信息.x, 中左信息.y, 中左信息.x + 滑动距离, 中左信息.y, 500);
}
var 中右信息 = 获取当前信息(当前行 + 1, 当前列 + 1);
if (中右信息 && 当前信息.颜色信息.toString() === 中右信息.颜色信息.toString()) {
console.log("左上相同,执行下滑");
if (中右信息.x - 滑动距离 > 0) swipe(中右信息.x, 中右信息.y, 中右信息.x - 滑动距离, 中右信息.y, 500);
}
}
var 竖排信息 = 获取当前信息(当前行, 当前列 + 1);
if (竖排信息 && 当前信息.颜色信息.toString() === 竖排信息.颜色信息.toString()) {
log("竖排信息:" + JSON.stringify(竖排信息));
var 左上信息 = 获取当前信息(当前行 - 1, 当前列 - 1);
if (左上信息 && 左上信息.颜色信息.toString() === 当前信息.颜色信息.toString()) {
console.log("左上相同,执行右滑");
if (左上信息.x + 滑动距离 < 1080) swipe(左上信息.x, 左上信息.y, 左上信息.x + 滑动距离, 左上信息.y, 500);
}
var 右上信息 = 获取当前信息(当前行 - 1, 当前列 + 1);
if (右上信息 && 右上信息.颜色信息.toString() === 当前信息.颜色信息.toString()) {
console.log("右上相同,执行左滑");
if (右上信息.x - 滑动距离 > 0) swipe(右上信息.x, 右上信息.y, 右上信息.x - 滑动距离, 右上信息.y, 500);
}
var 左下信息 = 获取当前信息(当前行 + 2, 当前列 - 1);
if (左下信息 && 左下信息.颜色信息.toString() === 竖排信息.颜色信息.toString()) {
console.log("左下相同,执行右滑");
if (左下信息.x + 滑动距离 < 1080) swipe(左下信息.x, 左下信息.y, 左下信息.x + 滑动距离, 左下信息.y, 500);
}
var 右下信息 = 获取当前信息(当前行 + 2, 当前列 + 1);
if (右下信息 && 右下信息.颜色信息.toString() === 竖排信息.颜色信息.toString()) {
console.log("右下相同,执行左滑");
if (右下信息.x - 滑动距离 > 0) swipe(右下信息.x, 右下信息.y, 右下信息.x - 滑动距离, 右下信息.y, 500);
}
}
}
}
}