文档详情

中国象棋游戏设计与实现毕业论文

好**
实名认证
店铺
DOC
56KB
约33页
文档ID:106504814
中国象棋游戏设计与实现毕业论文_第1页
1/33

中国象棋游戏的设计与实现-毕业论文毕 业 设 计中国象棋游戏的设计与实现摘 要中国象棋发展至今已有数千年的历史了,它是中华民族智慧的结晶在我国,中国象棋的普及程度是其它棋类无法比拟的,大至国际、国内比赛,小至社区街道如今,仅中国就有2亿人会下中国象棋,且中国象棋的发展趋势日益国际化本文首先研究了中国象棋在计算机中的表示问题,讨论如何产生着法等一系列相关内容,其次研究了博弈树的搜索技术及在此基础上发展起来的相关剪枝算法系统使用MFC文档视图体系结构和Visual C++开发工具,实现了一个具有一定棋力的中国象棋人机对弈程序此博弈程序实现了人机博弈,悔棋,电脑难度设置,着法名称生成等功能关键词:中国象棋 人工智能 博弈树 Alpha-Beta搜索 目 录1 前言 11.1 中国象棋游戏设计背景和研究意义 11.2 国内外象棋软件发展概况 11.3 中国象棋游戏设计研究方法 11.4 本文的主要工作 22 棋局表示和着法生成 22.1 棋盘和棋子的表示 22.2 着法生成 43 走棋和博弈程序的实现 53.1 博弈程序的实现 5 搜索算法 5 着法排序 8 局面评估 93.2 悔棋和还原功能的实现 113.3 着法名称显示功能的实现 123.4 胜败判定 144 界面设计和系统实现 154.1 界面设计 154.2 系统实现 175 总结 21参 考 文 献 23ABSTRACT 24致 谢 25仲恺农业工程学院毕业论文 设计 成绩评定表 26 1 前言 中国象棋游戏设计背景和研究意义中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。

自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中在计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想,中国象棋历史悠久不仅源远流长,而且基础广泛,作为一项智力运动更成为我们游戏开发的首选对象中国象棋是一项智力游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈控制计算机的是人类,而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向 国内外象棋软件发展概况最早的象棋软件是一副可以外出携带的电子棋盘,后来升级到电视游戏机开始出现的一些容量很小的象棋软件如:DOS界面《将族》、WIN31程序的《中国象棋》等等,与其说人类下不过电脑,倒不如说是没有耐性等待电脑程序慢吞吞的搜索算法,有时甚至怀疑软件是否在搜索中死掉了后来,网络上先后出现了真正的WINDOWS窗口界面的象棋专业高级软件《棋隐》、《象棋世家》、《象棋参谋》、《象棋奇兵》等。

