QQ连连看外挂核心算法(检测两点能否连通)

bool Check2p(POINT a,POINT b) //此处传递了两个目标棋子的p1,p2
{
CChessPoint p1(a),p2(b); //此处声明了两个类对象,具体类中包含p1与p2的上下左右
POINT pa,pa; //声明了两个转角点


if((a.x==b.x)&&(a.y==b.y)) //a是p1棋子,b是p2棋子
{ return false;} 
else if((chessdata[a.y][a.x]==0) || (chessdata[b.y][b.x)==0) //如果p1棋子是空
{return false;} //返回假
else if (chessdata[a.y][a.x]!=chessdata[b.y][b.x]) //如果p1的值和p2不同
{return false;} //返回假


if(a.y==b.y) //p1和p2在横向一条线 (y坐标相同)
{
//2点在横线相邻
if((p1.right.x==p2.left.x) || (p1.left.x==p2.right.x))
{ return true; }
//检测这条线是否有一条通路
if(CheckLine(p1.right,p2.left)) //判断两点,高低判断交给CheckLine
{return true;}
//检测上下拐点,以目标棋子为中心
//竖方向:上(y方向:上)
pa=a;pb=b; //p1的属性给了拐点pa,p2的属性给了pb,不管怎样,初始化一下,最次也是他们本身!
if((p1.up.y>=0)&&(p1.up.y<=10)) //控制在11格以内
for(y=0;y<p1.up.y;y++) //从上循环,到p1自己停止循环,纵向延展出两个向上的射线,
{
pa.y=y;
pb.y=y; //两拐点之间是平行的,所以y是一样的
if(CheckLine(pa,p1.up)&&CheckLine(pb,p2.up)&&CheckLine(pa,pb))//在纵向延展出两个向上的射线上,检测“拐点”pa能否连通p1上方的点 && 检测“拐点”pb连通p2上方的点 && 两拐点之间能否连通,三个都OK,必定执行过了
{ return true; }
}
//竖方向:下(y方向:下)
pa=a;pb=b;
if((p1.down.y>=0)&&(p1.down.y<=10))
for(y=p1.down.y;y<=10;y++)//从自身开始循环,停在11格(底部)
{
pa.y=y;pb.y=y; //两拐点之间是平行的,所以y是一样的
if((CheckLine(pa,p1.down)&&CheckLine(pb,p2.down)&& CheckLine(pa,pb))//同上
{ return true; }
} 
}else

///纵向一条线 x轴相同
if(a.x==b.x)
{
//x上下相邻
if((p1.down.y==p2.up.y)||(p1.up.y==p2.down.y))
{return true;}
//检测是否有一条路径相通
if(CheckLine(p1.down,p2.up))
{return true;}
//检测上下
//横方向左
pa=a;pb=b;
for(x=0;x<=p1.left.x;x++)
{
pa.x=x;
pb.x=x;
if(CheckLine(pa,p1.left)&&CheckLine(pb,p2.left)&&CheckLine(pa,pb)) 
{ return true; }
}
//x右
pa=a;pb=b;
for(x=p1.right.x;x<=18;x++)
{
pa.x=x;
pb.x=x
if(CheckLine(pa,p1.right)&&CheckLine(pb,p2.right)&&CheckLine(pa,pb))
{return true;}
}else
///xy 轴都不同
{
pa=a;pb=b;
if(a.x>b.x)
{
//p1.x>p2.x (p1在右,p2在左 left)
for(x=0;x<=p2.left.x;x++) //从左循环,到p2自己停止循环,横向延展出两个向上的射线
{
pa.x=x;pb.x=x; //两个向左的射线
if(CheckLine(pa,p1.left)&&CheckLine(pa,pb)&&CheckLine(pb,p2.left.x))
{return true; }
}//end for
for(x=p2.right.x;x<p1.left.x,x++)//循环到p1.left,就近原则 
{
pa.x=x;pb.x=x;
if(CheckLine(p2.right,pb)&&CheckLine(pa,pb)&&CheckLine(p1.left,pa))
{return true; }
}
for(x=p2.right.x;x<=18;x++)
{
pa.x=x;pb.x=x;
if(CheckLine(p1.right,pa)&&CheckLine(p2.right,pb)&&Check(pa,pb))
{return true;}
}
//找y轴路径 由于是从上向下 测试 所以p1.y>p2.y
pa.x=a.x;pb.x=pb;//初始化拐点
for(y=0;y<=p1.up.y;y++) //1段
{
pa.y=y;pb.y=y;
if(CheckLine(pb,pa)&&CheckLine(pa,p1.up)&&CheckLine(pb,p2.up))
{return ture;}
}
for(y=p1.down.y;y<=p2.up.y;y++)//就近原则
{
pa.y=y;pb.y=y;
if(CheckLine(pb,pa)&&CheckLine(p1.down,pa)&&CheckLine(pb,p2.up))
{return ture;}
}
for(y=p2.down.y;y<=10;y++)//3段,自己想想什么样
{
pa.y;pb.y=y;
if(CheckLine(pb,pa)&&CheckLine(p1.down,pa)&&CheckLine(p2.down,pb))
{return ture;}
}
}else
p2点 在右面right a.x>b.x
{
pa.y=a.y;pb.y=b.y;//初始化坐标
for(x=0;x<=p1.left.x;x++)
{
pa.x=x;pb.x=x;
if(CheckLine(pa,pb)&&Check(pa,p1.left)&&CheckLine(pb,p2.left))
{return true;}
}
for(x=p1.right.x;x<=p2.left.x;x++)
{
pa.x=x;pb.x=x;
if(CheckLine(pa,pb)&&CheckLine(p1.right,pa)&&CheckLine(pb,p2.left))
{return true;}
}
for(x=p2.right.x;x<=18;x++)
{ 
pa.x=0;pb.x=x;
if(CheckLine(pa,pb)&&CheckLine(p1.right,pa)&&CheckLine(p2.right,pb))
{return ture;}
}
}
/yyyyyyyyyyyyyyyyyy y轴渐变
pa.x=a.x;pb.x=b.x; //初始化拐点
if((p1.up.y>=0)&&(p1.up.y<=10))
{
for(y=0;y<=p1.up.y;y++)
{
pa.y=y;pb,y=y;
if(CheckLine(pa,pb)&&CheckLine(p1.down,pa)&&CheckLine(pb,p2.up))
{return true;}
}
}

pa.x=a.x;pb.x=b.x;//初始化拐点
if((p1.down.y<=10)&&(p2.up.y>=0))
{
for(y=p1.down.y;y<=p2.up.y;y++)
{
pa.y=y;pb.y=y;
if(CheckLine(pa,pb)&&CheckLine(p1.down,pa)&&CheckLine(pb,p2.up))
{return true;}
}

pa.x=a.x;pb.x=b.x;//初始化拐点
if(p2.down.y<=10)
for(y=p2.down.y;y<=10;y++)
{
pa.y=y;pb.y=y;
if(CheckLine(pa,pb)&&CheckLine(p1.down,pa)&&CheckLine(p2.down,pb))
{return true;}
}
}
}
}

}//bool结束

转载于:https://www.cnblogs.com/rogee/archive/2011/01/31/1948463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值