中国象棋对弈程序

合集下载

java课程设计---中国象棋对弈系统

java课程设计---中国象棋对弈系统

目录摘要 (1)关键字 (1)正文 (2)1、程序设计说明 (2)1.1 程序的设计及实现 (2)1.1.1搜索引擎的实现(engine包) (2)1.1.2信息传输机制(message包) (3)1.1.3棋子(pieces包) (3)1.2 主控模块(main包) (3)2、运行结果 (5)3、设计体会 (6)附件 (7)程序代码 (7)参考文献资料 (41)1中国象棋对弈系统Java语言程序设计实验报告实验项目名称:中国象棋对弈系统作者姓名与单位:李非计算机101摘要:本文主要是运用java实现具有一定功能的中国象棋对弈系统软件,主要功能如下:a、象棋对弈:红方先走,然后黑方再走,红黑交替,直到一方获胜。

b、新游戏:任何时候可以重新开始一盘新的对弈。

c、悔棋:当走错棋的时候可以悔棋。

d、信息提示:提示当前信息状态。

e、简单的帮助文档:象棋规则介绍、软件的简单介绍和编制说明关键词:java、中国象棋对弈系统2正文:一程序设计说明1.1程序的设计及实现本系统主要有以下4个模块,每个模块对应一个程序包:1、engine:搜索引擎包,系统的核心部分。

2、message:网络对战过程中各种消息及其传递机制的类实现包。

3、main:主界面实现包。

4、pieces:棋子及其相关类实现包。

现就各个包中的要点给与说明。

1.1.1 搜索引擎的实现(engine包)(1) BitBoard.java:位棋盘的实现,见2.4节。

(2) CCEvalue.java:评价函数知识类。

本程序使用开源软件“梦入神蛋”的快速评价函数。

该函数包含子力价值和棋子所在位置的奖励值。

子力价值分别是:帅-0, 仕- 40, 象-40, 马-88, 车-200, 炮-96, 兵-9。

帅是无价的,用0表示。

以马为例,位置的奖励值如下:0,-3,5,4,2,2,5,4,2,2,-3,2,4,6,10,12,20,10,8,2,2,4,6,10,13,11,12,11,15,2,0,5,7,7,14,15,19,15,9,8,2,-10,4,10,15,16,12,11,6,2,0,5,7,7,14,15,19,15,9,8,2,4,6,10,13,11,12,11,15,2,-3,2,4,6,10,12,20,10,8,2,0,-3,5,4,2,2,5,4,2,2上面的每行代表棋盘的一条纵线。

中国象棋比赛规则

中国象棋比赛规则

中国象棋比赛规则一、基本规则:遵循友谊第一,比赛第二的原则,讲棋风、棋德,赛出风格,比出水平。

二、时间规定:根据具体比赛等级确定双方用走棋时间,或走一着棋用时规定。

三、对弈:在对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或走成和棋为止。

四、胜负判定:对局时,一方出现下列情况之一,就算输棋,对方得胜:1.帅(将)被对方将死。

2.帅(将)被将军,无法避免地同对方将(帅)直接对面。

3.被困毙。

4.同一局棋技术犯规两次判负。

5.自己宣布认输。

五、对局时,出现下列情况之一,就算和棋:1.属于理论上公认的双方均无取胜可能的局势。

2.提议作和,应使双方机会均等。

只要是一方提和,另一方同意。

3.双方走棋出现循环反复已达三次,符合棋例中不变作和的有关规定,可由任何一方提议作和,经审查局面属实,即使另一方不同意,裁判员也有权判为和棋。

如双方都没有提和,而循环反复局面还在延续,裁判员有权不征得双方同意就决定判和。

六、赛制与计分:本次比赛实行三局两胜制。

若出现平局现象,双方选择加赛一局或以抽签方式分出胜负。

七、行棋规则:1.一着棋走了以后,不得再予更改。

落子生根,以手离开棋子为准。

2.触摸自己方面的哪个棋子,就应走哪个棋子,除非所触摸的那个棋子,按行棋规定根本不能走,才可以另走别的棋子。

3.触摸对方的棋子,就必须吃掉那个棋子,只有当己方的任何棋子都无法去吃时,才可以另行走子。

4.先触摸自己的棋子,后又触摸对方的棋子,处理顺序如下:前者必须吃掉后者;无法吃掉时,必须走动前者;前者无法走时,必须用别的子吃掉后者;别的棋子也无法吃掉后者,才可以另行走子。

5.先触摸对方的棋子,后又触摸自己的棋子,处理顺序如下:后者必须吃掉前者­;无法吃掉时,必须用别的子吃掉前者;均无法吃掉时,必须走动后者;后者也无法走动时,才可以另行走子。

八、技术犯规:下列各项均属技术犯规。

1.连续提和,干扰对方。

2.一方提出“自然限著”经裁判审查后不属实。

中国象棋比赛详细规则

中国象棋比赛详细规则

中国象棋比赛详细规则一、棋盘和棋子咱先说说棋盘吧,棋盘是个正方形,横纵线交错,就像一个大的方格网。

中间有个楚河汉界,把棋盘分成两边,这就好像古代打仗时两边的阵地似的。

棋子呢,红黑两方,各有16个棋子。

红方有帅、仕、相、车、马、炮、兵,黑方呢有将、士、象、车、马、炮、卒。

每个棋子都有自己独特的走法,就像每个战士都有自己独特的技能一样。

二、棋子的走法1. 帅(将)帅(将)可是队伍里的老大,只能在九宫格里活动,而且一次只能走一格,还只能横着或者竖着走,就像一个小心翼翼的君主,在自己的小天地里指挥着大局,要是被对方的棋子给吃到了,那这一方可就输喽。

2. 仕(士)仕(士)就像帅(将)的贴身护卫,也是在九宫格里活动,不过它是斜着走的,每次走一格,就像一个灵活的小保镖,时刻保护着主帅的安全。

3. 相(象)相(象)走田字格,不过呢,要是田字格中间有个棋子挡着,那可就走不了啦,就像大象虽然庞大有力,但遇到障碍物也得绕路。

而且相(象)不能过河哦,只能在自己的地盘上活动,感觉就像负责后方防御的一样。

4. 车车可就厉害了,横冲直撞的,只要没有棋子挡着,可以一直走,不管走多远都行,就像战场上的战车,勇往直前,威力巨大。

5. 马马走日字格,但是也有个小讲究,如果在马要走的日字格的旁边一格有棋子挡着,这马就别腿了,走不了啦,就像马被东西绊住了腿,是不是很有趣呢?6. 炮炮的走法和车有点像,横冲直撞的,但它吃子得隔着一个棋子,就像它发射炮弹一样,得有个炮架子才能打到敌人呢。

7. 兵(卒)兵(卒)在没过河之前只能一步一步地向前走,每次走一格,就像小步兵在慢慢推进。

过了河之后就可以横着走了,不过也只能一步一步走,这小卒子可也是能发挥大作用的哦。

三、比赛的胜负判定1. 将死对方的帅(将)如果一方把对方的帅(将)给困住了,让它无处可逃,那这一方就赢啦,这可是最直接的获胜方式呢。

就像打仗把对方的老大给抓住了,那对方肯定就输了呀。

2. 和棋有时候呢,也会出现和棋的情况。

中国象棋比赛规则

中国象棋比赛规则

中国象棋比赛规则中国象棋比赛规则如下:1. 对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或和棋为止。

2. 走法有:帅(将)每次走一步,士每次斜走一步,相(象)每次走两步,走的方向和以前所走路线垂直。

马走日字对角线,车走直线。

炮在不吃棋子的时候水平或垂直方向都能走,但是如果炮是隔子打子叫抽将也算是“暗度陈仓”也作“过河卒”,威力增加。

吃子是抓对方的棋子并放在一旁叫吃子。

对弈开始后可以先将军,或者打吃对方的棋子。

同时还可以拔除对方的马腿、砍掉对方的车、炮或兵(卒)。

3. 当一方将军时另外一方无法避免输掉比赛,如果形成将军局面却没有将军,会被判负或和。

4. 当一方被将的时候,需要立即“应将”,即用自己能移动的棋子挡住对方的进攻。

如果没有应将,对方走完自己的棋后就输了比赛。

5. 在对方没有将军的时候移动不能移动的棋子被称为“被困孤兵”或“蹩脚(相)”,如果没有其他的合适走法会被判负或和。

如果棋子的直线平行是7点构成的直线“筋”,就只有一个点可以点过去不算捉着,(不但是死局而且还很轻判)下法有两种如果拿一个士上一边象所容易出的线是属于以上的,有一个是飞上低线的时是最不灵活的方法的也算在活络招当中也算是求和的最大优惠手段。

