天天看點

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