象棋招法CChessMoveWord文档下载推荐.docx
《象棋招法CChessMoveWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《象棋招法CChessMoveWord文档下载推荐.docx(37页珍藏版)》请在冰豆网上搜索。
//////////////////Programmer—DefinedFunction//////////////////////////////////
inlineboolHaveFriend(POINTptPosition,intfSide)
{
if(CChessBoard[ptPosition.x][ptPosition.y]==0)
returnfalse;
elseif(SideOfMan[CChessBoard[ptPosition。
x][ptPosition。
y]]==fSide)
returntrue;
else
returnfalse;
}
inlineboolHaveFriend(BYTEx,BYTEy,intfSide)
if(CChessBoard[x][y]==0)
elseif(SideOfMan[CChessBoard[x][y]]==fSide)
}
inlineboolHaveMan(POINTptPosition)
if(CChessBoard[ptPosition.x][ptPosition。
y]==0)
returntrue;
inlineboolHaveMan(BYTEx,BYTEy)
if(CChessBoard[x][y]==0)
intIsKingFaceToFace(intx,inty,intfSide)
boolbMayKingFaceToFace=false;
inti,j;
if(fSide==RED)
{
for(i=9;
i〉=7;
i-—)//检查黑将是否在同列
{
if(CChessBoard[x][i]==BLACK_K)
bMayKingFaceToFace=true;
break;
}
}
if(bMayKingFaceToFace==false)
return-1;
for(j=y+1;
j〈=i—1;
j++)//黑将在同列,检查中间是否有隔挡
if(CChessBoard[x][j]!
=0)//有其他子
returni;
//将帅碰面,返回黑将的y值坐标
else//fSide==BLACK
for(i=0;
i<
=2;
i++)//检查红帅是否在同列
if(CChessBoard[x][i]==RED_K)
break;
for(j=y—1;
j>
=i+1;
j-—)//红帅在同列,检查中间是否有隔挡
if(CChessBoard[x][j]!
returni;
//将帅碰面,返回红帅的y值坐标
intGenerateMove(intfSide,intnDepth)
{
BYTEnCChessID;
POINTptFrom,ptTo,ptHalf;
inti;
nMoveCount=0;
intx,y;
for(x=0;
x<
=8;
x++)
for(y=0;
y<
=9;
y++)
if(CChessBoard[x][y]!
=0)
nCChessID=CChessBoard[x][y];
if(SideOfMan[nCChessID]!
=fSide)//该子颜色与所要生成着法的颜色不同
continue;
ptFrom.x=x;
ptFrom.y=y;
switch(nCChessID)
//==========生成红帅的着法
caseRED_K:
//将帅碰面
i=IsKingFaceToFace(ptFrom.x,ptFrom。
y,fSide);
if(i!
=-1)
AddMoveToQueue(ptFrom,ptFrom.x,i,nDepth);
//纵向
ptTo.x=ptFrom.x;
//向前
ptTo。
y=ptFrom。
y+1;
if((ptTo.y〈=2)&&(!
HaveFriend(ptTo,fSide)))
AddMoveToQueue(ptFrom,ptTo,nDepth);
//向后
y-1;
if((ptTo.y〉=0)&
&
(!
AddMoveToQueue(ptFrom,ptTo,nDepth);
//横向
y=ptFrom.y;
//向左
ptTo.x=ptFrom。
x-1;
if((ptTo.x>
=3)&
HaveFriend(ptTo,fSide))
&&
(IsKingFaceToFace(ptTo。
x,ptTo。
y,fSide)==—1))
AddMoveToQueue(ptFrom,ptTo,nDepth);
//向右
ptTo.x=ptFrom.x+1;
if((ptTo。
x〈=5)&
HaveFriend(ptTo,fSide))
&
(IsKingFaceToFace(ptTo.x,ptTo.y,fSide)==—1))
AddMoveToQueue(ptFrom,ptTo,nDepth);
//==========生成黑将的着法
caseBLACK_K:
i=IsKingFaceToFace(ptFrom。
x,ptFrom.y,fSide);
=—1)
AddMoveToQueue(ptFrom,ptFrom。
x,i,nDepth);
x=ptFrom。
x;
y=ptFrom.y-1;
if((ptTo.y>
=7)&&
HaveFriend(ptTo,fSide)))
AddMoveToQueue(ptFrom,ptTo,nDepth);
y〈=9)&&
(!
ptTo.y=ptFrom.y;
x=ptFrom.x+1;
x<
=5)&
&(IsKingFaceToFace(ptTo。
x,ptTo.y,fSide)==—1))
AddMoveToQueue(ptFrom,ptTo,nDepth);
ptTo.x=ptFrom.x—1;
=3)&&(!
&&(IsKingFaceToFace(ptTo。
x,ptTo。
//==========生成红车的着法
caseRED_J:
x=ptFrom.x;
for(ptTo.y=ptFrom.y+1;
ptTo.y〈=9;
ptTo.y++)
if(HaveMan(ptTo))
if(!
for(ptTo.y=ptFrom。
y-1;
y〉=0;
y--)
if(!
ptTo.y=ptFrom。
y;
for(ptTo。
x=ptFrom.x—1;
x〉=0;
ptTo.x--)
x=ptFrom.x+1;
ptTo.x<
x++)
AddMoveToQueue(ptFrom,ptTo,nDepth);
//==========生成黑车的着法
caseBLACK_J:
x=ptFrom.x;
for(ptTo.y=ptFrom.y-1;
ptTo.y>
=0;
y+1;
ptTo.y〈=9;
y++)
y;
x=ptFrom.x+1;
x〈=8;
ptTo.x++)
x=ptFrom.x—1;
x>
=0;
ptTo.x——)
//==========生成红马的着法
caseRED_M:
//ptHalf用来存储马腿的位置,以判断该位置是否有子憋马腿
ptHalf.x=ptFrom.x;
ptHalf。
y+1;
if(ptHalf.y<
=8&
!
HaveMan(ptHalf))
//11点方向
x—1;
y+2;
if(ptTo.x>
=0&
&!
//1点方向
x=ptFrom.x+1;
y+2;
if(ptTo.x<
=8&&!
ptHalf.x=ptFrom。
x+1;
ptHalf.y=ptFrom.y;
if(ptHalf.x<
=7&&
//2点方向
ptTo.x=ptFrom.x+2;
ptTo.y=ptFrom.y+1;
if(ptTo.y<
=9&
//4点方向
x+2;
ptTo.y=ptFrom.y-1;
if(ptTo。
y>
=0&&
!
y=ptFrom.y—1;
if(ptHalf。
=1&&
//5点方向
ptTo.x=ptFrom.x+1;
ptTo.y=ptFrom.y-2;
x〈=8&&
//7点方向
ptTo.x=ptFrom.x-1;
y=ptFrom.y-2;
x〉=0&
x-1;
ptHalf.y=ptFrom。
=1&&!
//8点方向
x-2;
ptTo.y=ptFrom.y—1;
//10点方向
x—2;
if(ptTo.y〈=9&&!
//==========生成黑马的着法
caseBLACK_M:
ptHalf.x=ptFrom.x;
&!
if(ptTo.x〉=0&&!
x+1;
ptTo.y=ptFrom.y+2;
y=ptFrom.y;
=7&
y<