6. 在正式的比赛中通常有棋手的裁决有争议的时候会有多台电脑裁定:有些书在翻空格子时注意应该注意的如一个象向前打的话将能够做的最佳防守方法一般都是算和着同时有两个底线兵能够扛住的没有动(此时就专门提上日字的说法,并不是以1路的间距的七点直行的着数多少而论,不是必胜的办法故意提醒应多想或保守地运用另一种布局。

按照以上规则进行中国象棋比赛可以更公平、公正、有趣味性。

中国象棋对弈程序

中国象棋对弈程序

中国象棋对弈程序专业:计算机科学与技术小组成员:孙忱、周俊、施聪聪、周理想指导老师:陈宇、蒋德茂(苏州大学计算机学院)作品类别:学术论文+计算机程序【摘要】:人机博弈是人工智能研究的经典课题之一。

凭借设计优良的算法和计算机的快速运算能力,计算机可以在人机对弈中表现出相当高的“智能”。

通常,一款象棋程序的实现可以被分为下棋引擎(人工智能)和外壳(界面及程序辅助)两大部分。

本文将介绍如何实现一款中国象棋对弈程序。

【关键词】:中国象棋;人工智能;博弈树;Alpha-Beta搜索;历史启发;界面;多线程;计时器;列表框;MFC。

[Abstract]: Man-machine Game is a classic topic in Artificial Intelligence. Relying on fine-designed algorithms and the fast operation ability, computers can display high "intelligence" in playing chess. Usually, the realization of a chess program can be decomposed into two major parts: the Chess Engine (Artificial Intelligence) and the Shell (User Interface & Program Assist). This paper will introduce how to realize a Chinese Chess program.[Key words]: Chinese Chess; Artificial Intelligence (AI); Game Tree; Alpha-Beta Search; History Heuristic; User Interface; Multithreaded; Timer; List Box; MFC.一、前言我们的目标是实现一款有着一定下棋水平且交互友好的中国象棋人机对弈程序。

中国象棋比赛规则解读(2020年编辑版)

中国象棋比赛规则解读(2020年编辑版)

中国象棋比赛规则解读(2020年编辑版)1. 比赛目标- 通过对弈,以各自的智慧和策略争夺胜利;- 提高棋手的象棋水平;- 促进象棋文化的传承和发展。

2. 比赛规则- 对弈双方:黑方和红方;- 棋盘:棋盘为9×10的方形格子,分为90个小格子;- 棋子:共有32个棋子,分为黑红两色;- 移动规则:- 每个棋子有特定的移动方式和限制;- 棋子可以横、竖、斜线移动,但不能跨过其他棋子;- 不能移动至己方其他棋子所在的位置;- 不能移动至对方将军的位置;- 特殊规则:- 将帅:只能在九宫格内移动;- 士:只能在斜线上移动,且只能在九宫格内活动;- 相:只能在斜线上移动,且只能在对方半边活动;- 马:可以跳过其他棋子,按日字形移动;- 车:可以横、竖任意格移动,不能斜线移动;- 炮:可以横、竖任意格移动,吃子时需跨过一个棋子;- 兵/卒:只能向前移动,过河后才能横向移动;- 胜负规则:- 将军:当己方的棋子威胁到对方的将军时,宣布将军;- 胜利:当对方无法阻止己方将军时,宣布胜利;- 和棋:双方棋子重复走相同的局面3次或者连续50步没有吃子和移动兵卒时,宣布和棋;- 其他特殊情况下,比赛裁判会根据规则进行判断。

3. 比赛流程- 抽签决定先后手;- 每方轮流走一步;- 比赛过程中,双方应遵守规则,不得违反比赛纪律;- 比赛结束后,双方进行总结和讨论。

4. 注意事项- 棋手应尊重裁判和对手,遵守比赛规则;- 棋手不得作弊或使用非法辅助工具;- 棋手应保持良好的比赛状态,集中注意力;- 棋手应遵守比赛纪律,不得干扰其他棋手。

以上是2020年编辑版的中国象棋比赛规则解读。

希望本文能够帮助棋手更好地理解和参与象棋比赛。

象棋比赛规则及方案

象棋比赛规则及方案
比赛形式
单淘汰制
所有参赛者进行抽签,胜者晋级,败者淘汰,直到决出冠军。
循环赛
每位参赛者与其他所有参赛者对弈,积分排名,积分高者获胜。
活动流程
开幕式
主办方致辞,记录比赛结果。
颁奖仪式
对获胜者及优秀选手颁发奖品或奖状。
总结发言
对本次活动进行总结,感谢参与者和工作人员。
象棋比赛规则及方案
活动名称
比赛时间
活动地点
参赛人员
学生组;教师组
比赛目的
提升棋手的技术水平与竞技能力;增强团队凝聚力,促进师生之间的交流与合作;丰富校园文化生活,营造良好的棋类氛围。
比赛规则
棋盘与棋子
使用标准象棋棋盘和棋子,每方各有16个棋子(将/帅、士、象、马、车、炮、卒)。
基本规则
每方轮流走子,红方先行。
棋子走法
将/帅:每次走一步,限制在九宫内。
士:每次走一步,限制在九宫内。
象:每次走两个格,不能过河。
马:每次走“日”字形,受“蹩马腿”限制。
车:直线移动,任意格数。
炮:直线移动,吃子时需隔一个棋子。
卒:过河后可横向走一步,未过河只能前进。
胜负判定
吃掉对方的“将/帅”即为胜利;比赛时间到时,如仍未分出胜负,则判定为和局。

中国象棋比赛规则(2020年精编版)

中国象棋比赛规则(2020年精编版)

中国象棋比赛规则(2020年精编版)一、比赛组织1.1 比赛名称:中国象棋比赛1.2 组织单位:中国象棋协会1.3 比赛时间:比赛时间由组织单位确定1.4 比赛地点:比赛地点由组织单位确定二、参赛资格2.1 参赛选手必须具备中国国籍。

2.2 参赛选手必须在比赛开始前完成报名手续。

2.3 参赛选手必须符合组织单位的年龄限制要求。

三、比赛规则3.1 对局方式:每局比赛由两名选手进行对局。

3.2 棋盘布置:棋盘由64个格子组成,分为红黑两色,纵横各9条线,交叉形成81个交叉点。

3.3 棋子种类:共有32个棋子,分为红黑两色,包括帅、仕、相、马、车、炮和兵。

3.4 棋子移动规则:每个棋子有特定的移动规则,详细规则可以参考中国象棋的基本规则。

3.5 对局时间:每个选手在比赛中有限定的时间进行思考和下棋,超时将受到相应处罚。

3.6 胜负判定:比赛结束后,根据比赛规则和双方棋子的状态来判定胜负。

四、裁判和裁决4.1 比赛中由组织单位指定专业裁判负责裁判工作。

4.2 裁判有权对比赛过程中出现的争议或违规行为做出裁决。

4.3 参赛选手对裁判的裁决有权提出申诉,由组织单位进行裁决。

五、违规和处罚5.1 参赛选手在比赛中有以下违规行为将受到相应处罚:违反棋局规则、超时、干扰对手等。

5.2 处罚方式:根据违规行为的严重程度,裁判有权决定相应的处罚方式,包括警告、罚时、罚款等。

5.3 处罚申诉:被处罚的参赛选手有权对处罚提出申诉,由组织单位进行裁决。

六、比赛奖励6.1 比赛结束后,根据比赛成绩,组织单位将给予获胜选手相应的奖励,包括奖杯、奖金等。

6.2 奖励金额和形式由组织单位决定。

以上是2020年精编版中国象棋比赛规则的简要内容,具体的细则和规定可以参考组织单位发布的详细规则。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国象棋对弈程序【摘要】:人机博弈是人工智能研究的经典课题之一。

凭借设计优良的算法和计算机的快速运算能力,计算机可以在人机对弈中表现出相当高的“智能”。

通常,一款象棋程序的实现可以被分为下棋引擎(人工智能)和外壳(界面及程序辅助)两大部分。

本文将介绍如何实现一款中国象棋对弈程序。

【关键词】:中国象棋;人工智能;博弈树;Alpha-Beta搜索;历史启发;界面;多线程;计时器;列表框;MFC。

[Abstract]: Man-machine Game is a classic topic in Artificial Intelligence. Relying on fine-designed algorithms and the fast operation ability, computers can display high "intelligence" in playing chess. Usually, the realization of a chess program can be decomposed into two major parts: the Chess Engine (Artificial Intelligence) and the Shell (User Interface & Program Assist). This paper will introduce how to realize a Chinese Chess program.[Key words]: Chinese Chess; Artificial Intelligence (AI); Game Tree; Alpha-Beta Search; History Heuristic; User Interface; Multithreaded; Timer; List Box; MFC.一、前言我们的目标是实现一款有着一定下棋水平且交互友好的中国象棋人机对弈程序。

该程序功能包括:*人机对弈;*盲棋模式;(注:此功能为创新功能)*搜索深度设定;(电脑棋力选择)*棋子、棋盘样式选择;*悔棋、还原;*着法名称显示;*下棋双方计时;整个程序的实现可分为两大部分:一、人工智能部分(计算机下棋引擎)该部分实现了如何让计算机下中国象棋,其中涉及人机博弈的基本理论及思想,是该程序的核心部分,同时也是本项目研究的重点所在。

二、界面及程序辅助部分光有下棋引擎尚不能满足人机交互的基本要求,因此我们还需要一个框架(界面)来作为引擎的载体,同时提供一些诸如悔棋,计时之类的附属功能(程序辅助)来为程序增色添彩。

下面分别介绍各部分实现。

由于界面及程序辅助部分涉及内容宽泛而又繁琐,因而本文只介绍其中重点部分以及我们在开发过程中曾经遇到过困难的地方。

二、人工智能部分(计算机下棋引擎)1、概述程序的基本框架:从程序的结构上讲,大体上可以将引擎部分划分为四大块:棋局表示;着法生成;搜索算法;局面评估。

程序的大概的思想是:首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着法生成器生成当前下棋方所有合法的着法并依次存入着法队列。

然后通过搜索算法来逐一读取着法并调用局面评估函数对该着法所产生的后继局面进行评估打分,从中选出一个最有可能导致走棋方取胜的着法。

在搜索的过程中还可以采用一些辅助手段来提高搜索的效率。

其过程如下图所示:下面将分别介绍各个部分。

2、棋局表示计算机下棋的前提是要让计算机读懂象棋。

所谓读懂,即计算机应该能够清楚地了解到棋盘上的局面(棋盘上棋子的分布情况)以及下棋方所走的每一种着法。

因而首先我们需要有一套数据结构来表示棋盘上的局面以及着法。

对于棋盘局面的表示我们采用了最传统的同时也是最为简单的“棋盘数组”。

即用一个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};其中“0”表示无棋子,大写字母表示红方棋子,小写字母表示黑方棋子(所有这些大小写字母都是用宏定义的整数)。

