基于VC的成三棋游戏程序的设计与实现_第1页
基于VC的成三棋游戏程序的设计与实现_第2页
基于VC的成三棋游戏程序的设计与实现_第3页
基于VC的成三棋游戏程序的设计与实现_第4页
基于VC的成三棋游戏程序的设计与实现_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、 届别 2012届 学号7 毕业设计(论文)基于VC的成三棋游戏程序的设计与实现姓 名 剑 系 别、 专 业 计算机科学系、网络工程 导师、职称 清华、讲师 _完 成 时 间2012年4 月 8 日 目 录摘要IABSTRACTII1 绪论11.1课题背景12 系统实现技术与开发环境12.1 C/C+简介12.2 VC开发环境22.2.1 GDI绘图22.2.2对话框32.2.3消息响应32.2.4游戏编程思想52.3MFC编程思想62.3.1MFC中类的结构与联系62.3.2MFC中类的作用83 需求分析83.1游戏用户分析83.2游戏功能分析83.3游戏功能模块主要功能84 系统概要设计9

2、4.1总体设计94.1.1游戏总体类的设计94.1.2游戏总体E-R图设计94.2模块结构设计104.2.1游戏登陆者管理模块104.2.2 游戏者下棋实现模块104.2.3数据流网络传输模块124.3英雄榜设计124.3.1英雄榜数据结构设计124.3.2逻辑结构设计124.4游戏规则说明134.4.1 下棋阶段134.4.2 行棋阶段135 系统详细代码设计135.1游戏者登录管理模块135.1.1 游戏者登录友好界面的实现135.1.2 游戏帮助文档与基本规则的说明165.2 游戏者下棋模块的实现165.2.1下子与打子阶段的实现165.2.2行子阶段的实现245.2.3输赢判断的实现2

3、75.2.4 英雄榜的数据更新295.3 网络模块的实现315.3.1网络初始化325.3.2网络的调用325.3.3网络类的实现326 游戏测试386.1 登录的测试386.2 下棋的测试396.3走棋阶段的实现406.4 英雄榜的测试:42结束语43参考文献44致4747 / 52摘 要随着科学技术(特别是计算机网络技术)日新月异的发展人们的生活也发生了空前的变化。现在生活在大都市的人们总免不了想体验儿时那乡村乐趣,只是苦恨没有途径;从小在城市长大的孩子也想多一些趣味游戏,并且他们父母也希望孩子可以多了解了解农村生活以助于孩子的成长。成三棋,一款乡村儿时游戏,将我们彼此拉近了距离,结合计算

4、机网络技术使得城乡娱乐简易可行。该游戏以vc+为基础平台,借鉴五子棋、象棋、围棋等多种棋种核心算法,采用网络套接字(Socket)技术,引用MFC类库与WIN API函数;实现友好的人机界面,网对弈、单机对弈等多项功能。拥有浓浓的乡村风味、简易操作、强烈的娱乐性与趣味性。关键词:VC/VC+;网络游戏;成三棋;广度搜索算法ABSTRACTWith the dramatic development of science and technology especially the computer networking technology.Our life has an unprecedente

5、d change. People who live in the metropolis cant help to thinking of experiencing the fun of childhood again,but bitterly to find that time past and never find again. The children burn in the city also want to have more funny games,and to their parent,its very helpful for the childrengrowth to learn

6、 more about rural lives.Three chess, a rural game played in childhood,puts us together,as well as makes rural entertainment more simple and practical with combining computer networking technology.The game,based on VC+,has not only realized many functions,such as a comfortable interface between human

7、 beings and machine, a network competition and single-machine competition ,etc. But owned a thick rurals flavors simple and easy operation,strong entertainment and interesting,which mainly are achieved by virtue of refering the core algorithm ofgobang ,etc,adopting network socket technology,quoting

8、MFC class library and WIN API functions. Key words:VC/VC+; NetWork Game;Three-in-a low;Breadth first search algorithm1 绪论1.1课题背景游戏软件是当世界发展最迅速,最有影响力,最有潜力与活力的领域之一1游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有大部分喜欢游戏的,因此游戏软件在很大程度上给予绝大部分人精神上的娱乐第二次世界大战以后,电子计算机技术得到了突飞猛进的发展先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子子计算机一代一代实现更新,同

