电脑棋力难度选择(电脑下棋能力难度选择,共有4级:按电脑配置选择难度);
4、悔棋、还原;
5、着法名称显示(象棋走棋规范名称)。
1.4 本文的主要工作
第一部分主要介绍了中国象棋游戏开发的背景及意义、国内外象棋软件的发展概况和象棋游戏的设计研究方法;
第二部分介绍了棋局表示方法和着法生成;
第三部分介绍了走棋和博弈程序的实现;
第四部分介绍了界面设计和系统的实现。
2 棋局表示和着法生成
2.1 棋盘和棋子的表示
对于中国象棋棋盘局面的表示可采用传统而简单的"棋盘数组"。即用一个9*10的数组来存储棋盘上的信息,数组的每个元素存储棋盘上是否有棋子。这种表示方法简单易行。按此方法棋盘的初始情形如下所示:
BYTE CChessBoard[9][10] = {
R, 0, 0, P, 0, 0, p, 0, 0, r,
H, 0, C, 0, 0, 0, 0, c, 0, h,
E, 0, 0, P, 0, 0, p, 0, 0, e,
A, 0, 0, 0, 0, 0, 0, 0, 0, a,
K, 0, 0, P, 0, 0, p, 0, 0, k,
A, 0, 0, 0, 0, 0, 0, 0, 0, a,
E, 0, 0, P, 0, 0, p, 0, 0, e,
H, 0, C, 0, 0, 0, 0, c, 0, h,
R, 0, 0, P, 0, 0, p, 0, 0, r
};
给所有棋子定义一个值:
#define R_BEGIN R_KING
#define R_END R_PAWN
#define B_BEGIN B_KING
#define B_END B_PAWN
#define NOCHESS 0 //没有棋子
黑方:#define B_KING 1 //黑帅
#define B_CAR 2 //黑车
#define B_HORSE 3 //黑马
#define B_CANON 4 //黑炮
#define B_BISHOP 5 //黑士
#define B_ELEPHANT 6 //黑象
#define B_PAWN 7 //黑卒
红方:#define R_KING 8 //红将
#define R_CAR 9 //红车
#define R_HORSE 10//红马
#define R_CANON 11//红炮
#define R_BISHOP 12//红士
#define R_ELEPHANT 13//红相
#define R_PAWN 14//红兵
判断颜色:
#define IsBlack(x) (x>=B_BEGIN && x<=B_END)//判断某个棋子是不是黑色
#define IsRed(x) (x>=R_BEGIN && x<=R_END)//判断某个棋子是不是红色
对于着法的表示,直接借用棋盘数组的下标来记录着法的起点和目标点。至于是什么棋子在走,以及是否吃子、吃的是什么子,在着法结构中并不记录。这些信息由外部读取棋盘上起点、终点的数据获得。着法结构定义如下,其中还包含了对着法的历史得分的记录项,以供后面要讲到的"历史启发"所用。
typedef struct
{
short nChessID; //表明是什么棋子
CHESSMANPOS From;//起始位置
CHESSMANPOS To; //走到什么位置
int Score; //走法的分数
}CHESSMOVE;
有了对棋盘局面和着法的表示之后,程序才能够完成以下操作:
生成所有合法着法;
执行着法、撤销着法;
针对某一局面进行评估。
因而,棋局表示好比是整个程序(计算机下棋引擎部分)的地基,之后所有的操作都将建立在其基础上。
2.2 着法生成
在着法生成器中,采用的基本思想就是遍历整个棋盘(一个接一个地查看棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列。
这里谈到的"合法着法"包括以下几点:
1、各棋子按其行子规则行子。诸如马跳"日"字、象走"田"字、士在九宫内斜行等等(这里需要特别注意的是卒(兵)的行子规则会随其所在位置的不同而发生变化--过河后可以左右平移)。
2、行子不能越出棋