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()
{
……
}
极大极小搜索算法递归调用,搜索算法另表