9、时软件技术也发展迅速2在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”“判断”能力反过来与人较量由于不断修改更新,使计算机的“智力”水平与人难分高低到了90年代,游戏软件已经为世界各国的人使用,BLACKISLAND和Blizzard。这两个强大的游戏制作组起到了巨大的带动作用,还有中国的洛河工作室在国也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日益丰富的生活需求得以满足3。

10、成三棋,规则较简单,易学易懂,也是一款传统的棋类游戏,她的历史也非常悠久,在公元前500多年就在我国出现了,是一种老少皆宜的棋类活动。特别是在农村,不会玩这个游戏的很少的,当然,随着人们的物质文化生活的不断丰富,现在下成三棋的人越来越少。她没有围棋、象棋这样繁复,与五子棋有些相似,但又有其自身独特的魅力,方寸之间,便能突显弈者的奇思妙想。 成三棋游戏,旨在为游戏爱好者提供一种新的娱乐途径,让大家在娱乐的同时锻炼思维,增长智慧,也将成三棋这一传统的棋类游戏利用网络进行推广发扬,使之广为流传。2 系统实现技术与开发环境2.1 C/C+简介C语言的特点: C语言是一种结构化语言。它层次清晰,便于按模

11、块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言4。 C+简介:在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C+。 C+进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C+目前流行