具体如下:“R”表示红车;“H”表示红马;“E”表示红相;“A”表示红仕;“K”表示红帅;“C”表示红炮;“P”表示红兵。

“r”表示黑车;“h”表示黑马;“e”表示黑象;“a”表示黑士;“k”表示黑将;“c”表示黑炮;“p”表示黑卒。

此外这个数组也表明了我们对棋盘进行了如右图所示的编号,并约定红方棋子总处于棋盘的下方。

对于着法的表示,我们直接借用棋盘数组的下标来记录着法的起点和目标点。

至于是什么棋子在走,以及是否吃子、吃的是什么子,我们在着法结构中并不记录。

这些信息由外部读取棋盘上起点、终点的数据获得。

着法结构定义如下,其中还包含了对着法的历史得分的记录项,以供后面要讲到的“历史启发”所用。

typedef struct _cchessmove{POINT ptFrom; // 起点POINT ptTo; // 目标点int nScore; // 该走法的历史得分} CCHESSMOVE ; // 走法结构有了对棋盘局面和着法的表示之后,程序才能够完成以下操作:1、生成所有合法着法;2、执行着法、撤销着法;3、针对某一局面进行评估。

因而,棋局表示好比是整个程序(计算机下棋引擎部分)的地基,之后所有的操作都将建立在其基础上。

3、着法生成我们的程序需要让计算机在轮到它走子的时候能够执行一步它认为对它最有利的着法,那前提就是它要有诸多(也可能是唯一)可供选择的着法,提供所有候选着法的“清单”就是我们的着法生成器所要完成的。

之后用搜索函数来搜索“清单”,并用局面评估函数来逐一打分,最后就可以选择出“最佳着法”并执行了。

在着法生成器中,我们采用的基本思想就是遍历整个棋盘(一个接一个地查看棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列。

这里谈到的“合法着法”包括以下几点:1、各棋子按其行子规则行子。

诸如马跳“日”字、象走“田”字、士在九宫内斜行等等(这里需要特别注意的是卒(兵)的行子规则会随其所在位置的不同而发生变化——过河后可以左右平移)。

2、行子不能越出棋盘的界限。

当然所有子都不能走到棋盘的外面,同时某些特定的子还有自己的行棋界限,如将、士不能出九宫,象不能过河。

3、行子的半路上不能有子阻拦(除了炮需要隔一个子才能打子之外)以及行子的目的点不能有本方棋子(当然不能自己吃自己了)。

4、将帅不能碰面(本程序中只在生成计算机的着法时认为将帅碰面是非法的,而对用户所走的导致将帅碰面的着法并不认为其非法,而只是产生败局罢了)。

产生了着法后要将其存入着法队列以供搜索之用,由于搜索会搜索多层(即考虑双方你来我往好几步,这样才有利于对局面进行评估以尽可能避免“目光短浅”),所以在把着法存入着法队列的时候还要同时存储该着法所属的搜索层数。

因此我们将着法队列定义为二维数组MoveList[12][80],其中第一个数组下标为层数,第二个数组下标为每一层的全部着法数。

关于搜索层数,我将数组下标设定为12,实际使用的是1到11(在界面中我又将其限定为1—10)。

搜索层数的增加会显著提高电脑的下棋水平(当然计算机的棋力在很大程度上也依赖于局面评估)。

在我的迅驰1.5,736M内存的笔记本上最多只能搜索5层,再多将导致搜索时间达到令人无法容忍的地步(这里还需要特别说明的是,搜索的速度也和着法生成的效率以及局面评估的复杂度有关,因为每分析一个结点都要执行这两种操作)。

对于每一层的着法数,也就是当前下棋方针对当前局面的所有可选的合法着法,据有关数据统计在象棋实战中一般最多情况下也就五六十种。

定义第二个数组下标为80,应当可以保证十分的安全。

着法生成为搜索部分提供了“原料”,接下来的任务就交给搜索和局面评估了。

4、搜索算法搜索算法对于整个下棋引擎来说都是至关重要的。

它如同程序的心脏,驱动着整个程序。

搜索算法的好坏直接影响着程序执行的效率(从某种角度上,它影响着计算机的下棋水平。

因为,计算机必须在有限的时间内完成思考,搜索速度快意味着在相同的时间内程序可以“看”得更远,“想”的更多)。

关于棋类对弈程序中的搜索算法,经前人的努力已形成了非常成熟的Alpha-Beta搜索算法1以及其它一些辅助增强算法(还有众多基于Alpha-Beta算法的派生、变种算法)。

鉴于目前我们的知识储备、时间、精力等均达不到推陈出新、另开炉灶的要求,再加之前人的算法着实已相当完善,所以我们在自己的程序中直接借鉴了Alpha-Beta搜索算法并辅以了历史启发。

本节先介绍Alpha-Beta搜索算法:在中国象棋里,双方棋手获得相同的棋盘信息。

他们轮流走棋,目的就是将死对方,或者避免被将死。

由此,我们可以用一棵“博弈树”(一棵n叉树)来表示下棋的过程——树中每一个结点代表棋盘上的一个局面,对每一个局面(结点)根据不同的走法又产生不同的局面(生出新的结点),如此不断直到再无可选择的走法,即到达叶子结点(棋局结束)。

中国象棋的博弈树的1Alpha-beta算法,该算法是由匹兹堡大学的三位科学家Newell, Shaw and Simon于1958年提出的。

模型大概如下图所示,我们可以把其中连接结点的线段看作是着法,不同的着法自然产生不同的局面。

该树包含三种类型的结点:1、奇数层的中间结点(以及根结点),表示轮到红方走棋;2、偶数层的中间结点,表示轮到黑方走棋;3、叶子结点,表示棋局结束。

现在让计算机来下中国象棋,它应当选择一步对它最有利的着法(最终导致它取胜的着法)。

获得最佳着法的方法就是“试走”每一种可能的着法,比较它们所产生的不同后果,然后从中选出能够产生对自己最有利的局面的着法。

结合上面所讲的博弈树,如果我们给每个结点都打一个分值来评价其对应的局面(这一任务由后面所讲的局面评估来完成),那么我们可以通过比较该分值的大小来判断局面的优劣。

相关文档
最新文档