毕 业 设 计
中国象棋游戏的设计与实现
摘 要
中国象棋发展至今已有数千年的历史了,它是中华民族智慧的结晶。在我国,中国象棋的普及程度是其它棋类无法比拟的,大至国际、国内比赛,小至社区街道。如今,仅中国就有2亿人会下中国象棋,且中国象棋的发展趋势日益国际化。本文首先研究了中国象棋在计算机中的表示问题,讨论如何产生着法等一系列相关内容,其次研究了博弈树的搜索技术及在此基础上发展起来的相关剪枝算法。系统使用MFC文档视图体系结构和Visual C++开发工具,实现了一个具有一定棋力的中国象棋人机对弈程序。此博弈程序实现了人机博弈,悔棋,电脑难度设置,着法名称生成等功能。
关键词:中国象棋 人工智能 博弈树 Alpha-Beta搜索
目 录
1 前言 .................................................................... 1 1.1 中国象棋游戏设计背景和研究意义 ......................................... 1 1.2 国内外象棋软件发展概况 ................................................. 1 1.3 中国象棋游戏设计研究方法 ............................................... 1 1.4 本文的主要工作 ......................................................... 2 2 棋局表示和着法生成 ....................................................... 2 2.1 棋盘和棋子的表示 ....................................................... 2 2.2 着法生成 ............................................................... 4 3 走棋和博弈程序的实现 ..................................................... 5 3.1 博弈程序的实现 ......................................................... 5 3.1.1 搜索算法 ............................................................. 5 3.1.2 着法排序 ............................................................. 8 3.1.3 局面评估 ............................................................. 9 3.2 悔棋和还原功能的实现 .................................................. 11 3.3 着法名称显示功能的实现 ................................................ 12 3.4 胜败判定 .............................................................. 14 4 界面设计和系统实现 ...................................................... 15 4.1 界面设计 .............................................................. 15 4.2 系统实现 .............................................................. 17 5 总结 .................................................................... 21 参 考 文 献 ........................................................... 23 ABSTRACT ................................................................. 24 致 谢 ................................................. 错误!未定义书签。 仲恺农业工程学院毕业论文(设计)成绩评定表 ................. 错误!未定义书签。
I
1 前言
1.1 中国象棋游戏设计背景和研究意义
中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。在计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想,中国象棋历史悠久不仅源远流长,而且基础广泛,作为一项智力运动更成为我们游戏开发的首选对象。
中国象棋是一项智力游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。控制计算机的是人类,而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。
1.2 国内外象棋软件发展概况
最早的象棋软件是一副可以外出携带的电子棋盘,后来升级到电视游戏机。开始出现的一些容量很小的象棋软件如:DOS界面《将族》、WIN31程序的《中国象棋》等等,与其说人类下不过电脑,倒不如说是没有耐性等待电脑程序慢吞吞的搜索算法,有时甚至怀疑软件是否在搜索中死掉了。后来,网络上先后出现了真正的WINDOWS窗口界面的象棋专业高级软件《棋隐》、《象棋世家》、《象棋参谋》、《象棋奇兵》等。总而言之,各类象棋软件既有自身的优点,也存在共通性的缺陷,如:中局审势不够智能化,走不出弃子取势的人性化佳构,残局时智力明显低于人脑,难以走出残局例胜的必然着法等。放眼未来,象棋软件已经走完了一波持续上涨的行情,有可能出现逐步降温的滑坡趋势。 1.3 中国象棋游戏设计研究方法
本系统主要用 Visual C++ 进行开发,里面的MFC类库,使游戏开发更加方便,并利用人工智能相关搜索算法实现人工智能的着法生成,从而完善整个游戏的功能。
该象棋人机博弈系统实现的功能主要包括: 1、选手选择(人或电脑); 2、人机对弈(人与电脑竞技);
3、电脑棋力难度选择(电脑下棋能力难度选择,共有4级:按电脑配置选择难度);
1
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 //黑车
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;
有了对棋盘局面和着法的表示之后,程序才能够完成以下操作: 生成所有合法着法; 执行着法、撤销着法; 针对某一局面进行评估。
3
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库中国象棋游戏的设计与实现-毕业设计在线全文阅读。
相关推荐: