类似a星寻路的思路
拆开的 线段 拐角 算出两点之间的路径后 存入数组 然后算当前点和上一个点的x y轴变化去判断是使用线段还是拐角 还有拐角的旋转角度
不需要a星也可以。
1.收集某个方块的四方向,此乃0拐角。
2.在1中得出列表后,在往每个方块继续收集四方向,此乃1拐角
3.在2中得出列表后,在往每个方块继续收集四方向,此乃2拐角
逆推后就能得出两个方块是否处理2个拐角内
这里因为有很多相同的方块,所以需要做一下记忆和剪枝
这个线段样式是用什么组件啊

这个线段样式是用什么组件啊
这么麻烦,这就是连连看的下坠版本吧,直接获取到所有转折点,起点终点,连接成直线,线段用杂乱点的线段的替代就行了,不用处理转折点的连接角度是否正确
默认0是空地,转折点代码:1直线相连
private linkStraight(x:number,y:number,preX:number,preY:number):boolean {//判断直线连接
let actualTimes = 0;
if (x === preX){
let countTimes = Math.abs(y-preY)-1;//获取要遍历的次数-1 = 实际空地数目(0)
if (countTimes === 0 ){//相邻直接消除
return true;
}
let yMin = Math.min(y,preY);
for (let i = 0; i < countTimes; i++) {
if (GameVariable.imageNum[x][yMin+1+i] === 0){//从最小位置的下一个位置开始遍历 有空地则增加记录一次
actualTimes++;
}else{
return false;
}
}
if (actualTimes === countTimes){ //要遍历的次数等于实际次数(都是空地(0))
return true;
}
}
if (y === preY){
let countTimes = Math.abs(x-preX)-1;//获取要遍历的次数-1 = 实际空地数目(0)
if (countTimes === 0 ){//相邻直接消除
return true;
}
let xMin = Math.min(x,preX);
for (let i = 0; i < countTimes; i++) {
if (GameVariable.imageNum[xMin+1+i][y] === 0){//从最小位置的下一个位置开始遍历 有空地则增加记录一次
actualTimes++;
}else{
return false;
}
}
if (actualTimes === countTimes){ //要遍历的次数等于实际次数(都是空地(0))
return true;
}
}
return false;
}
2.尝试1个转折点的情况,遍历长度自己根据地图调整
private OnePoint(x:number,y:number,preX:number,preY:number):boolean{ //遍历其中一个点的同一直线上的除自己之外的所有点
for (let i = 0; i < 7; i++) {// 同x(同横线)
if (y === i){
continue
}
if (GameVariable.imageNum[x][i] === 0){ //拐点也应该是空地(值为0)
if (this.linkStraight(x,y,x,i) && this.linkStraight(preX,preY,x,i)){ //1折拐点 符合直线要求 可以消除
console.log(“一折拐点:”+"["+x+","+i+"]")
return true;
}
}
}
for (let j = 0; j < 6; j++) {// 同y(同纵线)
if (x === j){
continue
}
if (GameVariable.imageNum[j][y] === 0){ //一折拐点也应该是空地(值为0)
if (this.linkStraight(x,y,j,y) && this.linkStraight(preX,preY,j,y)){ //1折拐点 符合直线要求 可以消除
console.log("一折拐点:"+"["+j+","+y+"]")
return true;
}
}
}
//循环完还没找到拐点 不可消除
return false;
}
3.尝试2个转折点的情况,也是最多转折点的情况
private TwoPoint(x:number,y:number,preX:number,preY:number):boolean{
for (let i = 0; i < 7; i++) { //判断循环的点(另一个点的横轴和纵轴) 能不能 和 1折点 构成直线连接
//判断同横轴x
if (y === i){
continue
}
if (GameVariable.imageNum[x][i] === 0){ //二折拐点也应该是空地(值为0)
if (this.linkStraight(x,y,x,i) && this.OnePoint(x,i,preX,preY)){//直线可以相连
console.log(“二折拐点:”+"["+x+","+i+"]")
return true;
}
}
}
for (let j = 0; j < 6; j++) { //判断循环的点(另一个点的横轴和纵轴) 能不能 和 1折点 构成直线连接
//判断同纵轴y
if (x === j){
continue
}
if (GameVariable.imageNum[j][y] === 0){ //二折拐点也应该是空地(值为0)
if (this.linkStraight(x,y,j,y) && this.OnePoint(j,y,preX,preY)){//直线可以相连
console.log("二折拐点:"+"["+j+","+y+"]")
return true;
}
}
}
//循环完还没找到拐点 不可消除
return false;
}
start:这3个方法的入口方法判断:
//消除判断逻辑入口函数 (已经排除空地0点击的判断)
private judgeLink(x:number,y:number,Value:number): boolean{
if (ImageMgr.preX === -1){//第一次点击 记录这次的点击数据
console.log(“第一次点击”)
return false;
}
if (ImageMgr.preX === x && ImageMgr.preY === y){//两次点击位置相同,不做处理
console.log(“两次点击位置相同”)
return false;
}else{//只要x或y有一个位置不同 则进入连接判断
console.log(“进入连接判断”)
if (Value === ImageMgr.preValue){//值相同 -进入判断连接函数
if (x === ImageMgr.preX || ImageMgr.preY === y){ //同一直线 2种情况 直线和2折 先判断直线
if (this.linkStraight(x,y,ImageMgr.preX,ImageMgr.preY)){ //直线可以消除 初始化点击数据
console.log("直线可以消除")
return true;
}else{ //直线不能消除
console.log("直线不能消除")
if (this.TwoPoint(x,y,ImageMgr.preX,ImageMgr.preY)){ //判断二折 二折可以消除
return true;
}else{
console.log("二折不能消除")
}
}
}else{ //不是同一直线 一折或者二折
if (this.OnePoint(x,y,ImageMgr.preX,ImageMgr.preY)){ //先判断一折
return true;
}else{ //一折不能消除
console.log("一折不能消除")
if (this.TwoPoint(x,y,ImageMgr.preX,ImageMgr.preY)){ //判断二折 二折可以消除
return true;
}else{
console.log("二折不能消除")
}
}
}
}else{//值不相同 不能连接 记录这次的点击数据
console.log("值不同 不能消除")
return false;
}
}
return false;
}
收尾:
也就是包括你起点、终点、转折点,一共最少有2个,最多有4个,你的动画最简单的只需要一张直线杂乱点的图片,比如闪电,可以多弄几张形状不一样的,然后对应相邻转折点之间的距离多长,你的图片就设置多长,相连就行了(我在方法里面打印的一折拐点、二折拐点就是转折点)(GameVariable.imageNum是一个二维数组,也就是你地图的二维坐标,每个坐标都有一个数字,我这里0代表空地,0以上代表不同的图片)
谢谢大哥,我试一试