总而言之,各类象棋软件既有自身的优点,也存在共通性的缺陷,如:中局审势不够智能化,走不出弃子取势的人性化佳构,残局时智力明显低于人脑,难以走出残局例胜的必然着法等放眼未来,象棋软件已经走完了一波持续上涨的行情,有可能出现逐步降温的滑坡趋势中国象棋游戏设计研究方法本系统主要用 Visual C++ 进行开发,里面的MFC类库,使游戏开发更加方便,并利用人工智能相关搜索算法实现人工智能的着法生成,从而完善整个游戏的功能该象棋人机博弈系统实现的功能主要包括:1、选手选择(人或电脑);2、人机对弈(人与电脑竞技);3、电脑棋力难度选择(电脑下棋能力难度选择,共有4级:按电脑配置选择难度);4、悔棋、还原;5、着法名称显示(象棋走棋规范名称) 本文的主要工作第一部分主要介绍了中国象棋游戏开发的背景及意义、国内外象棋软件的发展概况和象棋游戏的设计研究方法;第二部分介绍了棋局表示方法和着法生成;第三部分介绍了走棋和博弈程序的实现;第四部分介绍了界面设计和系统的实现 棋局表示和着法生成 棋盘和棋子的表示对于中国象棋棋盘局面的表示可采用传统而简单的“棋盘数组”即用一个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; 有了对棋盘局面和着法的表示之后,程序才能够完成以下操作: 生成所有合法着法; 执行着法、撤销着法; 针对某一局面进行评估 因而,棋局表示好比是整个程序(计算机下棋引擎部分)的地基,之后所有的操作都将建立在其基础上 着法生成在着法生成器中,采用的基本思想就是遍历整个棋盘(一个接一个地查看棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列这里谈到的“合法着法”包括以下几点:1、各棋子按其行子规则行子。

诸如马跳“日”字、象走“田”字、士在九宫内斜行等等(这里需要特别注意的是卒(兵)的行子规则会随其所在位置的不同而发生变化――过河后可以左右平移)2、行子不能越出棋盘的界限当然所有棋子都不能走到棋盘的外面,同时某些特定的棋子还有自己的行棋界限,如将、士不能出九宫,象不能过河3、行子的半路上不能有其它子阻拦(除了炮需要隔一个子才能打子之外)以及行子的目的点不能有本方的棋子(当然不能自己吃自己了)4、将帅不能碰面(本程序中只在生成计算机的着法时认为将帅碰面是非法的,而对用户所走的导致将帅碰面的着法并不认为其非法,而只是产生败局罢了)产生了着法后要将其存入着法队列以供搜索之用,由于搜索会搜索多层(即考虑双方你来我往好几步,这样才有利于对局面进行评估以尽可能避免“目光短浅”),所以在把着法存入着法队列的时候还要同时存储该着法所属的搜索层数因此可以将着法队列定义为二维数组m_MoveList[8][70],其中第一个数组下标为层数,第二个数组下标为每一层的全部着法数关于搜索层数,设定为4,实际使用的是1到3(在界面中将其限定为1―3)搜索层数的增加会显著提高电脑的下棋水平(当然计算机的棋力在很大程度上也依赖于局面评估)。

在配置为1.5G,512M内存的计算机上最多只能搜索3层,再多将导致搜索时间达到令人无法容忍的地步(这里还需要特别说明的是,搜索的速度也和着法生成的效率以及局面评估的复杂度有关,因为每分析一个结点都要执行这两种操作)对于每一层的着法数,也就是当前下棋方针对当前局面的所有可选的合法着法,据有关数据统计在象棋实战中一般最多情况下也就五六十种定义第二个数组下标为70,应当可以保证十分的安全 走棋和博弈程序的实现 博弈程序的实现 搜索算法搜索算法对于整个下棋引擎来说都是至关重要的它如同程序的心脏,驱动着整个程序搜索算法的好坏直接影响着程序执行的效率(从某种角度上,它影响着计算机的下棋水平因为,计算机必须在有限的时间内完成思考,搜索速度快意味着在相同的时间内程序可以“看”得更远,“想”的更多)关于棋类对弈程序中的搜索算法,已有成熟的Alpha-Beta搜索算法以及其它一些辅助增强算法(还有众多基于Alpha-Beta算法的派生、变种算法)我们在程序中直接借鉴了Alpha-Beta搜索算法并辅以历史启发本节先介绍Alpha-Beta搜索算法:在中国象棋里,双方棋手获得相同的棋盘信息他们轮流走棋,目的就是吃掉对方的将或帅,或者避免自己的将或帅被吃。

图1 博弈树又此,可以用一棵“博弈树”(图1)来表示下棋的过程――树中每一个结点代表棋盘上的一个局面,对每一个局面(结点)根据不同的走法又产生不同的局面(生出新的结点),如此不断进行下去直到再无可选择的走法,即到达叶子结点(棋局结束)中国象棋的博弈树的模型大概如下图所示,可以把其中连接结点的。

下载提示
相似文档
正为您匹配相似的精品文档