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结束

你可能感兴趣的:(连连看)