12、的最新版本是Borland C+4.5,Symantec C+6.1,和Microsoft VisualC+ 2.0。C+提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度5。 2.2 VC开发环境Microsoft Visual C+,(简称Visual C+、MSVC、VC+或VC)微软公司的C+开发工具,具有集成开发环境,可提供编辑C语言,C+以与C+/CLI等编程语言。VC+整合了便利的除错工具,特别是整合了微软视窗程式设计(Window

13、s API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C+ 20106。2.2.1 GDI绘图GDI(Graphics Device Interface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C+类封装,参见表2-1。表2-1Windows应用程序MFCWin32 API执行程序用户界面(User)GDI+图形子系统(GDI)设备驱动程序核(Kernel)图形驱动程序硬件抽象层(HAL)计算机硬件GDI

14、与Windows操作系统(其中彩色部分为操作系统)传统GDI是随Windows 1.0于1985年11月推出的,新式GDI+则是随Windows XP于2001年10月推出的GDI的改进版,增加了混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。随Windows Vista与.NET框架3.0微软于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(Windows Presentation Foundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windo

15、ws的下一代GUI显示系统。2.2.2对话框对话框是一种次要窗口,包含按钮和各种选项,通过它们可以完成特定命令或任务。 查找和替换对话框 对话框与窗口有区别,它没有最大化按钮、没有最小化按钮、大都不能改变形状大小。(“打开文件”对话框是可以改变大小的) 对话框:是人机交流的一种方式,用户对对话框进行设置,计算机就会执行相应的命令。对话框中有单选框、复选框等。对话框可以分为模式对话框和无模式对话框两种类型。 为了能够方便的操作对话框,MFC为用户提供了CDialog类。它是在屏幕上显示对话框的基类,与对话框资源紧密相关,提供了管理对话框的接口,封装了一些对话框的相关操作。 从CDialog的定义

16、代码可以看出,Cdialog提供了两套构建Cdialog对象的系统,分别用于模式对话框和无模式对话框。 无模式对话框对象的构建过程,它首先调用缺省的构造函数生成对话框对象,然后调用Create函数创建和初始化对话框。Cdialog类中的Create函数有两种函数原型: BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );2.2.3消息响应VC+的MFC类库实际上是Windows下 C+编程的一套最为流行

17、的类库6。MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效、灵活的使用MFC编程,了解MFC的体系结构往往可以 使编程工作事半功倍。它合理的封装了WIN32 API函数,并设计了一套方便的消息映射机制。由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击、鼠标移动等操作都只能由视类窗口捕获。一个MFC消息响应函数在程序中有三处相关信息:函数原型、函数实现和以与用来关联消息和消息响应函数的宏。(1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明。(2)消息映射宏:在视图类的源文件中,BEGIN_M

18、ESSAGE_MAP() END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中有一ON_WM_LBUTTONDOWN()消息映射宏,这个宏的作用就是把鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数关联起来,通过这种机制,一旦有消息产生,程序就会调用相应的消息响应函数来进行处理。(3)消息响应函数的定义7:在视图类的源文件中,可以看到OnLButtonDown函数的定义。头文件中在两个AFX_MSG注释宏之间是消息响应函数原型的声明。源文件中有两处:一处是在两个AFX_MSG_MAP注释宏之间的消息映射宏,通过这个宏把消息与消息响应函数关联起来;

19、另一处是源文件中的消息响应函数的实现代码。  在Win32应用程序中,当有消息产生时,操作系统会把这条消息放到应用程序的消息队列中,应用程序通过GetMessage函数从这个队列中取出一条具体的消息,并通过DispatchMessage 函数把消息交给操作系统,调用的是应用程序的窗口过程,即窗口过程函数WndProc进行处理,然而在MFC程序中,并不是按这种途径进行处理的, 只要定义了与消息有关的三处信息后,便可实现消息的响应处理。MFC中采用的这种消息处理机制称为MFC消息映射机制。 MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数

20、静态对照表,即消息映射表。在消息映射表中,消息与对应的消息处理函数指针是成对出现的。某个类能处理的所有消息与其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息。如果能处理此消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。   MFC消息映射机制的实际实现过程:MFC在后台维护了一个窗口句柄与对应的C+对象指针的对照表,以例中的CDrawView类为例,与CDrawView对象相关的有一个窗口,窗口当然有它的窗口句柄,该句柄与CDrawView对象的一个指针(即C

21、DrawView*)存在一一对应关系,在窗口句柄与C+对象对照表中就维护了这种对应关系。当收到某一个消息时,消息的第一个参数就指明了该消息与哪个窗口句柄相关,通过对照表,就可以找到与之相关的C+对象指针。然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc函数,该函数定义位于WinCore.cpp中.CWnd:WindowProc函数部调用了一个OnWndMsg函数,真正的消息路由,也就是消息映射是由此函数完成的。OnWndMsg函数的处理过程:首先判断消息是否有消息响应函数。判断方法是在相应窗口类中查找所需的消息响应函数。因为传递给WindowProc的是窗口

22、子类指针,OnWndMsg会到相应的子类头文件中查找,看看DECLARE_MESSAGE_MAP()宏之上,两个AFX_MSG注释宏之间是否有相应的消息响应函数原型的声明;再到子类的源文件中看看,BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()两个宏之间是否有相应的消息映射宏。如果通过上述步骤,找到了消息响应函数,接着就调用该响应函数,对消息进行处理。如果在子类中没有找到,那么就交由基类进行处理。通过以上步骤,MFC就实现了具体的消息映射,从而完成对消息的响应。2.2.4 游戏编程思想游戏架构参考示意图2-1:图 2-1 游戏编程模块Launcher的功能:(1)Wi

23、ndows主函数,创建窗口,以与处理消息(2)创建游戏,调用游戏的初始化、运行、销毁函数。(3)模板式的框架,准备好一个合适自己使用的,主要是对消息处理过程的编写,直接影响游戏之外窗口的响应情况。Game的功能:(1)初始化游戏,创建Model、View和Timer(2)运行游戏,通过Timer来控制刷新帧率,然后获取操作,调用Model执行游戏逻辑,然后使用调用View画出画面。(3)销毁,将Model、View和Timer销毁。Model的功能:(1)游戏逻辑,游戏需要执行的运算都放在这里,可以通过创建其它的类来完成。(2)提供操作接口,运行游戏时根据用户操作来调用。(3)存储游戏的绘制信

24、息,View将使用这些信息绘制画面。View的功能:(1)绘制画面Timer的功能:(1)定时器,给需要时间控制的类提供定时的功能。最主要的部分是Model,所有的游戏逻辑都在这里实现,设计到Model的应该只使用标准C+元素,方便移植。单人游戏和多人游戏,都应通过Model提供的接口来实现。View中,应该只使用Model提供的信息,绘制画面如果需要增加GUI,应该再单独创建类,然后加入到Game中。例如:俄罗斯方块:添加Block类,实现各种方块。在Model中实现方块的下落与清除,提供出操作的接口。实现双人对战,创建两个Model就可以了8。2.3 MFC总述MFC是Win API与C+

25、的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规,用于在C+环境下编写应用程序的一个框架和引擎,VC+是Windows下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC+血肉相连的部分同BC+集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC+专配的9。2.3.1 MFC中类的结构与联系 MFC中类的继承、派生结构与联系图2-2 应用层结构 图2-3 windows支持层结构图 2-4 继承自CObject

26、2.3.2MFC中类的作用CAboutDlg类是用来建立对话框的,与对话框有关的问题都有这个类来处理。CXXXApp类是自己建的类XXX代表自己的项目名称,是实现自己容的主要类。CXXXDoc类是用来处理文档的类。CXXXView类是用来处理界面的视图类。CMainFrame类是主框架类10。3 需求分析3.1 游戏用户分析本游戏主要针对的是年龄在10至15岁的未成年人,这阶段年龄的孩子正处于好奇心特别重之时。对世界的认知也正处于高峰期,了解社会了解贫苦人群体验乡村生活对他们形成完整的世界观有莫大的促进作用。3.2游戏功能分析通过软件功能的分析,根据五子棋爱好者的需求,得出以下需求信息:(1)

27、 具有重新开始功能。(2) 具有认输功能。(3) 具有提示该轮到哪一方下棋的功能。(4) 退出游戏功能。(5) 判断胜负功能。(6) 悔棋功能。还有用户对游戏界面的要求,通过上述的用户需求,我们可以得出一个总体的设计方案。由上述的用户需要,可以对程序的基本功能进行一个有效的分析,规定下游戏的基本功能。3.3 游戏功能模块主要功能(1)登录模块登录模块是解决登录与注册问题的模块,为用户建立个人信息方便用户与其他用户的联系。也有利于本游戏的推广。(2) 下棋模块主要实现下棋功能,分阶段的游戏不仅有利于管理,也有利于游戏者的发挥。(3)英雄排行榜模块有利于用户了解对手,也为用户提升自己的能力寻找合适

28、的对手提供了方便。4 系统概要设计4.1 总体设计4.1.1游戏总体类的设计图4-1 类的关系设计4.1.2游戏总体E-R图设计图4-2 游戏E-R图4.2模块结构设计4.2.1游戏登陆者管理模块(1) 注册或登录界面设计 1)昵称 2)确认 3)取消 (2) 游戏界面设计,见图4-3:(a) (b)(c)图4-3 界面结构设计(3)人性化棋子设计,见下图4-4:(a)(b)图4-4 棋子石子、棍子4.2.2 游戏者下棋实现模块 游戏流程见下图4-3:游戏开始轮流投子投子是否有效是否后手方已下第12子否u是是双方开始挪子恢复被打子的位置某方棋子数目是否小于3是否u棋局结束改变相关记录是否成三是

