中国象棋程序[1]

写于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值