中国象棋博弈系统毕业设计

上传人:沈*** 文档编号:67442739 上传时间:2022-03-31 格式:DOC 页数:36 大小:970.02KB
返回 下载 相关 举报
中国象棋博弈系统毕业设计_第1页
第1页 / 共36页
中国象棋博弈系统毕业设计_第2页
第2页 / 共36页
中国象棋博弈系统毕业设计_第3页
第3页 / 共36页
点击查看更多>>
资源描述
*大学本科毕业论文(设计、创作)题目: 中国象棋博弈系统的设计与实现 学生姓名: * 学号: * 院(系): 计算机科学与技术学院 专业: * 入学时间: 年 月导师姓名: 职称/学位: 导师所在单位: 计算机科学与技术学院 完成时间: 年 月中国象棋博弈系统的设计与实现摘 要机器博弈被认为是人工智能领域最具挑战性的研究方向之一国际象棋的计算机博弈已经有了很长的历史,并且经历了一场波澜壮阔的搏杀,“深蓝”计算机的胜利也给人类留下了难以忘怀的记忆中国象棋博弈系统是将计算机知识和中国象棋知识结合起来并在此基础上实现人与机器的对弈。作为软件工程专业的本科毕业生,能够结合自己大学所学并且完成自己喜欢的象棋游戏的人机博弈一直是我的梦想与追求。将自己的想法实现在电脑上,一直是我学习不懈的动力。本文结合在中国象棋机器博弈方面的实践经验,立足于象棋规则,棋局数据结构,走法产生器,局面评估函数和博弈树搜索策略,设计并实现了基于历史启发排序的Alpha-Beta剪枝搜索算法的中国象棋博弈系统。一种事物,当它具有丰富而独特的表现力时,当它能给人们带来由衷的欢愉时,当它表现为许许多多鲜明生动的形象时,它就是一种艺术。正犹如机器博弈,搜索策略,人工智能。关键词:计算机博弈; alphaBeta 剪枝;中国象棋;历史启发Intelligent Chinese Chess System Design and ImplementationAbstractMachine game is considered to be the most challenging field of artificial intelligence research direction of the computer game. Chess has a long history, and experience a mammoth adventurous, dark blue computer victory also give human left unforgettable memory. Chinese chess game system combines with the computer knowledge and Chinese chess knowledge ,on the basis of it completes the game between human and machine. As a software engineering graduate, to combine my university learned and finish the man-machine game chess game has always been my dream to pursue, realized my ideas in my computer is my study unremitting power.This article combine Chinese chess machine game experience,based on chess rule, data structures, game moves generator, the situation assessment function and game tree search strategy, design and realized Chinese chess game system which based on historical inspire sort of Alpha-Beta pruning search algorithm.With the practical experience in Chinese chess computer game, a detailed analysis and research has been done .Based on those, I designed and implemented the Intelligent Chinese Chess System . A kind of things, when it has rich and unique expressive, when it can give people bring heartfelt joy, when it is shown as many vivid image, it is a kind of art . Just as the machine game, search strategy, artificial intelligence.Key Words: computer game;search tecniques alpha-beta pruned; Chinese chess; historical inspiration目录1 引言11.1 选题的背景和意义11.2 发展动态及研究现状12 系统的分析与设计22.1 走法规则22.1.1车22.1.2马32.1.3象相32.1.4士42.1.5将帅52.1.6炮62.1.7兵卒72.2 系统架构82.3 数据结构82.4走法产生器92.5 估值函数92.6 悔棋模块103 搜索策略113.1 极大极小值算法123.2 Alpha-Beta剪枝算法123.3 搜索算法的优化134 系统的实现164.1 系统的具体实现流程图164.2 人机交互界面164.3 系统核心模块174.3.1 象棋走法规则174.3.2 走法产生器194.3.3 估值函数214.3.4 搜索策略245 实验分析265.1 极大极小算法与Alpha-Beta算法的比较265.2 搜索中基于历史启发的排序算法的比较265.3搜索深度与搜索效率的均衡275.4 不同水平的棋手与本系统的博弈28结论29主要参考文献30致谢31301 引言1.1 选题的背景和意义在人类文明发展的初期,人们便开始进行棋类博弈的游戏了。近几十年来,随着计算机硬件和软件技术的不断发展,人们开始对计算机能否战胜人脑这个话题产生了浓厚的兴趣。从1980开始,电脑博弈便开始逐渐大规模地向人类智能发起了挑战,到了1997年,IBM超级电脑Deeper Blue 击败了当时的国际象棋冠军卡斯帕罗夫,成为了人工智能挑战人类智能发展的一个重要里程碑。许多学者认为,对于人工智能研究而言,象棋的重要作用不亚于遗传学研究中的果蝇。人类对机器博弈的研究衍生了大量的研究成果,这些成果对更广泛的领域产生了重要影响。人工智能的先驱们曾认真的表明:如果能掌握下棋的本质,也许就掌握了人类智能行为的核心;那些能够存在于下棋活动中的重大原则,或许就存在于其它任何需要人类智能的活动中。因此对于中国象棋人机博弈问题的研究意义重大。而当今对中国象棋的研究也正如专家们所期望的那样在蓬勃地发展着。中国象棋不仅是中国传统智慧的体现,同时也具有着比国际象棋更高的复杂度,如何让机器具有智能,与人进行对弈成了本课题研究的一个重要问题。通过本课题的研究,掌握智能知识的表示与计算、搜索,不仅是对所学知识的锻炼,更是在人工智能领域的有意义的探索。11.2 发展动态及研究现状和国际象棋博弈系统相比,中国象棋博弈系统的研究起步比较晚,是八十年代开始的。在这个时候计算机国际象棋取得重大突破,1983年美国贝尔公司的电脑参加美国人类比赛,取得了不错的成绩,被授予大师称号。于是有专家学者想如何将国际象棋电脑技术移植到中国象棋上来,以带动中国象棋电脑较快的发展;同时中国象棋从技术研究进入理论研究,有关开局、中局、残局理论以及象棋对策相继建立起来,为中国象棋计算机博弈提供了理论基础。1981年张耀腾发表的人造智慧在电脑象棋上的应用,他提出审局函数为静态子力值,棋子位置值,棋子灵活度值,威胁与保护等四项之和。但该文主要以残局做实验,缺乏完整对局的考虑。1982年廖嘉成发表的利用计算机象棋的实验就进了一步,包括开局、中局、残局。1983年黄少龙、周玉龙合作制成象棋排局系列软盘专家系统与人对弈。到了90年代,中国象棋计算机博弈的应用开始发展起来,人们研究出了各种博弈软件。比较著名的软件有台湾的吴身润的中国象棋、光谱公司出品的将族、晟业编制的象棋水浒战、象棋武林帖。而且涉足这个领域比较早的是台湾的一些专家学者。近几年,在内地也涌现出一批对中国象棋人机博弈问题感兴趣的高校、单位及个人,而且进入21世纪以后,中国象棋计算机博弈的研究受到越来越多的学者的关注,比较著名的博弈软件如表1所示:表1著名中国象棋计算机博弈程序程序 作者 地区纵马奔流 涂志坚 广州中山大学谢谢象棋大师 法国电脑公司 法国ELP 郑武尧、陈志吕 台湾SHIGA(象棋世家) 郑明政、颜士净 台湾SHCC(神乎棋技) SAI team 美国Cyclone(象棋旋风) 陈朝阳 北京CONTEMPLATION 千虑 陈志昌、许舜钦 台湾棋天大圣 王骄 东北大学象棋奇兵 赵明阳 中国每年也会有中国象棋计算机博弈的国际奥林匹克大赛,这其中有2003年的世界冠军“纵马奔流”,2004年的世界冠军“谢谢象棋大师”,2005年的世界冠军“象棋奇兵”,2006、2007年的世界冠军“棋天大圣”, 2008年的世界冠军“倚天”。 这些都体现了中国象棋的人机博弈的研究的受关注程度;虽然如此,但中国象棋的人机博弈的研究比国际象棋还是晚了几十年,并且在搜索算法等方面的研究还与国际象棋相距甚远。12 系统的分析与设计 2.1 走法规则 根据象棋规则知识,从棋局矩阵采集相关信息,用if-else语句判断棋子走法是否合法,以下给出每种棋子走法规则判断的程序流程图:2.1.1 车是否共线两棋子间是否还有棋子源位置目地位置走法合法走法非法否是否是图1 车走法规则2.1.2 马是否走横日或竖日是否绊马脚源位置目地位置走法合法走法非法否是否是图2 马走法规则2.1.3 象相是否在己方领域是否塞象眼源位置目地位置走法合法走法非法否是否否是是是否走田字图3 象/相走法规则2.1.4 士是否在己方九宫源位置目地位置走法合法走法非法否是是否是否走斜线一步图4 士走法规则2.1.5 将帅是是是否走一步源位置目地位置走法非法否是否将帅在一条纵线上是否将帅间没有棋子间隔否否是否走法合法是是否在己方九宫图5 将帅走法规则2.1.6 炮是否走直线源位置目地位置走法非法是是否棋子间间隔一个棋子走法合法是否目地位置是否有棋子否是是否棋子间没有棋子否是否图6 炮走法规则2.1.7 兵卒源位置是否在己方领域源位置目地位置走法合法走法非法否是是否是否向前走一步是否向前或横走一步否是图7 兵卒走法规则2.2 系统架构中国象棋博弈系统人机交互模块电脑AI计算出最佳一步走法走法产生器象棋走法规则悔棋功能搜索策略历史启发表棋局估值函数基于历史启发Alpha-Beta剪枝搜索算法堆栈压入或弹出人机对弈走法人机交互界面响应事件和绘图图8系统层次方框图中国象棋博弈系统的输入为玩家通过人机交互界面走一步棋,输出为电脑走一步棋。博弈系统要做到的就是如何得出最佳的一步棋。博弈系统根据玩家走的一步棋,传入棋局矩阵信息,电脑思考最佳一步,以传入棋局为博弈树根节点,对每个节点由走法产生器产生当前棋局下棋方可以走的所有走法,即该节点的子节点,直到满足达到搜索层数或棋局已分出高下的条件将不再生成子节点。搜索树对奇数层搜索估值取最大子节点,偶数层搜索估值取最小子节点。除叶子节点通过估值函数生成估值外,所以节点均是从子节点根据博弈树搜索规则获得返回的子节点最大/小子节点估值,直到根节点找到返回估值的子节点为最佳子节点,该节点的走法也就是最佳走法。系统算法的核心是搜索策略,搜索策略直接影响系统的效率,对搜索层数的深度与搜索时间的均衡是博弈系统的关键。3,4,52.3 数据结构数据结构是一个程序的骨架,选择一种好的数据结构可以使程序的运行效率大大提高。棋盘表示就是使用一种数据结构来描述棋盘上的信息,以便程序知道博弈的状态。棋盘的数据表示直接影响到程序的时间及空间复杂度。为了追求更高效率,研究人员针对中国象棋提出了多种不同的表示方法。中国象棋的棋盘表示中最典型的是用一个109的二维数组,数组中每个元素代表棋盘上的一个交点,其值表明这个交点上放置的是一个什么棋子或是没有棋子. 3,4以下为本设计的棋盘矩阵的象棋开局数据结构表示,包括不同棋子对应的数据:private int, ChessMatrix = new int10, 9 1,2,3,4,7,4,3,2,1,/车馬象士将士象馬车 0,0,0,0,0,0,0,0,0, 0,6,0,0,0,0,0,6,0,/空炮空空空空空炮空 5,0,5,0,5,0,5,0,5,/卒空卒空卒空卒空卒 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 15,0,15,0,15,0,15,0,15,/兵空兵空兵空兵空兵 0,16,0,0,0,0,0,16,0, /空炮空空空空空炮空 0,0,0,0,0,0,0,0,0, 11,12,13,14,17,14,13,12,11/车馬相士帅士相馬车 ;/初始化棋盘2.4 走法产生器l 车炮:以源位置为中心纵向和横向产生走法,判断该走法是否合法。l 马:以源位置为中心分别朝左上,右上,左下,右下产生横日和竖日走法,判断该走法是否合法。l 象相:以源位置为中心分别朝左上,右上,左下,右下产生田字走法,判断该走法是否合法。l 士:以源位置为中心分别朝左上,右上,左下,右下产生斜线一步走法,判断该走法是否合法。l 将帅:以源位置为中心上下左右产生一步走法和将帅共线对杀的走法,判断该走法是否合法。l 兵卒:以源位置为中心上下左右产生一步走法,判断该走法是否合法。将以上产生的合法走法加入产生走法队列。42.5 估值函数局面估值就是通过既有的棋类知识来评估一个局面优劣的过程。这一过程对具体的棋类知识依赖程度很深,但是仍有一般性的规律可循。目前在计算机象棋博弈中常用的估值方法主要采用静态估值方法。本系统的估值函数包括:棋子固定价值,棋子位置附加值,棋子灵活性,棋子对棋盘的控制,棋子间的关系几部分。棋子固定价值指的是对棋盘中的每一个棋子,根据它的重要性和走法的丰富程度赋予其一个特定的值。在棋盘上,棋子多者占优,棋子少者为劣。在中国象棋的对弈中,由于一般以将死对方的将(帅)作为结束,因此,通常赋值的规则是为将(帅)赋予一个远大于其他棋子的子力之和的值。根据经验,每一种棋子的基本价值:兵100士250象250车500马350炮350将10000。1同样的棋子在不同位置上起的作用是不同的,最明显的是兵(卒)过河之前与之后它的作用和攻击力以及对对方的威胁显然是不一样的,而当兵卒一旦到了底线附近,它对将(帅)的威胁度将大大下降。棋子灵活性描述的是棋子的活动范围,即棋子向各处调动的可能性大小。棋子的威力能否充分发挥,与灵活性直接相关。本方棋子可以走的点越多,说明本方棋子的灵活性越大。例如车在纵横线上遇到障碍物、马被周围棋子绊脚等,都降低了灵活性,也降低了威力的发挥,灵活性的计算是把棋子在棋盘上所能够移动到达的位置数作为灵活性计算,给予评分。各种棋子的灵活性(每多走一个位置应加的分值):兵15士1象1车6马12炮6将0。1可以用下面的表达式求某一方棋子灵活性:Mobility=Sum(MoveNum*MoveValue)其中,MoveNum是某种棋子的合法走法数量,MoveValue是该种棋子每一走法的价值,sum是对所有棋子的灵活性价值求和。Mobility就是所有棋子的灵活性分数。一方对棋盘控制的棋盘区域越多,那么他就越具有主动性。在象棋中,如果一位置落在某方棋子的合法走步上,就可以认为被该方控制。如果某一位置同时落在双方的合法走步上,可以根据双方控制该位置的棋子数量及棋子价值来决定孰优孰劣。能控制更多位置的一方应在这项评分上占优。在中国象棋博弈中,每个棋子都不是孤立存在的,他们之间构成了各种相互关系。如一棋子下一步将被吃掉,则应该给一个负的附加值。而如果周围有己方棋子对其进行了保护,也就是说,对方在理智的情况下不会去吃该棋子,那么该棋子没有受到威胁,价值不变。棋子关系的评估应考虑到该谁走棋的问题。如果某个红马落在黑炮的合法走步之内,但此时轮到红方走棋,应认为红马受到的威胁较轻。而如果此时轮到黑方走棋,就应认为红马受到的威胁很大,应减去一个相对较大的值了。1,6初始化数组基本价值:QJ_BaseValuey, x = 0;灵活性数组:QJ_FlexibilityValuey, x = 0;棋子受保护数组:QJ_Guardy, x = 0;棋子受威胁数组:QJ_Attacky, x = 0;扫描棋盘,找出每一个棋子,对每一棋子产生可能达到的位置,加入可达位置队列对每种可能达到的位置,产生其威胁/保护的棋子,还有其灵活性扫描数组,根据棋子基本价值,棋子附加值,灵活性以及保护威胁数组计算估值遍历可达位置队列图9 估值函数流程图2.6 悔棋模块记录每一步走法的源位置坐标,源位置棋子,目地位置坐标,目地位置棋子。采用压栈操作,悔棋采用退栈。悔棋最大步数为10步,采用队列覆盖10步以外棋子。下图为悔棋模块流程图:玩家下棋记录玩家走法源位置坐标,源位置棋子,目地位置坐标,目地位置棋子记录电脑走法源位置坐标,源位置棋子,目地位置坐标,目地位置棋子电脑下棋将记录玩家与电脑走法的数据压入堆栈(栈顶 + 1) % 11 =栈底栈底= (栈底 + 1) % 11以队列的形式覆盖10步以外的走法信息堆栈【栈顶】=走法数据栈顶= (栈顶 + 1) % 11是否悔棋将记录玩家与电脑走法的数据弹出堆栈栈顶=栈底栈顶= (栈顶 + 10) % 11走法数据=堆栈【栈顶】根据弹出玩家与电脑走法的数据记录修改棋局是是无法悔棋否否否是图10 悔棋模块流程图3 搜索策略中国象棋博弈树非常庞大,完全建立博弈树是不可能的,唯一的解决方法就是让博弈树扩展到计算机运算可以接受的深度,然后对没有分出胜负的叶子节点给出一个尽量准确的打分,表示此局面下取得胜利的可能性,这个打分是由评估函数计算给出的,将搜索树展开是着法生成的功能,而搜索引擎则是尽可能缩小树的规模,避免一切冗余的计算,这也是计算机博弈中搜索引擎研究的重点。3.1 极大极小值算法极大极小值算法(Minimax Algorithm)是解决博弈树问题的基本方法。香农教授早在1950年首先提出了“极大极小算法”,奠定了计算机博弈理论的基础。极大极小值算法的原则是:博弈双方所要达到的目的相反,一方要寻找的利益是另一方失去的利益,博弈的一方总是希望下一步是子节点中取值最大者,而另一方希望下一步是子节点中取值最小者。在象棋博弈中,极大极小值算法体现在始终站在博弈一方的立场上给棋局估值,有利于这一方的棋局给予一个较高的价值分数,不利于这一方(有利于另一方)的给予一个较低的价值分数,双方优劣不明显的局面给予一个中间值分数。在这一方走棋的时候,选择价值最大的子节点走法,即实行“Max搜索”,另一方走棋则选择价值最小的子节点走法,即实行“Min搜索”,这就是象棋博弈中的一个极大极小过程。例如,如果红方为走棋方,它在偶数层的着法选择是要在其全部子节点中找到评估值最大的一个,实行“Max搜索”,称为MAX方,而其敌对方即黑方在奇数层的着法选择则是在其全部子节点中要找到评估值最小的一个,实行“Min搜索”,称为MIN方。图11表示了一个极大极小搜索过程,粗箭头为最佳路径片段。1,7图 11极大极小值算法示意图3.2 Alpha-Beta剪枝算法由于完整的博弈树过于庞大,程序不能也没有必要搜索整棵博弈树的所有节点,而需要像人类棋手一样有选择性地进行搜索,对于一些已经确定不佳的走步可以将以它根节点的子树剪掉(cut-off/pruning),以提高单位时间内搜索的节点数。上述极大极小值搜索过程中,遍历了整个的博弈树,这样的搜索算法效率低,搜索量非常大,如果要减少搜索量,又可能影响搜索效果。但假如将叶节点的评估计算与树的展开同时进行,然后对博弈树进行必要的裁剪,就可能大量减少所需搜索的节点数目,并且保持搜索效果不变。这个技术叫-剪枝搜索。它是一种基于-搜索的深度优先搜索,是所有剪枝算法的基础,它是根据极大极小搜索规则进行的。图12和图13给出两个剪枝示意图:MAXMINMAX图 12 剪枝示意图MIN MAXMIN图13 剪枝示意图在图12所示的极大极小树片段中,按照极大极小值搜索规则,从左路分枝的叶节点倒推得到第一层MAX节点的值为5,可表示此时的着法最佳值,记为,显然此值可作为MAX方着法指标的下界。在搜索中路分枝时,因为第二层着法的选择是取第三层节点的最小值,即取M州(8,3,“”),而无论“”中为何值,都不会比5大(最大为3),故可以将“”表示的节点及其后继节点剪掉,不再考虑此节点的延伸。同理搜索右路分枝,也可以进行剪枝操作。此类剪枝称为-剪枝。图12中通过剪枝,最后得到如粗箭头所示的最佳路径片断。图13所示的极大极小树片段中,由左路分枝的叶节点倒推得到第一层MIN节点的值为n,可表示此时对方着法的钳制值,记为。显然此值可作为MIN方可能实现着法指标的上界。在搜索中路分枝时,因为第二层着法的选择是取第三层节点的最大值,即取MAX(5,12,“”),而无论“”中为何值,都不会比11小(至少为12),故可以将“”表示的节点及其后继节点剪掉,不再考虑此节点的延伸。同理搜索右路分枝,进行剪枝操作。此类剪枝称为剪枝。1,73.3 搜索算法的优化-剪枝搜索能够让我们省略许多节点的搜索,不只是节点本身,而且包括节点下面的子树,这样-剪枝搜索需要遍历的节点数远少于极大极小算法所遍历的节点,也就节省了大量的时间开销,并且仍不失为穷尽搜索的本性,但-剪枝的剪枝效果即搜索节点数与博弈树节点的搜索次序密切相关。极大极小值搜索是所有搜索算法的基础,而-剪枝搜索是所有剪枝算法的基础。但在实际的博弈系统设计中,要提高程序的搜索速度和搜索深度,还必须利用搜中得到的一些启发式信息来加快搜索,目前己经有很多对基本搜索算法的增强算法。 在-剪枝搜索中,剪枝效率几乎完全取决于节点的排列顺序,如何调整待展开的走法的顺序,是提高搜索效率的关键。在搜索的过程中,往往有一些启发性的信息可以利用,如果利用这些信息在相似的局面下对走法进行优化排序,或者对相同的局面不再搜索,而直接返回以前搜索的结果,都会对搜索产生明显的加速作用。围绕着法排序,己经出现了许多优秀的搜索算法与举措,例如历史启发,杀手启发,置换表等等。历史启发(History Heuristic)实际上就是记录搜索过的好的走法,并在后续着法中优先搜索。根据经验,一些以前经过搜索认为最佳的走法,其后续走法仍然有很大可能成为最优的走法。在搜索过程中,每找到一个好的着法,就将与该走法相应的历史得分作一增量,一个多次被搜索并确认为好的走法的历史记录分值会较高,当搜索中间节点时,将走法根据其历史得分排序,以获得较佳的排列顺序。杀手启发(Killer Heuristic)是基于这样的思想:在搜索过程中,有许多走法一经搜索就引发了剪枝,且这些走法通常是同一个走法,这样,为每一层记录引发剪枝最多的走法即杀手走法,当下一次搜索到同样的深度时,如果杀手走法是该局的一个合法走法,就优先搜索杀手走法。杀手启发是一种特殊的历史启发,它不依赖于人类的知识,具有普遍性。置换表 (TransposilionTable)是用一张表把搜索过的信息记录下来,在后续的搜索中,察看记录在表中的这些信息,如果将要搜索的某个节点已经有记录,就直接利用记录下来的结果引入到当前的搜索中,以减少搜索。置换表不同于历史启发表和杀手表,不必在每次搜索之前都清空,而是一直维持这些数据,作为以后搜索的信息。另外,空着搜索(Null Move)也是搜索算法中一种很有效的搜索策略,它的思想是放弃本方的走棋权利,让对方连续走棋,如果得到的分数还大于原来的值,就可以简单地返回值,在此分枝下的搜索意义不大,免于搜索。空着搜索明显降低了搜索的数量,导致搜索深度显著提高,并且危险性比较小,实现较为简单。1,7,8本毕业设计针对各种搜索算法,对比发现,仅采用基于历史得分排序的Alpha-Beta剪枝算法的搜索策略可以在搜索层数为5时达到很好的效率与时间均衡,故毕业设计没有采用杀手启发,置换表,空着搜索等策略继续优化。下图为基于历史得分排序的alpha-beta剪枝算法流程图:判断棋局是否结束深度,alpha值,beta值返回胜利/失败极值判断是否达到指定搜索深度调用估值函数,返回估值调用走法产生器产生所有可能走法调用排序按每种走法的历史得分排序遍历每一种走法按走法修改棋局递归调用本函数:score = -AlphaBeta(Depth - 1, -Beta, -Alpha);恢复棋局AlphaBeta剪枝更新历史记录分数返回估值alpha值是是否否图14 基于历史得分排序的alpha-beta剪枝算法流程图4 系统的实现4.1 系统的具体实现流程图等待用户下棋,人机交互界面传入参数,更新棋局状态更新棋局,可视化显示电脑下的一步棋当前棋局走法产生器走法队列M1/M2/M3/Mn搜索算法+搜索辅助局面评估获得最优走法图15 系统具体实现流程图4.2 人机交互界面前台展示的与用户的交流平台,实现功能:l 对象棋智能难易的选择l 实现鼠标移动定位棋子,鼠标单击选择和移动棋子。可视化实现象棋的博弈。l 将程序思考状态及时通过进度条显示出来。l 对电脑每一步走法给用户产生提示信息。如吃子,将军,本次计算耗时,游戏是否结束。l 提供悔棋,开始棋局,选择难易功能按钮。下图为C#实现的中国象棋博弈系统的人机交互界面截图:图16 人机交互界面4.3 系统核心模块以下为C#实现中国象棋的有代表性的部分源码与注释:4.3.1 象棋走法规则 /判断在棋局矩阵QiZhiMatrix中从源位置SL到目的位置DL的走法是否合法public bool MoveObeyRule(int, QiZhiMatrix, ChessCoordinates SL, ChessCoordinates DL) bool result = false; if (SL.x = 0 & SL.x = 0 & SL.y = 0 & DL.x = 0 & DL.y 10)/在棋盘内 if (QiZhiMatrixSL.y, SL.x != 0)/原位置棋子不为空 if (QiZhiMatrixDL.y, DL.x = 0 | QiZhiMatrixSL.y, SL.x / 10 != QiZhiMatrixDL.y, DL.x / 10)/源与目地棋子不是同一方 int i, gapcount; switch (QiZhiMatrixSL.y, SL.x) case 1: case 11:/车 走直线,中间没有棋子 if (SL.x = DL.x)/判断是否在同一纵线 /循环查看该纵线内的两棋子间是否还间隔棋子 if (SL.y DL.y) for (i = SL.y + 1; i DL.y; i+) if (QiZhiMatrixi, SL.x != 0) break; if (i = DL.y)/两棋子间没有棋子,车的走法合法 result = true; else for (i = DL.y + 1; i SL.y; i+) if (QiZhiMatrixi, SL.x != 0) break; if (i = SL.y) result = true; else if (SL.y = DL.y) /判断是否在同一横线 /循环查看该横线内的两棋子间是否还间隔棋子 if (SL.x DL.x) for (i = SL.x + 1; i DL.x; i+) if (QiZhiMatrixSL.y, i != 0) break; if (i = DL.x) /两棋子间没有棋子,车的走法合法 result = true; else for (i = DL.x + 1; i SL.x; i+) if (QiZhiMatrixSL.y, i != 0) break; if (i = SL.x) result = true; break; return result;/返回棋子走法是否合法的结果 4.3.2 走法产生器 /根据当前棋局QiZhiMatrix产生所有可能走法,将合法走法存入MLDepth,*public int MGWork(int, QiZhiMatrix, MoveList, ML, int Depth) count = 0; Rule Rl = new Rule();/判断规则的类 ChessCoordinates SL = new ChessCoordinates();/源位置坐标 ChessCoordinates DL = new ChessCoordinates();/目的位置坐标int x, y, ii, jj;/遍历棋盘for (y = 0; y 10; y+) for (x = 0; x 10 | Depth % 2 = 1 & QiZhiMatrixy, x = 0; ii-)/横坐标搜索 DL.x = ii; /判断走法是否合法,合法则加入走法队列 if (Rl.MoveObeyRule(QiZhiMatrix, SL, DL) ADDML(QiZhiMatrix, ML, Depth, SL, DL); else break;/不合法则直接跳出循环,车从源位置到目的位置中间不能有间隔棋子,/所以不需要继续搜索 /向右搜索 for (ii = x + 1; ii =0; ii-) DL.y = ii; if (Rl.MoveObeyRule(QiZhiMatrix, SL, DL) ADDML(QiZhiMatrix, ML, Depth, SL, DL); else break; /向下搜索 for (ii = y + 1; ii 10; ii+) DL.y = ii; if (Rl.MoveObeyRule(QiZhiMatrix, SL, DL) ADDML(QiZhiMatrix, ML, Depth, SL, DL); else break; break; return count;/返回产生器产生的总的可走的步数 4.3.3 估值函数/两个常量数组存入兵在不同位置附加值/兵过河之后越靠近老将值越高/红卒private int, RedPawn = new int10, 90,0,0,0,0,0,0,0,0,90,90,110,120,120,120,110,90,90,90,90,110,120,120,120,110,90,90,70,90,110,110,110,110,110,90,70,70,70,70, 70,70, 70, 70,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /定义了每一种棋子的基本价值/兵100士250象250车500马350炮350将10000public int BaseValue = new int7 500, 350, 250, 250, 100, 350, 10000 ;/定义了各种棋子的灵活性(每多走一个位置应加的分值)/兵15士1象1车6马12炮6将0public int FlexibilityValue = new int7 6, 12, 1, 1, 15, 6, 0 ;/存储一棋子可达的棋局位置private ChessCoordinates CanMove = new ChessCoordinates20;/存储一棋子可达的棋局位置的个数private int count;/存储棋盘的每个位置的价值private int, QJ_BaseValue = new int10, 9;/存储棋盘每个位置的灵活性private int, QJ_FlexibilityValue = new int10, 9;/存储棋盘每个位置是否被保护private int, QJ_Guard = new int10, 9;/存储棋盘每个位置是否被威胁private int, QJ_Attack = new int10, 9; / 棋局评估函数/ RedTurn为下一步将轮到谁走/扫描棋局矩阵QiZhiMatrix,提取棋局信息,给棋局评估打分/ 构建本棋局的灵活性,保护,威胁矩阵,给棋局估分public int EveLuationWork(int, QiZhiMatrix, bool RedTurn)int x, y, k;int BlackValue = 0;int RedValue = 0;/矩阵初始化for (y = 0; y 10; y+) for (x = 0; x 9; x+) QJ_BaseValuey, x = 0; QJ_FlexibilityValuey, x = 0; QJ_Guardy, x = 0; QJ_Attacky, x = 0; /扫描棋盘,找出每一个棋子,及其威胁/保护的棋子,还有其灵活性 for (y = 0; y 10; y+) for (x = 0; x 9; x+) ChessCoordinates SL = new ChessCoordinates(); SL.x = x; SL.y = y; if (QiZhiMatrixy, x != 0)/该位置不为空 GeneratorRelateMove(QiZhiMatrix, SL);/产生被位置所有相关可达位置 for (k = 0; k count; k+)/遍历所有相关可达位置 /可达位置为空,灵活性增加 if (QiZhiMatrixCanMovek.y, CanMovek.x = 0) QJ_FlexibilityValuey, x+; else if (QiZhiMatrixCanMovek.y, CanMovek.x / 10 = QiZhiMatrixy, x / 10)/可达位置为同一方,可达位置受保护 QJ_GuardCanMovek.y, CanMovek.x+; else/可达位置为对方,可达位置受威胁,自身灵活性增加 QJ_FlexibilityValuey, x+; QJ_AttackCanMovek.y, CanMovek.x+; switch (QiZhiMatrixCanMovek.y, CanMovek.x)
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!