29、否没有可打子是否是否u选择拿调对方非成三子 在该位置上贴上一张图片表示该位置不能投子改变相关记录否u换手点击的棋子是否有效该棋开始闪烁 准备下一步的落子位置移动是否合法消除原来显示新位置相关记录改变是否成三选择拿调对方 非成三子相关记录改变是是否否是否换手图4-3游戏流程图4.2.3数据流网络传输模块 传输逻辑图见下图4-4:图4-4网络数据流程图 游戏程序分两个部分,网络连接部分和各方自己的操作部分,网络连接部分结构如图。各方操作部分的模式为:接受到数据产生数据发送数据。4.3英雄榜设计4.3.1英雄榜数据结构设计游戏者与其基本信息是英雄榜的基础,在此基础上要对其进行数据排序选择出前三名。本

30、游戏由于服务器未能实现故而采用本地数据存储法,存储到本地的硬盘中在开始时调用ReadScore()函数读写,而后由WriteScore()排序。4.3.2逻辑结构设计 英雄榜的数据流动见下图4-5:图4-5 英雄榜逻辑设计结构4.4 游戏规则说明4.4.1 下棋阶段(1)首先双方在棋盘上轮流投子。(2)在投子期间,如果有某一方的某一行或一列或斜列,都为该方棋子(也就是成三)该方选择打子(打掉必须是对方的非成三子,如果对方的棋子都是成三子,便换手)。该打子位置被贴上一大小与棋子一样大小的图片(表示该位置不能投子。在挪子部分的时候,该位置被撤销)。4.4.2 行棋阶段(3)当后手方投下第九子,开始

