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 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rogee/archive/2011/01/31/1948463.html