写于2018/3/21 实验室
走法
typedef struct
{
unsigned char from ,to;
} move;
//数组moveArray存储起始位置和终点,moveNum表示步数
move moveArray[128];
int moveNum =0;
unsigned char n,p;
int SaveMove(unsigned char from,unsigned char to){
moveArray[moveNum].from =from;
moveArray[moveNum].to =to;
moveNum ++;
return 0;
}
int in(int n){
int a =n/16;
int b =n%16;
if(a>=3&&a<=12&&b>=3&&b<=11) return 1;
else
return 0;
}
//马的所有可能走法
int KnightMove(unsigned char p){ //p表示马的位置
int dir[8] ={+0x0e,-0x12,-0x21,-0x1f,-0x0e,+0x12,+0x1f,+0x21};
int check[8] ={-0x01,-0x01,-0x10,-0x10,+0x01,+0x01,+0x10,+0x10};
for (int i = 0; i < 8; ++i)
{
n =p +dir[i];//n表示下一步位置
if(in(n)){
m =p +check[i]
if(!position[m]){
if (!(position[n]&SideTag))
{
SaveMove(p,n);
}
}
}
}
return 0;
}
//将帅的走法
int KingMove(unsigned char p){
int kingdir[4] ={-0x10,+0x01,+0x10,-0x01}
int n;
for (int i = 0; i < 4; ++i)
{
n =p+kingdir[i];
if(nine[n])//nine[n]表示九宫格
{
if(!(position[n]&SideTag))
SaveMove(p,n);
}
}
return 0;
}
//生成士的走法
int AdvisorMove(unsigned char p)
{
int n;
int advisordir[4] ={-0x11,-0x0f,+0x11,+0x0f};
for (int i = 0; i < 4; ++i)
{
n =p+advisordir[i];
if(nice[n])
{
if(!(position[n]&SideTag))
SaveMove(p,n);
}
}
return 0;
}
//生成象的走法
int BishopMove(unsigned char p)
{
int bishopdir[4] ={-0x22,-0x1e,+0x22,+0x1e};
int bishopcheck[4] ={-0x11,-0x0f,+0x11,+0x0f};
for (int i = 0; i < 4; ++i)
{
n =p+bishopdir[i];
if(in(n))
{
m =p+bishopcheck[i];
if(!position[m])
{
if(!(position[n]&SideTag))
SaveMove(p,n);
}
}
}
return 0;
}
//车的走法生成
int RookMove(unsigned char p)
{
int rookdir[4] ={-0x01,-0x10,+0x01,+0x10};
for (int i = 0; i < 4; ++i)
{
for (int j = 1; j < 10; ++j)
{
n =p+j*rookdir[i];
if (!in(n)) break;
if (!position[n]) SaveMove(p,n);
else if(position[n]&SideTag) break;
else
{
SaveMove(p,n);
break;
}
}
}
return 0;
}
//炮的走法
int CannonMove(unsigned char p)
{
int jump=0;//翻山标志
int cannondir[4] =={-0x01,-0x10,+0x01,+0x10};
for (int i = 0; i < 4; ++i)
{
jump =0;
for (int j = 1; j < 10; ++j)
{
n =p+j*cannondir[i];
if(!in(n)) break;
if(!position[n])
{
if(jump ==0)SaveMove(p,n);
}
else
{
if(jump ==0)jump=1;
else
{
if(!(position[n]&SideTag))
SaveMove(p,n);
break;
}
}
}
}
return 0;
}
//卒的走法
int PawnMove(unsigned char p)
{
int pawndir[2][4] ={{{-0x01,+0x01,-0x10},{{-0x01,+0x01,+0x10}};
for (int i = 0; i < 3; ++i)
{
n =p+pawndir[side][i];
if(pawnposition[side][n])
{
if(!(board[n]&SideTag))
SaveMove(p,n);
}
}
return 0;
}