《计算机科学系网络工程毕业论文.doc》由会员分享,可在线阅读,更多相关《计算机科学系网络工程毕业论文.doc(52页珍藏版)》请在三一办公上搜索。
1、 届 别 2012届 学 号 200814160237 毕业设计(论文)基于VC的成三棋游戏程序的设计与实现 姓 名 杨 剑 系 别、 专 业 计算机科学系网络工程 导 师 姓 名、职 称 曹 清 华 、讲师 完 成 时 间 2012-4-26 目 录摘要IAbstractII1 绪论11.1课题背景12 系统实现技术与开发环境22.1 C/C+简介22.2.1 GDI绘图32.2.2对话框42.2.3消息响应52.2.4游戏编程思想72.3 MFC编程思想82.3.1MFC中类的结构及联系92.3.2MFC中类的作用103 需求分析103.1游戏用户分析103.2游戏功能分析113.3游戏功
2、能模块主要功能113.3.1 登录模块:113.3.2 下棋模块:113.3.3 英雄排行榜模块:114 系统概要设计124.1模块结构设计124.1.1游戏登陆者管理模块124.1.2 游戏者下棋实现模块134.1.3数据流网络传输模块144.2英雄榜设计144.2.1英雄榜数据结构设计144.2.2逻辑结构设计154.3 游戏规则说明164.3.1 下棋阶段164.3.2 行棋阶段175 系统详细设计175.1游戏者登录管理模块175.1.1 游戏者登录友好界面的实现185.1.2 游戏帮助文档及基本规则的说明185.2 游戏者下棋模块的实现195.2.2行子阶段的实现305.2.3输赢判
3、断的实现335.2.4 英雄榜的数据更新345.3 网络模块的实现375.3.1 网络初始化375.3.2 网络的调用376 游戏测试446.1 登录的测试446.2 下棋的测试456.3走棋阶段的实现466.4 英雄榜的测试:48结束语49参考文献50致 谢511 绪论1.1课题背景游戏软件是当世界发展最迅速,最有影响力,最有潜力与活力的领域之一游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有大部分喜欢游戏的,因此游戏软件在很大程度上给予绝大部分人精神上的娱乐第二次世界大战以后,电子计算机技术得到了突飞猛进的发展先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子
4、子计算机一代一代实现更新,同时软件技术也发展迅速在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”“判断”能力反过来与人较量由于不断修改更新,使计算机的“智力”水平与人难分高低到了90年代,游戏软件已经为世界各国的人使用,BLACKISLAND和Blizzard.这两个强大的游戏制作组起到了巨大的带动作用,还有中国的洛河工作室在国内也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日
5、益丰富的生活需求得以满足。成三棋,规则较简单,易学易懂,也是一款传统的棋类游戏,她的历史也非常悠久,在公元前500多年就在我国出现了,是一种老少皆宜的棋类活动。特别是在农村,不会玩这个游戏的很少的,当然,随着人们的物质文化生活的不断丰富,现在下成三棋的人越来越少。她没有围棋、象棋这样繁复,与五子棋有些相似,但又有其自身独特的魅力,方寸之间,便能突显弈者的奇思妙想。 成三棋游戏,旨在为游戏爱好者提供一种新的娱乐途径,让大家在娱乐的同时锻炼思维,增长智慧,也将成三棋这一传统的棋类游戏利用网络进行推广发扬,使之广为流传。2 系统实现技术与开发环境2.1 C/C+简介C语言的特点: C语言是一种结构化
6、语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。 C+简介:在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C+。 C+进一步扩充和完善了C语言,成为一种面向 对象的
7、程序设计语言。C+目前流行的最新版本是Borland C+4.5,Symantec C+6.1,和Microsoft VisualC+ 2.0。C+提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。 C和C+关系C是C+的基础,C+语言和C语言在很多方面是兼容的。2.2 VC开发环境Microsoft Visual C+,(简称Visual C+、MSVC、VC+或VC)微软公司的C+开发工具,具有集成开发环境,可提供编辑C语言,C+以及C+/
8、CLI等编程语言。VC+整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C+ 2010。2.2.1 GDI绘图GDI(Graphics Device Interface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C+类封装,参见下表。表2-1Windows应用程序MFCWin32 API执行程序用户界面(User)GDI+图形子系统(GD
9、I)设备驱动程序内核(Kernel)图形驱动程序硬件抽象层(HAL)计算机硬件GDI与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,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序
10、的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。2.2.2对话框 对话框是一种次要窗口,包含按钮和各种选项,通过它们可以完成特定命令或任务。 查找和替换对话框 对话框与窗口有区别,它没有最大化按钮、没有最小化按钮、大都不能改变形状大小。(“打开文件”对话框是可以改变大小的) 对话框:是人机交流的一种方式,用户对对话框进行设置,计算机就会执行相应的命令。对话框中有单选框、复选框等。对话框可以分为模式对话框和无模式对话框两种类型。 CDialog 为了能够方便的操作对话框,MFC为用户提供了CDialog类。它是在屏幕上显示对话框的基
11、类,与对话框资源紧密相关,提供了管理对话框的接口,封装了一些对话框的相关操作。 从CDialog的定义代码可以看出,Cdialog提供了两套构建Cdialog对象的系统,分别用于模式对话框和无模式对话框。 无模式对话框对象的构建过程,它首先调用缺省的构造函数生成对话框对象,然后调用Create函数创建和初始化对话框。Cdialog类中的Create函数有两种函数原型: BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); BOOL Create( UINT nIDTemplate, CWnd* pParentWnd
12、= NULL );2.2.3消息响应 VC+的MFC类库实际上是Windows下 C+编程的一套最为流行的类库。MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效、灵活的使用MFC编程,了解MFC的体系结构往往可以 使编程工作事半功倍。它合理的封装了WIN32 API函数,并设计了一套方便的消息映射机制。由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击、鼠标移动等操作都只能由视类窗口捕获。一个MFC消息响应函数在程序中有三处相关信息:函数原型、函数实现和以及用来关联消息和消息响应函数的宏。(1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是
13、一个宏,该宏表明这个函数是一个消息响应函数的声明。(2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中有一ON_WM_LBUTTONDOWN()消息映射宏,这个宏的作用就是把鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数关联起来,通过这种机制,一旦有消息产生,程序就会调用相应的消息响应函数来进行处理。(3)消息响应函数的定义:在视图类的源文件中,可以看到OnLButtonDown函数的定义。头文件中在两个AFX_MSG注释宏之间是消息响应函数原型的声明。源文件中有两处:
14、一处是在两个AFX_MSG_MAP注释宏之间的消息映射宏,通过这个宏把消息与消息响应函数关联起来;另一处是源文件中的消息响应函数的实现代码。 在Win32应用程序中,当有消息产生时,操作系统会把这条消息放到应用程序的消息队列中,应用程序通过GetMessage函数从这个队列中取出一条具体的消息,并通过DispatchMessage 函数把消息交给操作系统,调用的是应用程序的窗口过程,即窗口过程函数WndProc进行处理,然而在MFC程序中,并不是按这种途径进行处理的, 只要定义了与消息有关的三处信息后,便可实现消息的响应处理.MFC中采用的这种消息处理机制称为MFC消息映射机制. MFC消息映
15、射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表.在消息映射表中,消息与对应的消息处理函数指针是成对出现的.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理此消息,则同样依照静态表能很容易找到并调用对应的消息处理函数. MFC消息映射机制的实际实现过程:MFC在后台维护了一个窗口句柄与对应的C+对象指针的对照表,以例中的CDrawView类为例,与CDrawView对象相关的有一个窗口,窗口当然有它的窗口
16、句柄,该句柄与CDrawView对象的一个指针(即CDrawView*)存在一一对应关系,在窗口句柄与C+对象对照表中就维护了这种对应关系.当收到某一个消息时,消息的第一个参数就指明了该消息与哪个窗口句柄相关,通过对照表,就可以找到与之相关的C+对象指针.然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc函数,该函数定义位于WinCore.cpp中.CWnd:WindowProc函数内部调用了一个OnWndMsg函数,真正的消息路由,也就是消息映射是由此函数完成的.OnWndMsg函数的处理过程:首先判断消息是否有消息响应函数.判断方法是在相应窗口类中查找所需
17、的消息响应函数.因为传递给WindowProc的是窗口子类指针,OnWndMsg会到相应的子类头文件中查找,看看DECLARE_MESSAGE_MAP()宏之上,两个AFX_MSG注释宏之间是否有相应的消息响应函数原型的声明;再到子类的源文件中看看,BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()两个宏之间是否有相应的消息映射宏.如果通过上述步骤,找到了消息响应函数,接着就调用该响应函数,对消息进行处理.如果在子类中没有找到,那么就交由基类进行处理.通过以上步骤,MFC就实现了具体的消息映射,从而完成对消息的响应2.2.4游戏编程思想游戏架构参考示意图 图 2-1 游
18、戏编程模块Launcher功能:Windows主函数,创建窗口,以及处理消息创建游戏,调用游戏的初始化、运行、销毁函数。建议:模板式的框架,准备好一个合适自己使用的,主要是对消息处理过程的编写,直接影响游戏之外窗口的响应情况。Game功能初始化游戏,创建Model、View和Timer运行游戏,通过Timer来控制刷新帧率,然后获取操作,调用Model执行游戏逻辑,然后使用调用View画出画面。销毁,将Model、View和Timer销毁。Model功能游戏逻辑,游戏需要执行的运算都放在这里,可以通过创建其它的类来完成。提供操作接口,运行游戏时根据用户操作来调用。存储游戏的绘制信息,View将
19、使用这些信息绘制画面。View功能绘制画面Timer功能定时器,给需要时间控制的类提供定时的功能。建议最主要的部分是Model,所有的游戏逻辑都在这里实现,设计到Model的应该只使用标准C+元素,方便移植。单人游戏和多人游戏,都应通过Model提供的接口来实现。View中,应该只使用Model提供的信息,绘制画面如果需要增加GUI,应该再单独创建类,然后加入到Game中。例如:俄罗斯方块添加Block类,实现各种方块。在Model中实现方块的下落与清除,提供出操作的接口。实现双人对战,创建两个Model就可以了。2.3MFC总述MFC是Win API与C+的结合,API,即微软提供的Wind
20、ows下应用程序的编程语言接口,是一种软件编程的规范,用于在C+环境下编写应用程序的一个框架和引擎,VC+是Windows下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC+血肉相连的部分同BC+集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC+专配的 2.3.1MFC中类的结构及联系 图2-2 应用层结构 图2-3 windows支持层结构图 2-4 继承自CObject2.3.2MFC中类的作用 CAboutDlg类是用来建立对话框的,与
21、对话框有关的问题都有这个类来处理。 CXXXApp类是自己建的类XXX代表自己的项目名称,是实现自己内容的主要类。 CXXXDoc类是用来处理文档的类。 CXXXView类是用来处理界面的类。CMainFrame类是主框架类。3 需求分析3.1游戏用户分析 游戏主体人群及其社会特点: 本游戏主要针对的是年龄在10至15岁的未成年人,这阶段年龄的孩子正处于好奇心特别重之时。对世界的认知也正处于高峰期,了解社会了解贫苦人群体验乡村生活对他们形成完整的世界观有莫大的促进作用。3.2游戏功能分析通过软件功能的分析,根据五子棋爱好者的需求,得出以下需求信息:1. 具有重新开始功能;2. 具有认输功能;3
22、. 具有提示该轮到哪一方下棋的功能;4. 退出游戏功能;5. 判断胜负功能;6. 悔棋功能。还有用户对游戏界面的要求,通过上述的用户需求,我们可以得出一个总体的设计方案。由上述的用户需要,可以对程序的基本功能进行一个有效的分析,规定下游戏的基本功能。3.3游戏功能模块主要功能3.3.1 登录模块:登录模块是解决登录及注册问题的模块,为用户建立个人信息方便用户与其他用户的联系。也有利于本游戏的推广。 3.3.2 下棋模块:主要实现下棋功能,分阶段的游戏不仅有利于管理,也有利于游戏者的发挥。 3.3.3 英雄排行榜模块:有利于用户了解对手,也为用户提升自己的能力寻找合适的对手提供了方便。4 系统概
23、要设计 4.1模块结构设计4.1.1游戏登陆者管理模块 1.注册或登录界面设计 1)昵称 2)确认 3)取消 2. 游戏界面设计 (a) (b)(c)图4-1 界面结构设计 图4-2 棋子石子、棍子4.1.2 游戏者下棋实现模块游戏开始轮流投子投子是否有效是否后手方已下第9子否u是是双方开始挪子恢复被打子的位置某方棋子数目小于3是否u棋局结束改变相关记录是否成三是否没有可打子是否是否u选择拿调对方非成三子 在该位置上贴上一张图片表示该位置不能投子改变相关记录否u换手点击的棋子是否有效该棋开始闪烁 准备下一步的落子位置移动是否合法消除原来显示新位置相关记录改变是否成三选择拿调对方 非成三子相关记
24、录改变是是否否是否换手 图4-3游戏流程图4.1.3数据流网络传输模块 图4-4网络数据流程图 游戏程序分两个部分,网络连接部分和各方自己的操作部分,网络连接部分结构如图。各方操作部分的模式为:接受到数据产生数据发送数据。4.2英雄榜设计 4.2.1英雄榜数据结构设计 游戏者及其基本信息是英雄榜的基础,在此基础上要对其进行数据排序选择出前三名。本游戏由于服务器未能实现故而采用本地数据存储法,存储到本地的硬盘中在开始时调用ReadScore()函数读写,而后由WriteScore()排序。4.2.2逻辑结构设计 图4-5 英雄榜逻辑设计结构4.3 游戏规则说明 4.3.1 下棋阶段 1 首先双方
25、在棋盘上轮流投子。 2 在投子期间,如果有某一方的某一行或一列或斜列,都为该方棋子(也就是成三)该方选择打子(打掉必须是对方的非成三子,如果对方的棋子都是成三子,便换手)。该打子位置被贴上一张大小与棋子一样大小的图片(表示该位置不能投子。在挪子部分的时候,该位置被撤销)。4.3.2 行棋阶段3 当后手方投下第九子,开始由先手方移动棋子,进入挪子部分,开始轮流挪子。 4 挪子期间的规则是:当需要点击想移动某一棋子时,该棋子便高亮。再点击它将去的位置时,原来的位置棋子消失新位置出现该方棋子。当点击某棋子使其高亮。该期间的打子规则与投子期间几乎一样,就是被打子位置不会被贴图,而会直接消失。5 当一方
26、棋子数少于3或该方走棋时发现无棋可移动(也就该方是没气),则该方为输了,棋局结束。5 系统详细设计5.1游戏者登录管理模块 5.1.1 游戏者登录友好界面的实现图5-1 登录对话框BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)/界面初始化函数if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;int UI_device_width=800,UI_device_height=600;/设置界面宽与高 cs.x=10;/界面在屏幕的左上角坐标 cs.y=10; cs.cx=UI_device_widt
27、h; cs.cy=UI_device_height;return TRUE;void CTIRView:OnDraw(CDC* pDC)CTIRDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herestatic i=0;if (i=0)TIRBGPEN.LoadBitmap(IDB_TIRBG);TIRBG.CreateCompatibleDC(pDC); TIRBG.SelectObject(TIRBGPEN);TIRPAUSEPEN.LoadBitmap(IDB_TIRP
28、AUSE);TIRPAUSE.CreateCompatibleDC(pDC); TIRPAUSE.SelectObject(TIRPAUSEPEN);TIRREMORSEPEN.LoadBitmap(IDB_TIRREMORSE);TIRREMORSE.CreateCompatibleDC(pDC); TIRREMORSE.SelectObject(TIRREMORSEPEN);TIRSTARTPEN.LoadBitmap(IDB_TIRSTART);TIRSTART.CreateCompatibleDC(pDC); TIRSTART.SelectObject(TIRSTARTPEN);i=1
29、; 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,&TIRPAUSE,0,0,SRCAND);pDC-BitBlt(580,330,680,430,&TIRREMORSE,0,0,SRCAND); DrawChessboard(pDC);/画成三 GameInit(pDC); /*函数名称:DrawChessboard(CDC* pDC)*函数介绍:绘制棋盘*输入参数:CDC指针*返回值:无*/v
30、oid CTIRView:DrawChessboard(CDC *pDC)/定义画笔CPen chessboard;chessboard.CreatePen(0,2,RGB(0,0,0);int k;/利用循环及对称性画棋盘pDC-SelectObject(&chessboard);/选择画笔for (k=0;kMoveTo(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);pD
31、C-MoveTo(90,70);/画线pDC-LineTo(210,190);pDC-MoveTo(330,310);pDC-LineTo(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(33
32、0,250);pDC-LineTo(450,250); /*画棋盘end*/5.1.2 游戏帮助文档及基本规则的说明 当用户单击工具条中帮助文档时调出帮助文档,暂时未能实现。5.2 游戏者下棋模块的实现图5-2 下棋阶段的图片ID5.2.1下子及打子阶段的实现 有持石头者先下,石头棍子轮流下子,一落子即刻判断成三情况JuTIR(),修改cross.tir。若为成三则为1,若没成三则为0。/*函数名:JuTIR(int x,int y,int type)*函数作用:判断并标记是否成三*函数实现:奇数列判断前后左右,偶数列判断前或者后左或者右*返回值:true or false*/bool Man
33、ager: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) cross(mx+3-1)%3my.tir=1;cro
34、ss(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.type=type) cross(mx+3-1)%3my.tir=1;cross(mx+3+1)
35、%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(),若没有棋子可打则弃权。其中石头打棍子用,同理棍子打石头用。/*函数名:JuHave(type);*函数作用:判断是否有棋可打*/bool Mana
36、ger:JuHave(int type)for(int i=0;i3;i+)for(int j=0;j8;j+) if(crossij.type=type&crossij.tir=0)return true;return false; 若某一方後悔走了某一步可以申请悔棋(两步内没有打子才有效否则即使对方同意也无效),点击右边第三图片响应GameBack(2)。/*函数名:GameBack(steps);*函数作用:悔棋*输入参数:悔棋步数*返回值:bool*/bool Manager:GameBack(int steps)if(nKeyDownsteps)return false;int mx
37、,my;nKeyDown-=steps;bool Judge=false;for(int k=nKeyDown;knKeyDown+steps;k+)/检查是否可以悔棋 mx=GameChessInfok.x; my=GameChessInfok.y;Location(&mx,&my);if(crossmxmy.type!=10&crossmxmy.type!=20)Judge=true;if(Judge=false) for(int k=nKeyDown;knKeyDown+steps;k+) mx=GameChessInfok.x; my=GameChessInfok.y;Location
38、(&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;/*函数名:JuTIR(int x,int y,int type)*函数作用:判断并标记是否成三*函数实现:奇数列判断前后左右,偶数列判断前或者后左或者右*返回值:true or false*/bool Manager: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;