31、由先手方移动棋子,进入挪子部分,开始轮流挪子。 (4)挪子期间的规则是:当需要点击想移动某一棋子时,该棋子便高亮。再点击它将去的位置时,原来的位置棋子消失新位置出现该方棋子。当点击某棋子使其高亮。该期间的打子规则与投子期间几乎一样,就是被打子位置不会被贴图,而会直接消失。(5)当一方棋子数少于3或该方走棋时发现无棋可移动(也就该方是没气),则该方为输了,棋局结束。5 系统详细代码设计5.1游戏者登录管理模块5.1.1 游戏者登录友好界面的实现图5-1 登录对话框BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)/界面初始化函数if( !C

32、FrameWnd:PreCreateWindow(cs) )return FALSE;int UI_device_width=800,UI_device_height=600;/设置界面宽与高 cs.x=10;/界面在屏幕的左上角坐标 cs.y=10; cs.cx=UI_device_width; cs.cy=UI_device_height;return TRUE;void CTIRView:OnDraw(CDC* pDC)CTIRDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native dat

33、a herestatic i=0;if (i=0)TIRBGPEN.LoadBitmap(IDB_TIRBG);TIRBG.CreateCompatibleDC(pDC); TIRBG.SelectObject(TIRBGPEN);TIRPAUSEPEN.LoadBitmap(IDB_TIRPAUSE);TIRPAUSE.CreateCompatibleDC(pDC); TIRPAUSE.SelectObject(TIRPAUSEPEN);TIRREMORSEPEN.LoadBitmap(IDB_TIRREMORSE);TIRREMORSE.CreateCompatibleDC(pDC); T

