基于MFC的中国象棋游戏---毕业论文_第1页
基于MFC的中国象棋游戏---毕业论文_第2页
基于MFC的中国象棋游戏---毕业论文_第3页
基于MFC的中国象棋游戏---毕业论文_第4页
基于MFC的中国象棋游戏---毕业论文_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于MFC的中国象棋游戏本科毕业论文基于MFC的中国象棋游戏A Chinese Chess game based on Microsoft Foundation Classes姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级: 校外指导老师: 校内指导教师: 年 月摘 要MFC微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C+ 开发工具发布。目前最新版本为9.0(截止2008年11月)。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。 MFC 应用程序的总体结构通常由由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizard 自动生成框架。Windows 应用程序中,MFC 的主包含文件为Afxwin.h。此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。象棋是中华民族的传统文化,不仅在国内深受广大群众的喜爱,而且在国外,尤其是东南亚的侨胞和外籍华人中也广泛流传。许多海外华侨、华人和港澳同胞把象棋看作是侨胞与祖国联系的桥梁和纽带,把开展象棋活动看作是炎黄后裔对自己民族文化的继承和发扬。近几十年来,随着贸易和文化交往的不断发展,象棋在英、美、法、加拿大、联邦德国等国家也发展了不少的爱好者。象棋正从它的发源地,经过亚洲,传播到世界各个角落。现在从亚洲来看,不仅港澳等地棋风很盛,而且在泰国、新加坡、菲律宾、马来西亚、印尼,日本等国的华侨和外籍华人中,象棋也很普遍。那些地区和国家每年都举行象棋比赛,而且都已分别成立了象棋总会或象棋协会。本文详细描述了开发该中国象棋游戏的完整的思路和实现过程。关键词:MFC;Visual C+;中国象棋摘要AbstractMFC(Microsoft Foundation Classes), similar with VCL, is a kind of Application Framework and it is published with Microsoft Visual C+. The latest version of MFC is version 9.0(up to Nov. 2008). This class library provides a group of universal, reusable class library for programmer.Except some of the classes,lots of classes are inherited from CObject.The frame of MFC applications was usually made up of several classes inherited from MFC by developer and a object of the class CWinApp.MFC provides MFC Appwizard to creat frames automatically.In the MFC applications,the main including file is “Afxwin.h”.What besides is some of MFC classes are current in MFC/ATL,you could include solely and use these in win32 application.Chinese Chess is traditional culture of china,its not only cared by Chinese people,but also fashonal in huakiaus and huajins in southeast Asia.A lot of huakiaus,huajins and compotriots from HongKong and Macao regard Chinese Chess as a bridge to connect mother country,and regard developing Chinese Chess as inheriting and developing the traditional culture.In recent dozens of years,with the developing of trading and communication of culture,there are more fanciers in Britian,USA,France,Canada and Germany.Chinese Chess is spreading from China,across Asia,to the other places in the world. Looked from Asia now,Chinese Chess is not only popular in HongKong and Macao,but also in Thailand,Singapore,Filipion,Malaysia,Indonesia and Japan.These places hold Chinese Chess competitions every year,and Chinese Chess groups are borned there.This essay describes the entire consider and achieve process of exprodering the software of Chinese Chess.Key Words:MFC;Visual C+;Chinese ChessAbstract目 录第一章 引言11.1 选题背景11.2 当前象棋游戏状况11.3 选题意义11.4 本章小节2第二章 开发环境与主要技术32.1 系统开发环境32.1.1 软件环境32.1.2 硬件环境32.2 技术背景32.2.1 C+32.2.2 C+的应用42.2.3 WIN3242.2.4 消息映射机制52.2.5 MFC62.2.6 MFC类库简介72.2.7 Visual C+82.3 本章总结9第三章 MFC开发项目实例中国象棋游戏(Chinese Chess)103.1 Chinese Chess 项目简介103.1.1 现有游戏软件分析103.1.2 Chinese Chess的优势103.2 项目详细介绍113.2.1 中国象棋的简介和规则113.2.2 部分功能代码详解143.3 本章小节313.3.1 运行截图及说明313.3.2 小节39第四章 软件测试40第五章 总结41致谢语42参考文献43目录ContentsChapter 1 Overview11.1 Issue Background11.2 Current Status of Chinese Chess Game11.3 Issue Significance11.4 Summary2Chapter 2 Environment and Technologies32.1 System Environment32.1.1 Software Environment32.1.2 Hardware Environment32.2 Technology Background32.2.1 C+32.2.2 Applications of C+42.2.3 WIN3242.2.4 Message map52.2.5 MFC62.2.6 MFC Library Introduction72.2.7 Visual C+82.3 Summary9Chapter 3 A MFC ProjectChinese Chess103.1 Introduction of Chinese Chess 103.1.1 Current Status of Gameware103.1.2 Advantages of Chinese Chess103.2 Project Details113.2.1 Introduction and Regulation of Chinese Chess113.2.2 Some of Codes Details143.3 Summary313.3.1 Images when Running and the explaining313.3.2 Summary39Chapter 4 Software Testing40Chapter 5 Summary41Acknowledgement42References43Contents基于MFC的中国象棋游戏 第一章 引言1.1 选题背景新中国建立之后,象棋进入了一个崭新的发展阶段。1956年,象棋成为国家体育项目。以后,几乎每年都举行全国性的比赛。1962年成立了中华全国体育总会的下属组织中国象棋协会,各地相应建立了下属协会机构。40多年来,由于群众性棋类活动和比赛的推动,象棋棋艺水平提高得很快,优秀棋手不断涌现。1978年,成立了亚洲象棋联合会。象棋在欧美人中间也有了可喜的发展。美国、法国、德国、加拿大等国,纷纷成立了象棋协会或象棋社。一些国际象棋大师也下起了中国象棋。在各大街小巷里,人们也乐于围成一团,共同讨论研究棋术。象棋也成了大人们茶余饭后休闲交流、小孩智力开发的主要手段之一。而在计算机日益普及的今天,名为“中国象棋”的游戏也不可避免的产生,并受到人们的普遍欢迎。1.2 当前象棋游戏状况 当前象棋游戏很多,主要包含界面精美友好、操作方便等特点以及人机对战、悔棋、记录棋局等功能,但当前的象棋游戏普遍缺少一种让玩家棋艺精进的学习方式,本软件在实现大部分基本功能外,还将添加记录走法,棋局等功能。1.3 选题意义对于本软件的开发研究有如下意义:1、 提高对C+语言的驾驭能力2、 熟悉Visual C+开发平台以及MFC的底层结构3、 作为游戏开发的基础,对高等级AI(Artificial Intelligence,人工智能)的开发研究,将是未来各个行业所追求的高效率化工作的必然结果4、 作为软件本身,将能够解决很多普通象棋的问题,如:丢子、缺人、摆棋,对弈后忘记偶然产生的经典棋局等。1.4 本章小节 本软件是一个用C+编写的基于MFC的大众化游戏,玩家对象包括男女老少各种年龄段和各种阶层的人,下一章将简要重点介绍本软件的核心C+和MFC。 第43页第二章 开发环境与主要技术2.1 系统开发环境2.1.1 软件环境开发工具:Visual C+ 6.0 &Visual Assist,PhotoShop CS3开发语言:C+开发平台:Windows XP软件建模:Microsoft Visio 20032.1.2 硬件环境CPU: Intel 赛扬 400 或同频率处理器以上 内存: 256 MB或以上 硬盘: 最少剩余空间不得低于100MB 网络: TCP/IP协议支持的网络(拨号或者专线及局域网接入Internet都可以) 文件系统: FAT32 或者 NTFS (推荐NTFS)2.2 技术背景2.2.1 C+ 它是一种使用非常广泛的计算机编程语言。C+是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。C+融合了3种不同的传统编程C语言代表的过程性语言传统、C+在C语言基础上添加的类代表的面向对象语言的传统以及C+模板支持的通用编程传统。使用C+的原因之一就是为了利用其面向对象的特性。众所周知,C+程序的执行效率是非常的高,而游戏一般需要运行得非常快,所以本软件选择了C+作为了它的开发语言。2.2.2 C+的应用哪些程序是用C+写的:主流的3种操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性是用C+写的。 魔兽世界等几乎所有的网络游戏,百度搜索引擎(B),我们所用的大多数软件都是用C+写的(硬件也有很多用到C+的)。2.2.3 WIN32要了解MFC,必须先要知道MFC的重要砥柱WIN32 API。事实上,win32 api 就是 32位windows应用程序编程接口,是windows操作系统为32位应用程序开发者提供的统一的编程接口,任何运行在32位windows操作系统(win95、win98、winMe、win2k、winNT、winXP、vista)上的应用程序,最终都通过调用win32 api接口来实现其功能,即使是.net平台,当前其运行环境也建立在win32 api接口上,而mfc是微软为windows下的C 开发者提供的类库,由于win32 api接口是C语言形式的,对C 开发者颇为不便,微软在1989年推出mfc,目的是简化windows应用程序开发、并为C 开发者提供方便的类库,查看mfc源代码,可以发现其内部实现调用了win32 api,mfc所提供(调用)的win32 api只是全部win32 api的一个常用子集,mfc并未封装全部win32 api功能,因此在编写mfc时,根据需要还要直接调用win32 api。说通俗一点:Win32 API是 Windows系统下32位 Application Program Interface 应用程序接口,MFC是Microsoft Function Class 微软函数类库, 前者更加底层,在MFC程序里,可以调用WIN32 API的,MFC本来就用了很多WIN 32API,MFC编写的程序可以用在各种Windows环境下的。如图2-1所示的是一个Win32程序的开发流程1:图2-1 一个32位Windows SDK程序的开发流程资料来源:台湾,新竹:侯俊杰.深入浅出MFC,松岗电脑图资料股份有限公司,1998年09月。2.2.4 消息映射机制Windows应用程序采用的是消息响应处理机制,如图2-2所示2:图2-2 基于消息驱动的程序模型资料来源:西安:揣锦华.面向对象程序设计与VC+实践西安电子科技大学出版社,2008年5月14日。消息通常以以下三种方式产生:1通过输入设备,如键盘和鼠标;2通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件;3 来自Windows内部,如当一个后面的窗口显示到前面来时。本软件将会有大量的消息传入,比如移动棋子时的点击、放开鼠标,移动鼠标等。2.2.5 MFC MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C+环境下编写应用程序的一个框架和引擎,VC+是WinDOS下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC+血肉相连的部分(注意C+和VC+的区别:C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC+只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC+集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC+专配的。2.2.6 MFC类库简介下面按功能对MFC库中的常用类做一简要介绍3。1根类CObject Microsoft基本类库中的大多数类都是由CObject类派生而来的。CObject对所有由它派生出的类提供了有用的基本服务。2MFC应用结构类MFC应用结构类用于构造一个应用的框架,对大多数应用提供了通用功能。我们可以在框架中填写对于应用特定的功能。AppWizard可以产生几种类型的应用,所有这些都以不同的方式使用应用框架。1) 应用程序和线程支持类2) 命令例程类3) 文档类4) 文档模板类3窗口、对话框和控件类1) CWnd类2) 框架窗口类3) 对话框类4) 视图类5) 控件类6) 控件条类4菜单类5绘图和打印类6简单的数据类型类7数组、列表和映射类8文件和数据库类1) 文件I/O类2) DAO类3) ODBC类9Internet和网络类Internet和网络类允许与其他使用ISAPI的计算机或一个Windows Socket交换信息。10OLE类11调试和异常类在本软件中,将会构建CChessDLG类作为本程序的主窗口类。2.2.7 Visual C+Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。 本软件的所有开发将会在Visual C+6.0里面完成。2.3 本章总结 本章大致介绍了开发软件所用到的部分基础知识,并比较详细的介绍了作为核心的MFC的一个纲要。下一章将进入本软件的详细系统设计与分析。第三章 MFC开发项目实例中国象棋游戏(Chinese Chess)3.1 Chinese Chess 项目简介中国象棋(Chinese Chess)游戏是用Visual C+开发的一个MFC应用程序,含有人人对战、人机对战、机机对战、记录棋局、读入棋局、记录走法、摆棋、无限悔棋等各项功能。3.1.1 现有游戏软件分析在计算机普及的今天,玩游戏已成为了休闲的最主流方式之一。现今虽然有大量角色扮演类游戏、战略类游戏、动作类游戏,但大多数是受到国外文化的感染,真正属于棋牌类游戏的象棋游戏却不多,和象棋迷的数量不成正比。而真正属于带有中国悠久历史传统文化风格的象棋游戏却几乎没有。当前比较出名的有腾讯的QQ游戏平台里的象棋游戏,但是缺点也很明显,例如两个高手大战几百回合结束后却无法回忆起此次经典的棋局、无法以残局进行对战讨论等。而其他基于B/S架构的软件虽然有很多方便的地方(如不用安装,只要有浏览器便能运行),但同时会伴随掉线等状况,这在集中精神思考的象棋游戏里是不容许出现的。3.1.2 Chinese Chess的优势 综上所述,基于MFC的中国象棋游戏,能够高效率并且安全的运行,满足各个阶层象棋迷的需求:新手、熟手、老手,更能够减少发生运行错误而导致的不可挽回的后果。和谐友好、简单明了的界面设计更能让不会使用电脑的用户也能享受到象棋的魅力。3.2 项目详细介绍3.2.1 中国象棋的简介和规则如果您已经了解了中国象棋的规则,那请您跳过这一小节。象棋是由两人轮流走子,以“将死”或“困毙”对方将(帅)为胜利。对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终了。轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走一着。双方各走一着,称为一个回合。中国象棋的规则大概分为两个部分:走棋和吃棋(1) 中国象棋的走棋帅(将)红方为“帅”,黑方为“将”。帅和将是棋中的首脑,是双方竭力争夺的目标。它只能在九宫之内活动,可上可下,可左可右,每次走动只能按竖线或横线走动一格。帅与将不能在同一直线上直接对面,否则走方判负。仕(士)仕(士)是将(帅)的贴身保镖,它也只能在九宫内走动。它的行棋路径只能是九宫内的斜线。 象(相)红方为“相”,黑方为“象”。相(象)的主要作用是防守,保护自己的帅(将)。它的走法是每次循对角线走两格,俗称“象走田”。相(象)的活动范围限于河界以内的本方阵地,不能过河,且如果它走的田字中央有一个棋子,就不能走,俗称“塞象眼”。如图3-1所示:图3-1:塞象眼车 车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,步数不受限制。因此,一车可以控制十七个点,故有“一车十子寒”之称。炮炮在不吃子的时候,走动与车完全相同。马 马走动的方法是一直一斜,即先横着或直着走一格,然后再斜着走一个对角线,俗称“马走日”。马一次可走的选择点可以达到四周的八个点,故有八面威风之说。如果在要去的方向有别的棋子挡住,马就无法走过去,俗称“蹩马腿”。如图3-2所示:图3-2:蹩马腿兵(卒)红方为“兵”,黑方为“卒”。兵(卒)在未过河前,只能向前一步步走,过河以后,除不能后退外,允许左右移动,但也只能一次一步。(2) 中国象棋的吃子任何棋子在走动时,如果一方棋子可以到达的位置有对方的棋子,就可以把对方棋子拿出棋盘(称为吃子)而换上自己的棋子。只有炮的吃子方式与它的走法不同:它和对方棋子之间必须隔一个子(无论是自己的还是对方的),具备此条件才能吃掉人家。一定要注意,中隔一个棋子,这个棋子俗称“炮架子”。帅和将被吃或不能动弹即输棋。(3) 中国象棋的棋子和棋盘关于棋子棋子共有三十二个,分为红黑两组,各有十六个,由对弈的双方各执一组。兵种是一样的,分为七种:帅(将)、仕、相(象)、车、马、炮、兵(卒)。红方持有棋子帅一个,仕、相、车、马、炮各两个,兵五个。黑方持有棋子黑方有将一个,士、象、车、马、炮各两个,卒五个。注:其中帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红棋和黑棋而已。关于棋盘棋子活动的场所,叫作“棋盘”。在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点,棋子就摆在交叉点上。中间部分,也就是棋盘的第五,第六两横线之间末画竖线的空白地带称为“河界”。两端的中间,也就是两端第四条到第六条竖线之间的正方形部位,以斜交叉线构成“米”字方格的地方,叫作“九宫”。如图3-3所示:图3-3:象棋棋盘整个棋盘以“河界”分为相等的两部分。为了比赛记录和学习棋谱方便起见,现行规则规定:按九条竖线从右至左用中文数字一-九来表示红方的每条竖线,用阿拉伯数字19来表示黑方的每条竖线。对弈开始之前,红黑双方应该把棋子摆放在规定的位置。任何棋子每走一步,进就写“进”,退就写“退”,如果像车一样横着走,就写“平”。3.2.2 部分功能代码详解CChessDlg类(主窗口类):每一个MFC程序都有一个主窗口类,这个主窗口类和其他窗口一样从操作系统中获取信息。在对话框中会对来自对话框控件的处理消息感兴趣,因为它说明了对话框是如何与玩家交互的4。现在将对该类的主要内容进行说明和分析:对于大多数普通对话框,可以向对话框派生类中添加成员变量以存储数据。CChessDlg定义的公有类成员变量,变量表示的含义如代码后的注释:public:CCoolButtonm_btnStop;/停止按钮CCoolButtonm_btnUndo;/悔棋按钮CCoolButtonm_btnRedo;/取消悔棋的还原按钮CCoolButtonm_btnComputer;/电脑走棋按钮CListBoxm_lstChessRecord;/记录走法的文本框CGradientProgressCtrl m_progressThink;/显式电脑正在思考的进程条CStaticm_staticTip;/输出文本CStringm_strOutputInfo;/输出文本CChessDlg类定义的类成员函数,函数表示的含义如代码后的注释:private:CString GetMoveStr(int nFromX,int nFromY,int nToX,int nToY,int nSourceID);bool IsChessOver(int nChessSort);/摆棋时判断某种类型棋子有无剩余int IsGameOver(BYTE position9);/判断是否已有输赢void InvertChessBoard(BYTE cb9); /对换红黑双方棋子void AddChessRecord(int nFromX,int nFromY,int nToX,int nToY,int nUserChessColor,int nSourceID); /记录下棋步骤下面介绍一个函数CString CChessDlg:GetMoveStr(int nFromX,int nFromY,int nToX,int nToY,int nSourceID),这个函数其实是走法记录器,(玩家或电脑)每走一步棋,就将这步的走法记录下来现实在右边的ListBox上面。下面以红马为例说明走法记录器是如何工作的:case R_HORSE:/红马bIsAgain=false;for(i=0;inFromY-1)if(nFromYnToY)str=红:前马进+ConvertDigit2Chinese(10-nToX);elsestr=红:前马退+ConvertDigit2Chinese(10-nToX);elseif(nFromYnToY)str=红:前马进+ConvertDigit2Chinese(10-nToX);elsestr=红:前马退+ConvertDigit2Chinese(10-nToX);elseif(nFromYnToY)str=红:马+ConvertDigit2Chinese(10-nFromX)+进+ConvertDigit2Chinese(10-nToX);elsestr=红:马+ConvertDigit2Chinese(10-nFromX)+退+ConvertDigit2Chinese(10-nToX);break;CChessDlg定义的成员函数与对话框控件之间的交换数据自动映射的数据。以下是保护的类成员变量,变量存储的数据如下,主要包括棋盘信息、用户信息、电脑当前状态等:int m_iWhoChess;/下步该谁走棋int m_nUserChessColor;/用户棋子颜色BYTE m_byChessBoard109; /棋盘数组,用于显示棋盘BYTE m_byBackupChessBoard109;/备份棋盘数组,用于出错恢复BYTE m_byShowChessBoard109; /用于显示的棋盘MOVECHESS m_MoveChess; /用于保存当前被拖拽的棋子的结构POINT m_ptMoveChess; /用于保存当前被拖拽的棋子的位置CBitmap m_BoardBmp;/bitmap图用于显示棋盘CImageList m_Chessman; /用于绘制棋子的ImageList对象int m_nBoardWidth; /棋盘宽度int m_nBoardHeight; /棋盘高度CPoint m_MousePoint; /当前鼠标所在点Status m_Status; /当前状态bool m_bIsThinking; /电脑是否正在想bool m_bIsBegin; /是否已开始下棋int m_nWillChessColor; /下一步该哪方下CHESSMOVE m_cmBestMove; /最佳走法UNDOMOVE m_umUndoMove; /悔棋走法int m_iChessSort; /下棋方式int m_iDepthSort; /深度方式int m_iBout; /已下的回合数,如有悔棋算减以下是CChessDlg类定义的一部分从操作系统中接收的消息处理函数,大部分消息都来自于鼠标的点击和拖动,其中鼠标的点击主要是针对菜单和按钮,而鼠标的拖动主要是针对棋子:protected:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/按下鼠标左键afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/放开鼠标左键afx_msg void OnMouseMove(UINT nFlags, CPoint point);/鼠标移动afx_msg void OnSet();/点击参数设置菜单afx_msg void OnAbout();/点击关于菜单afx_msg void OnOpenfile();/点击打开菜单afx_msg void OnSavefile();/点击保存菜单afx_msg void OnClose();/点击退出按钮afx_msg void OnClearcb();/点击清空棋盘按钮afx_msg void OnNewgame();/点击新游戏按钮afx_msg void OnBtnundo();/点击悔棋按钮afx_msg void OnBtnredo();/点击还原按钮afx_msg void OnBtnStop();/点击停止按钮afx_msg void OnPreview();/点击预览按钮afx_msg void OnPreviewover();/点击结束预览按钮afx_msg void OnHelp();/点击帮助菜单下面详细说明几个重要的消息处理函数。void CChessDlg:OnBtnundo(),这个函数表示的意思就是当玩家按下悔棋按钮后,软件将对现有数据如何处理(也就是如何进行悔棋的操作)。函数首先判断按钮是否处于可用状态:已有棋步。然后从一个栈指针中取出上一条数据传给主窗口类,重绘屏幕完成悔棋功能。void CChessDlg:OnBtnundo() / TODO: Add your control notification handler code hereif(m_stackUndoMove.empty()return;m_btnRedo.EnableWindow(1);/激活悔棋按钮m_bIsGameOver=false;for(int i=0;iUndoChessMove(m_byChessBoard,&m_umUndoMove.cmChessMove,m_umUndoMove.nChessID);memcpy(m_byShowChessBoard,m_byChessBoard,90);memcpy(m_byBackupChessBoard,m_byChessBoard,90);m_stackUndoMove.pop();m_lstChessRecord.DeleteString(m_lstChessRecord.GetCount()-1);/重绘屏幕 InvalidateRect(NULL,FALSE);UpdateWindow();m_iBout-;if(m_stackUndoMove.empty()m_staticTip.SetWindowText(棋已悔完,无棋可悔了);m_btnUndo.EnableWindow(0);/冻结悔棋按钮void CChessDlg:OnBtnredo(),这个函数表示如果玩家点击还原按钮后,软件将对现有数据如何处理。同上函数首先判断按钮是否处于可用状态,再从指向最后一条栈信息的指针中获取数据传给主窗口,重绘屏幕完成还原功能。void CChessDlg:OnBtnredo() / TODO: Add your control notification handler code hereif(m_stackRedoMove.empty()return;UNDOMOVE umTemp;m_iBout+;m_btnUndo.EnableWindow(1);/激活悔棋按钮for(int i=0;iRedoChessMove(m_byChessBoard,&umTemp.cmChessMove);memcpy(m_byShowChessBoard,m_byChessBoard,90);memcpy(m_byBackupChessBoard,m_byChessBoard,90);m_stackUndoMove.push(umTemp);m_stackRedoMove.pop();this-AddChessRecord(umTemp.cmChessMove.From.x+1,umTemp.cmChessMove.From.y+1,umTemp.cmChessMove.To.x+1,umTemp.cmChessMove.To.y+1,m_nUserChessColor,umTemp.cmChessMove.nChessID);/重绘屏幕 InvalidateRect(NULL,FALSE);UpdateWindow();if(m_stackRedoMove.empty()m_staticTip.SetWindowText(棋已还原完,无棋可还原了);m_btnRedo.EnableWindow(0);/冻结还原按钮CEveluation类:估值类,对给定的棋盘进行估值,对每种不同的棋子估值让电脑能够在不同的棋路选择上有一个大致的方向,即值越高越重要。本软件设定为:兵100,士250,象250,车500,马350,炮350,王10000。然后增加棋子的灵活性,每个棋子每多一条路可选,则为此棋子增值。本软件定义为:兵15,士1,象1,车6,马12,炮6,王0。这个类的成员变量定义如下:protected:int m_BaseValue15; /存放棋子基本价值int m_FlexValue15; /存放棋子灵活性分值short m_AttackPos109; /存放每一位置被威胁的信息BYTE m_GuardPos109; /存放每一位置被保护的信息BYTE m_FlexibilityPos109;/存放每一位置上棋子的灵活性分值int m_chessValue109; /存放每一位置上棋子的总价值int nPosCount; /记录一棋子的相关位置个数POINT RelatePos20; /记录一棋子的相关位置long m_nAccessCount;这个类的成员函数定义如下:public:virtual int Eveluate(BYTE position109,BOOL bIsRedTurn,int nUserChessColor); /估值函数,对传入的棋盘打分,bIsRedTurn表示轮到谁走棋int GetAccessCount()return m_nAccessCount;/得到访问节点数void ClearAccessCount()m_nAccessCount=0; /重置访问节点数为0protected:void AddPoint(int x,int y); /将一个位置加入相关位置队列bool CanTouch(BYTE position109,int nFromX,int nFromY,int nToX,int nToY); /判断位置From的棋子是否能走到位置Toint GetRelatePiece(BYTE position109,int j,int i);/列举与指定位置的棋子相关的棋子int GetBingValue(int x,int y,BYTE CurSituation9);/为每一个兵返回附加值,CurSituation是棋盘,不是兵返回0CMoveGenerator类:走法产生器,对当前给定的棋盘局面搜索出所有可能的走法并存储在名为CHESSMOVE的结构中.如下截取了CMoveGenerator中定义的比较重要的函数:public: BOOL IsValidMove(BYTE position109,int nFromX,int nFromY,int nToX,int nToY,int nUserChessColor); /走法是否有效int CreatePossibleMove(BYTE position109,int nPly,int nSide,int nUserChessColor);/产生所有可能的走法protected:void Gen_BPawnMove(BYTE position109,int i,int j,int nPly); /产生黑卒的走法,nPly表明插入到List第几层void Gen_RPawnMove(BYTE position109, int i,int j,int nPly); /产生红兵的走法,nPly表明插入到Lis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论