中国象棋程序[2]

1.局面的评估程序,举帅和炮的例子

#include <iostream>
#include <string>
using namespace std;

//计算灵活性分值
//灵活性由走法的个数衡量,不同棋子的权重也不同
//将军的灵活性
 for (int i = 0; i < 4; ++i)
 {
     n =p +kingdir[i];
     if (LegalPosition[side][n]&PositionMask[0])
     {
         if(!(board[n]&SideTag))
            fvalue[r] +=2;
     }
 }


 for (int i = 9; i < =10; ++i)
 {
    p =piece[SideTag +i];
    if (!p)
        continue; //分别检查两个炮是否在棋盘上
     for(int k=0; k < 4;k++)
     {
        overflag =0;//翻山的标志
        for (int j = 0; j < 10; ++j)
        {
            n =p+j*cannondir[k];
            if(!(LegalPosition[side][n]&PositionMask[0]))
                break;
            if (!position[n])
            {
                if (!overflag)
                {
                    fvalue[r] +=3;
                }
                else
                {
                    if (!overflag)
                        overflag =1;
                    else
                    {
                        if(!(position[n]&SideTag))
                            fvalue[r] +=3;
                        break;
                    }
                }
            }
        }

     }
 }

2 基本搜索算法

//完整的搜索过程
typedef struct 
{
    unsigned char from,to;
    unsigned char capture;
} move;

move movestack[128];//走法栈
int top;//栈顶
move bestmove;
int ply; //当前搜索深度
int maxDepth; //最大搜索深度
const int maxVlaue =3000;//估值最大值

//检测走棋方是否被将军
int check(){};

int SaveMove(unsigned char from,unsigned char to,move *mv)
{
    //
    unsigned char p;
    p =position[to];//to处的棋子
    piece[position[from]] =to;//将from处的棋子移动到to处
    if(p)//to处有棋子
        piece[p] =0;
    position[to] =position[from];
    position[from] =0; //行子

    ……
    int r =check(side)
    //如果meiyou将军接下来
    if(!r)
    {
       mv->from =from;
       mv->to =to;
       return 1;
    }
    return 0;

}

//每个棋子的走法
int GenAllMove(move *movearray)
{
    move *mv =movearray;

    p =piece[SideTag];
    if(!p)
        return 0;//将军则结束
    //将军走棋
    for (int i = 0; i < 4; ++i) //四个方向
    {
        n =p +kingdir[i];
        if(LegalPosition[side][n] & PositionMask[0])//将军是否在合法位置
        {
            if(!(board[n]&SideTag))
                if(SaveMove(p,n,mv)) //保存走法,将军则不保存
                    mv++;
        }
    }

    ……

}

int ChaageSide()
{
    side =1 -side;
    return 0;
}

//走法栈
bool MakeMove(move m)
{
    ……
}

int UnMakeMove()
{
    ……
}

极大极小搜索算法递归调用,搜索算法另表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值