34、IRREMORSE.SelectObject(TIRREMORSEPEN);TIRSTARTPEN.LoadBitmap(IDB_TIRSTART);TIRSTART.CreateCompatibleDC(pDC); TIRSTART.SelectObject(TIRSTARTPEN);i=1; pDC->BitBlt(0,0,800,500,&TIRBG,0,0,SRCCOPY);/画背景图pDC->BitBlt(580,70,680,170,&TIRSTART,0,0,SRCAND);pDC->BitBlt(580,200,680,300,&TIR

35、PAUSE,0,0,SRCAND);pDC->BitBlt(580,330,680,430,&TIRREMORSE,0,0,SRCAND); DrawChessboard(pDC);/画成三 GameInit(pDC); /*函数名称:DrawChessboard(CDC* pDC)*函数介绍:绘制棋盘*输入参数:CDC指针*返回值:无*/void CTIRView:DrawChessboard(CDC *pDC)/定义画笔CPen chessboard;chessboard.CreatePen(0,2,RGB(0,0,0);int k;/利用循环与对称性画棋盘pDC->S

36、electObject(&chessboard);/选择画笔for (k=0;k<3;k+)pDC->MoveTo(90+60*k,70+60*k); pDC->LineTo(90+60*k,430-60*k);pDC->LineTo(450-60*k,430-60*k);pDC->LineTo(450-60*k,70+60*k);pDC->LineTo(90+60*k,70+60*k);pDC->MoveTo(90,70);/画线pDC->LineTo(210,190);pDC->MoveTo(330,310);pDC->L

37、ineTo(450,430);pDC->MoveTo(270,70);/画|线pDC->LineTo(270,190);pDC->MoveTo(270,310);pDC->LineTo(270,430);pDC->MoveTo(450,70);/画/线pDC->LineTo(330,190);pDC->MoveTo(210,310);pDC->LineTo(90,430);pDC->MoveTo(90,250);/画-线pDC->LineTo(210,250);pDC->MoveTo(330,250);pDC->LineT

38、o(450,250); /*画棋盘end*/5.1.2 游戏帮助文档与基本规则的说明当用户单击工具条中帮助文档时调出帮助文档,暂时未能实现。5.2 游戏者下棋模块的实现下棋阶段的使用的图片ID见下图5-2:图5-2 下棋阶段的图片ID5.2.1下子与打子阶段的实现有持石头者先下,石头棍子轮流下子,一落子即刻判断成三情况JuTIR(),修改cross.tir。若为成三则为1,若没成三则为0。/*函数名:JuTIR(int x,int y,int type)*函数作用:判断并标记是否成三*函数实现:奇数列判断前后左右,偶数列判断前或者后左或者右*返回值:true or false*/bool Ma

39、nager:JuTIR(int x,int y,int type)int mx=x,my=y;if(Location(&mx,&my) if(my%2=1)if(crossmx(my-1+8)%8.type=type&&crossmx(my+1+8)%8.type=type)crossmxmy.tir=1;crossmx(my-1+8)%8.tir=1;crossmx(my+1+8)%8.tir=1; return true;if(cross(mx+3-1)%3my.type=type&&cross(mx+3+1)%3my.type=type)

40、cross(mx+3-1)%3my.tir=1;cross(mx+3+1)%3my.tir=1;crossmxmy.tir=1;return true;return false;else if(crossmx(my-1+8)%8.type=type&&crossmx(my-2+8)%8.type=type)crossmxmy.tir=1;crossmx(my-1+8)%8.tir=1;crossmx(my-2+8)%8.tir=1; return true;if(cross(mx+3-1)%3my.type=type&&cross(mx+3+1)%3my.typ

41、e=type) cross(mx+3-1)%3my.tir=1;cross(mx+3+1)%3my.tir=1;crossmxmy.tir=1;return true;if(crossmx(my+2+8)%8.type=type&&crossmx(my+1+8)%8.type=type)crossmxmy.tir=1;crossmx(my+2+8)%8.tir=1;crossmx(my+1+8)%8.tir=1; return true;return false;return false;成三后拥有打掉对方没成三子的权力JuHave(),若没有棋子可打则弃权。其中石头打棍子用,

42、同理棍子打石头用。/*函数名:JuHave(type);*函数作用:判断是否有棋可打*/bool Manager:JuHave(int type)for(int i=0;i<3;i+)for(int j=0;j<8;j+) if(crossij.type=type&&crossij.tir=0)return true;return false;若某一方后悔走了某一步可以申请悔棋(两步没有打子才有效否则即使对方同意也无效),点击右边第三图片响应GameBack(2)。/*函数名:GameBack(steps);*函数作用:悔棋*输入参数:悔棋步数*返回值:bool*/

43、bool Manager:GameBack(int steps)if(nKeyDown<steps)return false;int mx,my;nKeyDown-=steps;bool Judge=false;for(int k=nKeyDown;k<nKeyDown+steps;k+)/检查是否可以悔棋 mx=GameChessInfok.x; my=GameChessInfok.y;Location(&mx,&my);if(crossmxmy.type!=10&&crossmxmy.type!=20)Judge=true;if(Judge=fa

44、lse) for(int k=nKeyDown;k<nKeyDown+steps;k+) mx=GameChessInfok.x; my=GameChessInfok.y;Location(&mx,&my);crossmxmy.type=0; crossmxmy.have=0;GameNowState=(GameNowState/10+1)%2+1)*10+GameNowState%10; else nKeyDown+=steps;LastCh=GameChessInfonKeyDown-1;return true;/*函数名:AddChess(int x,int y);

45、*函数作用:增加一个棋子;*传入参数:坐标*备注说明:先判断棋盘状态,判断棋子类型,加棋子,更新数据*返回值:true or false;*/bool Manager:AddChess(int x,int y) if(Checkcross(x,y,-1)=0&&(GameNowState=10|GameNowState=20)/加入到棋盘 int mx=x,my=y; if(Location(&mx,&my) crossmxmy.have=1; crossmxmy.type=GameNowState; crossmxmy.num=nKeyDown;if(JuTI

46、R(x,y,GameNowState) crossmxmy.tir=1;else crossmxmy.tir=0; /加入到下棋历史保存 GameChessInfonKeyDown.type=GameNowState; GameChessInfonKeyDown.x=x; GameChessInfonKeyDown.y=y; GameChessInfonKeyDown.tir=crossmxmy.tir; LastCh=GameChessInfonKeyDown; nKeyDown+; if(GameNowState=10) Player1ChessNum+; if(GameNowState=

47、20) Player2ChessNum+;return true; else if(Checkcross(x,y,-1)=10&&GameNowState=21)|(Checkcross(x,y,-1)=20&&GameNowState=11)/打子 /加入到棋盘 int mx=x,my=y; if(Location(&mx,&my) if(crossmxmy.tir=1) return false; crossmxmy.type=GameNowState; GameChessInfocrossmxmy.num.type=GameNowState

48、; LastCh=GameChessInfocrossmxmy.num;if(GameNowState=11&&Player2ChessNum>0) Player2ChessNum-;if(GameNowState=21&&Player1ChessNum>0) Player1ChessNum-; return true; return false; return false;/*函数名:Checkcross(int x,int y,int pow);*函数作用:检查棋盘状态*传入参数:坐标*棋盘状态:没棋子,石子没成三,石子成三,棍子成三,棍子没成三*返回值:0没棋,10石子没成三,11石子成三,20棍子没成三,21棍子成三*/int Manager:Checkcross(int x,int y,int pow)

温馨提示

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

评论

0/150

提交评论