中国象棋游戏的设计C++.docx
- 文档编号:1409341
- 上传时间:2022-10-22
- 格式:DOCX
- 页数:19
- 大小:64.23KB
中国象棋游戏的设计C++.docx
《中国象棋游戏的设计C++.docx》由会员分享,可在线阅读,更多相关《中国象棋游戏的设计C++.docx(19页珍藏版)》请在冰豆网上搜索。
中国象棋游戏的设计C++
中国象棋游戏的设计与实现
摘要
本文首先研究了中国象棋在计算机中的表示问题,接着讨论如何产生着法一系列相关内容。
其次研究了博弈树的极小极大搜索技术及在此基础上发展起来的Alpha-Beta剪枝算法,使用MFC文档视图体系结构和VisualC++开发工具,实现了一个具有一定棋力的中国象棋人机对弈程序。
象棋程序的实现可以被分为人工智能和界面程序辅助两大部分。
人工智能部分主要体现计算机的下棋思路,既计算机如何进行思考并以最佳走法完成下一步,先由相应的搜索算法进行搜索,并对各种可能的走法进行估值,从中选择胜利面最大的一步;而界面及程序辅助部分主要便于用户通过以前的下棋步骤,更好地调整下棋思路,着法显示使用户能够清楚地知道下棋过程,更准确地把握整个局面。
关键词:
中国象棋;人工智能;博弈树;Alpha-Beta搜索
TheDesignandImplementationofChineseChess
Abstract
Theimplementationofachessprogramcanbedecomposedintotwomajorparts:
theartificialintelligenceandtheuserinterfaceandprogramassist.Thepartofartificialintelligenceshowsthewayofcomputerthinking,andwhichstepisthebeststepwouldbedecidedbyit.Firstly,thecomputerusessearchalgorithmstosearch,andthenevaluateseveryimpossiblestep,finallychosesthebestone,theotherpartisusedfortheplayertoadjusthisthoughttothecurrentlyphases.Thedisplayofsteplistmakesplayerknowtheprocessofchessdistinctly,andletplayermakeabetterchoice.
Thispaperfirstlystudieshowtorepresentachessboardincomputer,thendiscusseshowtogeneratelegalmoves.Secondly,thispaperstudiesthemini-maxsearchingprocedureofGameTree,andtheAlpha-Betapruningalgorithm.AChess-playingsystemisdesignedanddeveloped,whichisbuiltontheintegratedcomputerMFCSDIdocumentviewarchitecturebyusingVisualC++.
Keywords:
Chinesechess;ArtificialIntelligence;Gametree;Alpha-Betasearching
论文总页数:
22页
1引言
1.1象棋设计背景和研究意义
电脑游戏行业经过二十年的发展,已经成为与影视、音乐等并驾齐驱的全球最重要的娱乐产业之一,其年销售额超过好莱坞的全年收入。
游戏,作为一种娱乐活动。
早期的人类社会由于生产力及科技的制约,只能进行一些户外的游戏。
随着生产力的发展和科技进步,一种新的游戏方式——电子游戏也随之诞生。
当计算机发明以后,电子游戏又多了一个新的载体。
电子游戏在整个计算机产业的带动下不断地创新、发展着。
自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。
而计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想。
事实上,个人计算机软件市场的大约80%销售份额是来自游戏软件。
棋牌游戏属于休闲类游戏,相对于角色扮演类游戏和即时战略类游戏等其它游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。
作为中华民族悠久文化的代表之一,中国象棋不仅源远流长,而且基础广泛,作为一项智力运动,中国象棋开始走向世界。
随着计算机处理速度的飞速提高,人们很早就提出了疑问:
计算机是否会超越人类?
世界国际象棋大师已被计算机打败,计算机已经超过了人类?
而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。
因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。
1.2象棋设计研究方法
对于象棋来说,核心设计主要包括人工智能算法的以及整个游戏中界面及程序辅助部分的实现,主要用VisualC++进行开发,里面的MFC类库,使游戏开发更加方便,并利用人工智能相关搜索算法实现人工智能的着法生成,从而完善整个游戏的功能。
本文的目标是实现一款有着一定下棋水平且交互友好的中国象棋人机对弈程序。
该程序功能包括:
*人机对弈;
*搜索深度设定;
(电脑棋力选择)
*悔棋、还原;
*着法名称显示;
整个程序的实现可分为两大部分:
一、人工智能算法设计(计算机下棋引擎)
该部分实现了如何让计算机下中国象棋,其中涉及人机对弈的基本理论及思想,是该程序的核心部分,同时也是本项目研究的重点所在。
二、界面及程序辅助设计
光有下棋引擎尚不能满足人机交互的基本要求,因此还需要一个框架(界面)来作为引擎的载体,同时提供一些诸如悔棋,还原之类的附属功能(程序辅助)。
下面分别介绍各部分实现。
由于界面及程序辅助部分涉及内容宽泛而又繁琐,因而本文只介绍其中重点部分。
2人工智能算法设计
程序的基本框架:
从程序的结构上讲,大体上可以将引擎部分划分为四大块:
棋局表示;
着法生成;
搜索算法;
局面评估。
程序的大概的思想是:
首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着法生成器生成当前下棋方所有合法的着法并依次存入着法队列。
然后通过搜索算法来逐一读取着法并调用局面评估函数对该着法所产生的后继局面进行评估打分,从中选出一个最有可能导致走棋方取胜的着法。
在搜索的过程中还可以采用一些辅助手段来提高搜索的效率。
其过程如下所示(图1):
图1程序结构图
下面将分别介绍程序各个部分:
2.1棋局表示
计算机下棋的前提是要让计算机读懂象棋。
所谓读懂,即计算机应该能够清楚地了解到棋盘上的局面(棋盘上棋子的分布情况)以及下棋方所走的每一种着法。
因而首先需要设计一套数据结构来表示棋盘上的局面以及着法。
对于棋盘局面的表示可采用传统而简单的“棋盘数组”。
即用一个9*10的数组来存储棋盘上的信息,数组的每个元素存储棋盘上是否有棋子。
这种表示方法简单易行(缺点是效率不是很高)。
按此方法棋盘的初始情形如下所示:
BYTECChessBoard[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
};
给所有棋子定义一个值:
#defineR_BEGINR_KING
#defineR_ENDR_PAWN
#defineB_BEGINB_KING
#defineB_ENDB_PAWN
#defineNOCHESS0//没有棋子
黑方:
#defineB_KING1//黑帅
#defineB_CAR2//黑车
#defineB_HORSE3//黑马
#defineB_CANON4//黑炮
#defineB_BISHOP5//黑士
#defineB_ELEPHANT6//黑象
#defineB_PAWN7//黑卒
红方:
#defineR_KING8//红将
#defineR_CAR9//红车
#defineR_HORSE10//红马
#defineR_CANON11//红炮
#defineR_BISHOP12//红士
#defineR_ELEPHANT13//红相
#defineR_PAWN14//红兵
判断颜色:
#defineIsBlack(x)(x>=B_BEGIN&&x<=B_END)//判断某个棋子是不
是黑色
#defineIsRed(x)(x>=R_BEGIN&&x<=R_END)//判断某个棋子是不
是红色
对于着法的表示,直接借用棋盘数组的下标来记录着法的起点和目标点。
至于是什么棋子在走,以及是否吃子、吃的是什么子,在着法结构中并不记录。
这些信息由外部读取棋盘上起点、终点的数据获得。
着法结构定义如下,其中还包含了对着法的历史得分的记录项,以供后面要讲到的“历史启发”所用。
typedefstruct
{
shortnChessID;//表明是什么棋子
CHESSMANPOSFrom;//起始位置
CHESSMANPOSTo;//走到什么位置
intScore;//走法的分数
}CHESSMOVE;
有了对棋盘局面和着法的表示之后,程序才能够完成以下操作:
1、生成所有合法着法;
2、执行着法、撤销着法;
3、针对某一局面进行评估。
因而,棋局表示好比是整个程序(计算机下棋引擎部分)的地基,之后所有的操作都将建立在其基础上。
2.2着法生成
程序需要让计算机在轮到它走子的时候能够执行一步它认为对它最有利的着法,那前提就是它要有诸多(也可能是唯一)可供选择的着法,提供所有候选着法的“清单”就是着法生成器所要完成的。
之后用搜索函数来搜索“清单”,并用局面评估函数来逐一打分,最后就可以选择出“最佳着法”并执行了。
在着法生成器中,采用的基本思想就是遍历整个棋盘(一个接一个地查看棋盘上的每个位置点),当发现有当前下棋方的棋子时先判断它是何种类型的棋子,然后根据其棋子类型而相应地找出其所有合法着法并存入着法队列。
这里谈到的“合法着法”包括以下几点:
1、各棋子按其行子规则行子。
诸如马跳“日”字、象走“田”字、士在九宫内斜行等等(这里需要特别注意的是卒(兵)的行子规则会随其所在位置的不同而发生变化——过河后可以左右平移)。
2、行子不能越出棋盘的界限。
当然所有子都不能走到棋盘的外面,同时某些特定的子还有自己的行棋界限,如将、士不能出九宫,象不能过河。
3、行子的半路上不能有其它子阻拦(除了炮需要隔一个子才能打子之外)以及行子的目的点不能有本方的棋子(当然不能自己吃自己了)。
4、将帅不能碰面(本程序中只在生成计算机的着法时认为将帅碰面是非法的,而对用户所走的导致将帅碰面的着法并不认为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国象棋 游戏 设计 C+