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结束
版权声明:本文为rogee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。