四国军棋游戏毕业设计

上传人:枕*** 文档编号:134320491 上传时间:2022-08-12 格式:DOC 页数:29 大小:627KB
返回 下载 相关 举报
四国军棋游戏毕业设计_第1页
第1页 / 共29页
四国军棋游戏毕业设计_第2页
第2页 / 共29页
四国军棋游戏毕业设计_第3页
第3页 / 共29页
点击查看更多>>
资源描述
本科毕业设计说明书设计题目: 基于GDI+的局域网四国军棋游戏 专业年级: 2008级计算机科学与技术 学 号: 姓名: 指导教师、职称: 讲师 2012 年 5 月 15 日目录摘要IAbstractII1 引言- 1 -1.1 问题概述- 1 -1.1.1 问题的来源- 1 -1.1.2 目的和意义- 1 -1.1.3 国内外研究现状- 1 -1.2 问题剖析- 2 -1.2.1 主要问题- 2 -1.2.2 难点和关键- 2 -1.2.3 思路和方法- 2 -2 可行性分析和需求分析- 4 -2.1 可行性分析- 4 -2.1.1 技术可行性分析- 4 -2.1.2 经济可行性分析- 5 -2.1.3 操作可行性分析- 6 -2.1.4 时间可行性分析- 6 -2.1.5 结论- 6 -2.2 需求分析- 6 -3 总体设计- 7 -3.1 总体设计的框架- 7 -3.2 模块功能概述- 7 -3.3 关键算法- 8 -3.3.1 双缓冲技术绘图- 8 -3.3.2 工兵寻路- 8 -3.3.3 棋盘坐标转换- 9 -4 详细设计- 11 -4.1模块结构- 11 -4.2 模块详述- 11 -4.2.1 主模块- 11 -4.2.2 大厅界面模块- 12 -4.2.3 大厅处理模块- 13 -4.2.4 游戏界面模块- 14 -4.2.5 游戏处理模块- 15 -4.2.6 网络消息处理模块- 17 -5 系统调试与测试- 19 -5.1 遇到的主要问题- 19 -5.2 解决问题的方法- 19 -5.3 程序运行情况- 20 -6 结论- 21 -参考文献- 22 -致谢- 23 -摘要本文详细介绍了一个windows环境下的局域网四国军棋游戏的设计和实现。该游戏使用Socket编程实现在局域网中的通信;使用windows提供的GDI+图形设备接口实现界面。本游戏采用C/S结构设计,以其中一个玩家作为服务器,其他玩家作为客户机连接到服务器。游戏最终实现了局域网中创建游戏、加入游戏和协同游戏的功能,可以实现在局域网中联机对战的要求。关键词:四国军棋;联机对战;套接字;GDI+AbstractThis paper describes the design and implementation of a windows operating system LAN Siguojunqi game. The game uses the Socket Programming in LAN communication; use windows GDI + graphics device interface to achieve the interface. This game uses the C / S structure design, as a server on one of the players, other players connect to the server as a client. The game has finally realized the LAN create games, join the game and collaborative game, you can achieve the requirements of online gaming in the LAN.Key words: Siguojunqi game; Online gaming; Socket; GDI+1 引言1.1 问题概述1.1.1 问题的来源四国军棋游戏是一款非常好玩的游戏,它能够锤炼人的记忆、思维、判断和心理。随着互联网的普及,网上军棋更是成为男女老少都喜爱的一款休闲游戏。目前就有QQ四国军棋、联众四国军棋等。虽然很容易就能网上对战,但是对于处于校园网的我们来说,网络确实不好,经常出现掉线的问题,因此就想到做一个局域网使用的四国国军棋,以满足诸位棋友的需求。1.1.2 目的和意义对Socket网络编程和gdi+图形设备接口进行分析、探索和实践。通过gdi+编程,提供友好的用户操作界面,通过Socket编程,使用TCP和UDP协议,实现局域网内的数据传递,实现了多人协同游戏的目的。以此亦可了解C/S结构程序的基本实现方式。1.1.3 国内外研究现状C/S结构,即Client/Server (客户机/服务器) 结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销。客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。C/S结构如图1-1所示。局域网游戏也大多采用此结构进行设计,即以一台机子作为服务器,其他机子作为客户机,客户机连接到服务器,之后就可以在局域网中进行数据交换。图1-1 C/S结构1.2 问题剖析1.2.1 主要问题在开发局域网游戏时,首先要解决局域网中的通信。包含了如何在局域网中找到服务器?如何连接到服务器?如何进行数据交换?在解决以上问题的基础上,根据不同的游戏编写不同的游戏逻辑处理类,在该逻辑处理类中实现了对应的游戏逻辑,如实例中的军棋,则实现相互之间的对弈等功能。此外还需解决游戏界面的显示,如军棋中的棋子显示,按钮定位等。1.2.2 难点和关键1、局域网中有多个服务器时,如何查找并区分出来。2、客户端程序负责处理游戏的显示和操作界面,客户端具有简单的逻辑处理功能,同时负责接收发送与服务器端交互的数据包。3、服务器程序负责处理服务器端逻辑、游戏逻辑以及客户端之间的网络信息传递,同时服务器端还要承担客户端数据的接收、转发工作。1.2.3 思路和方法关于解决客户端如何在局域网中找到服务器,可以让服务器在局域网中发送广播,将自己的IP地址等信息发送出去,客户端就可通过接收广播消息,寻找到服务器的位置,同时还可根据IP地址将不同的服务器区分出来。以此可连接到不同的服务器,继而进行服务器与客户端之间的通信。游戏界面的显示可以通过使用gdi+图形设备接口,根据一个二维数组标识棋盘的状态,根据二维数组,使用gdi+画出棋子。2 可行性分析和需求分析2.1 可行性分析2.1.1 技术可行性分析本程序的开发基于C/S模式,包含客户机和服务器两部分,前者主要负责简单的逻辑处理和前台界面的显示,后者主要负责游戏逻辑判断及数据交互。网络通信可使用TCP/IP协议,采用Socket套接字编程技术;界面显示可使用GDI+图形设备接口画出界面。1、 TCP/IP协议TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是Internet中计算机进行通信的标准,其命名起源于该组协议中最重要的两个协议TCP和IP。任何关于Internet协议的讨论必须由TCP/IP开始,它也是其他所有协议的基础。TCP/IP协议是Internet网络的共同语言,主机之间必须利用TCP/IP互通信息。TCP/IP实际上就是在物理网上的一组完整的协议。其核心部分是传输层协议(TCP/UDP)、网络层(IP)和物理接口层,这三层通常在操作系统内核中实现。TCP/UDP层提供了传输层服务,而IP协议提供了网络层服务。TCP/IP协议是一个四层协议,其结构如图2-1所示。图2-1 TCP/IP协议体系结构图2、 Windows SOCKET编程Windows Socket (简称WinSock)是在Win32平台上访问基层网络协议的接口。在不同的Win32平台上,Windows Socket以不同的方式存在着,作为网络编程接口而不是协议存在。Windows Sockets编程的基本模式,要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。使用Socket进行网络通信一般有两种方式:基于面向连接的流方式和基于无连接的数据报方式。面向连接的的流方式调用过程如图2-2所示。图2-2 面向连接的流方式调用过程3、 GDI+图形设备接口GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C+类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的 继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中 GDI进行了优化,并添加了许多新的功能。 作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。从上述分析可以看出开发次程序,在技术上是可行的。2.1.2 经济可行性分析由于本程序所要求的硬件(计算机及相关硬件)和软件环境(vs2008),市场上都容易购买到或从相关网站下载,而据不完全调查统计本专业电脑拥有率是接近100%,系统成本主要集中在程序的开发与维护上,对编程者不会造成过重的经济负担。由于学校中校园网的存在,运行成本几乎可以忽略不计。而一旦本程序投入使用,可使同学们免受校园网与外网连接时网速过慢,经常掉线的问题。让我们可以尽情感受四国军棋的魅力。与微小的开发成本比较,能获得好的游戏体验,获得好的心情自然是值得的,所以从经济方面来说,开发此程序是可行的。2.1.3 操作可行性分析本程序实现了可视化界面,界面友好,操作简单,布局简洁。本程序游戏规则和拥有较高人气的QQ四国军棋相同,只要玩过QQ四国军棋的很容易就可以上手。在游戏操作上,只需轻点鼠标即可完成所有操作,对使用本程序的人员的计算机专业知识几乎没有要求,只需接触过计算机的人员,均能很快的熟悉本程序的操作。2.1.4 时间可行性分析本程序的设计与完成大概分为四个阶段:第一阶段,做需求分析,这个阶段大概花费1周时间,主要对系统要实现的功能进行分析判断,并决定实现每个基本功能所要采用的语言;第二阶段,掌握所需技术,这个阶段大概花费2周时间,主要对本程序所采用的语言进行一些初步的了解,并查阅相关资料,对相关的算法和函数有初步的了解、认识、掌握;第三个阶段,这个阶段是整个系统所费时间最长的阶段,大概需要4周时间,主要实现系统软件程序的编码、调试、测试,完成一个初级的版本;第四个阶段,修改完善程序,大概需要3周时间。因此从时间方面上讲开发此系统是可行的。2.1.5 结论经过对本程序实现的技术、经济、操作、时间的可行性进行分析。可得出结论:本系统是可以实现的。2.2 需求分析1) 作为一款局域网游戏,首先应该具备的基本功能就是能够在局域网间连接;要求能够实现,局域网中的机子能够创建游戏,即作为服务器,也能够加入游戏,即作为客户机连接到已创建游戏的服务器上。2) 四国军棋是一款多人协作游戏,因此应该要实现多人协同游戏的能力,即各客户机上能够进行数据同步。3) 为了方便,要求能够保存最近的一次游戏布局,要求游戏界面能够简洁些,游戏操作能够方便简单些。4) 想要有好的游戏体验,响应速度要求比较快,不会出现长时间等待现象,同时应具有良好的稳定性、可靠性和健壮性,可以控制一些不确定因素。 5)需实现四国军棋的游戏规则,本游戏将游戏规则定为和QQ四国军棋一样。3 总体设计3.1 总体设计的框架图3-1 总体框架图3.2 模块功能概述1、入口程序及全局变量:程序的入口函数WinMain,还有定义一些结构体和全局变量,主要功能是程序循环和结束条件的判断及保存一些全局使用的变量。2、创建窗口类:对windows创建窗口的API进行简单的封装,实现程序基本窗口的创建。3、网络通信类:对Socket发送UDP广播消息、接收UDP广播消息、发送TCP消息、接收TCP消息进行简单的封装;实现局域网中的数据交换。4、大厅窗口消息处理类:主要是大厅界面的实现,还有根据用户在大厅的不同操作启动相应的线程。5、游戏窗口消息处理类:主要是游戏界面的实现,还有根据用户的不同操作做出不同的响应。6、线程处理类:线程处理函数都集中在这里,可以根据不同功能,在启动线程时,调用不同的线程处理函数。7、游戏逻辑处理类:包含了棋子的定位,棋子能否启动的判断,棋子命中,选中与取消棋子的判断等相关功能的处理。8、服务端网络消息处理类:处理从客户端接收到的消息,主要功能是判断吃子逻辑,并根据不同的结果返回不同的消息。9、客户端网络消息处理类:处理从服务端接收到的消息,主要功能是根据吃子结果,对棋盘进行相应的处理。3.3 关键算法3.3.1 双缓冲技术绘图在图形图象处理编程过程中,当数据量很大时,绘图需要很长的时间,还会引起严重的闪烁现象。为了解决这个问题,我们可以采用双缓冲技术。它的基本原理是,在内存中创建一个与要绘制的屏幕一样大小的内存画布,先在此内存画布中绘出所有的图形,然后将此内存画布一次性拷贝到屏幕上,使用这个方法可以有效的解决屏幕闪烁的现象。下面是使用GDI+图形接口的实现步骤。1、首先是创建内存画布,Bitmap *CacheImage= new Bitmap( 1024, 708 ),大小应该与要绘制的屏幕区域大小相同;2、创建好内存画布后,就可以在上面绘图,如CacheGraphics-Clear(Color(0,0,0); /清楚画布CacheGraphics-DrawImage(bg, 0, 0, 1024, 708); /画到内存画布上3、将要绘制的图都画到内存画布上后,就可以将其拷贝到屏幕上了,Graphic.DrawImage( CacheImage, 0, 0 ); /画到屏幕上4、还要禁止windows的窗口背景重置消息WM_ERASEBKGND,只需在此消息处理时直接返回false就可以了。3.3.2 工兵寻路1、要判断工兵是否可以到达指定位置,就类似于迷宫寻路问题,可采用多种算法,如深度优先搜索算法、广度优先搜索算法等。我这里采用的是深度优先搜索算法,其基本算法是1)选取图中某一顶点Vi为出发点,访问并标记该顶点;2)以Vi为当前顶点,依次搜索Vi的每个邻接点Vj,若Vj未被访问过,则访问和标记邻接点Vj,若Vj已被访问过,则搜索Vi的下一个邻接点;3)以Vj为当前顶点,重复步骤2),直到图中和Vi有路径相通的顶点都被访问为止;4)若图中尚有顶点未被访问过(非连通的情况下),则可任取图中的一个未被访问的顶点作为出发点,重复上述过程,直至图中所有顶点都被访问。 2、判断是否可走是用一个1717的二维数组来标识,其中用1来表示在棋盘外,用0来表示非铁路,用2来表示铁路,二维数组定义如下int RailWayFlag1717= 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 1, 2, 1, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2, 1, 2, 1, 2, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,;结合上面两点,使用递归方法,写出代码如下bool Game:GongbingMove( CHESSPOS from, CHESSPOS to, int way17 )if( from = to) /如果找到,返回真return true;if(wayfrom.ifrom.j != 2) /如果不是铁路,返回假return false;wayfrom.ifrom.j = 3; /设置为已找过/继续向上下左右搜索return GongbingMove(CHESSPOS(from.i+1,from.j), to, way) | GongbingMove(CHESSPOS(from.i,from.j+1), to, way)| GongbingMove(CHESSPOS(from.i-1,from.j), to, way) | GongbingMove(CHESSPOS(from.i,from.j-1), to, way);/向上搜索if(GongbingMove(CHESSPOS(from.i+1,from.j), to, RailWayFlag) return true;if(GongbingMove(CHESSPOS(from.i,from.j+1), to, RailWayFlag)/向右return true;if(GongbingMove(CHESSPOS(from.i-1,from.j), to, RailWayFlag)/向下return true;if(GongbingMove(CHESSPOS(from.i,from.j-1), to, RailWayFlag)/向左return true;return false;3.3.3 棋盘坐标转换如图3-2所示,四国军棋上共有四个座位可以坐下。因为自己的棋始终是显示在下方的,所以实际上各个座位上相同棋盘坐标表示的并不是同一个棋子,如座位1的棋盘坐标(10,10)上的棋子,在座位2上的相同棋子坐标应该是(6,10)。这就需要根据玩家所在的不同座位,对棋盘坐标进行一定的转换。在本程序中实现坐标转换的方法是根据当前座位和接收到的座位分多次旋转90度。旋转次数的计算方法是,将座位1、座位2、座位3、座位4分别设置一个座位标记,分别为1、2、3、4。将接收到的座位标记减去当前座位标记,如果得到的值大于0,即是旋转次数,如果得到的值小于0,则将此值加上4,即可得到旋转次数。例如座位2上的坐标要转换为座位4上的坐标,需旋转4减2,即2次;座位4上的坐标要转换成座位2上的坐标,需旋转2减4加4,即也是2次。图3-2 桌子位置示意图4 详细设计4.1模块结构1、主模块,包含WinMain函数、CCreateWindow类。2、网络消息处理模块,包含Socket类、Logic类、ServerNetMsg、ClientNetMsg。3、大厅界面模块,包含HallMsgProcessing类。4、大厅处理模块,包含HallMsgProcessing类、Threads类。5、游戏界面模块,包含GameMsgProcessing类。6、游戏处理模块,包含GameMsgProcessing类、Game类。4.2 模块详述4.2.1 主模块WinMain是windows窗口程序的入口函数,即windows窗口程序是从这里开始执行的。它的一般作用是注册并创建窗口,循环获取消息并发送到消息处理函数中,还有决定程序的结束条件。CCreateWindow类中提供了创建和销毁窗口的接口;也对基本窗口参数的设置进行了封装,有设置获取窗口的长和宽,设置和获取窗口的属性和扩展属性;重载了()运算符,用来获取窗口句柄,也有接口用来获取整个程序实例的句柄;还对外提供了是整个窗口客户区失效的接口。程序刚开始的时候,先判断是否已有实例运行,如果有的话就结束程序,否则就注册窗口类,然后进入一个循环,以一个变量标识程序是否继续执行,若变量为假,则结束程序,若为真,根据当前所处位置创建大厅窗口或游戏窗口并处理窗口消息。如图4-1所示图4-1 主模块流程图4.2.2 大厅界面模块大厅桌子是根据一个map来画的,这个map中保存了当前的局域网中的服务器ip等信息,据此可以画出桌子。程序先判断map是否为空,不为空时则画出桌子,并指向map的下一个记录。如图4-2所示图4-2 大厅界面模块流程图4.2.3 大厅处理模块在大厅窗口创建时,我们启动一个用来接收广播消息的线程,用来确定网络上的主机数量和位置。因为在程序中是将按钮的位置固定死的,所以很容易就可以计算出按钮和座位所在的坐标,根据鼠标点击窗口中的坐标,可以得出是否命中按钮或座位。在命中创建按钮时,要做的工作是结束接收广播消息线程,自己创建游戏后就不需再接收局域网中的广播消息了;启动发送广播消息线程,我们应该告诉局域网中的用户我们创建了游戏;启动服务线程,用来接收客户机的连接;这里我们把服务线程独立了出来,所以本机即是服务器又是客户机,所以本机还要作为客户机连接到服务线程;启动客户机接收线程,用来接收服务器线程发送的消息;当然最后还需关闭大厅窗口并启动游戏窗口。在命中座位位置时,这时我们只作为客户机连接到服务器,所以不需要向局域网广播消息,也不需要启动服务线程。当同样的,我们不需在接收局域网中的广播消息了,所以还是需要关闭接收广播消息的线程。接下来我们要根据命中的座位位置找出应该连接哪个服务器,找到之后就可以连接上服务器。当然,还有必不可少的事情要做,那就是启动客户机接收线程、关闭大厅窗口和启动游戏窗口。如图4-3所示图4-3 大厅处理模块流程图4.2.4 游戏界面模块在此模块中,按钮和棋盘是使用固定位置的,很简单,就不再详述了。主要是棋子的画法比较复杂,我使用的方法是用一个1717的二维数组标识,用数字40至32,分别表示司令至工兵,41表示地雷,31表示炸弹,30表示军棋。根据这个二维数组就可以知道哪个棋子在棋盘的哪个位置。知道了棋子在棋盘的位置后,确定棋子在窗口中的位置,因为棋盘的位置是固定的,所以我们可以得到棋盘上、下、左、右和中间部分第一个位置在窗口中的坐标。各部分中的上下左右间隔是差不多的,所以亦可据此得到其他棋盘位置在窗口中的坐标。画棋子的流程是先找到棋子在棋盘中的位置,判断属于棋盘的哪一部分,将其转换为相应部分的相对位置,根据该部分首位置的窗口坐标,计算出棋子在窗口中的坐标,对棋子图片进行相应的翻转,最后画出棋子。如图4-4所示图4-4 游戏界面模块流程图4.2.5 游戏处理模块在游戏界面模块的介绍中,我们知道棋子在窗口中坐标的计算方法,据此我们就可以完成棋子命中功能。首先获取到鼠标点击的窗口坐标,根据窗口坐标判断出点击位置是棋盘的上、下、左、右或者中间部分;找到在棋盘哪一部分后,将坐标与找到部分上棋子的坐标进行比较,如果符合,则命中,否则未命中。棋子命中问题解决后还需解决棋子选中问题,方法是用一个变量保存选中的棋子,当鼠标点击时,判断是否命中棋子,若没有则将变量清除,若有则判断命中的是不是自己的棋子,如果不是则将变量清除,如果有则判断是否命中已选中的棋子,如果是则将变量清除,如果不是则将命中的棋子保存到选中变量中。如图4-5所示图4-5 棋子选中流程图还需解决棋子移动问题,移动的前提是已经选中棋子并且下一次鼠标点击事件命中新的棋子。如何判断能否移动到呢?首先判断选中的位置是在铁路、公路还是行营上;若在公路,只需搜索其上下左右位置;若在行营,只需搜索其周围八个位置即可;若在铁路上,再判断要到达的位置是在铁路、公路、行营还是大本营上;若是公路或大本营,只需搜索选中棋子的上下左右位置;若是行营,只需搜索选中棋子周围八个位置即可;若在铁路上则按选中棋子是不是工兵分成两种情况,如果是工兵,则用第三章关键算法中的工兵寻路方法判断是否可以移动到,否则就根据就搜索可到达的铁路位置。如图4-6所示图4-6 棋子能否移动流程图4.2.6 网络消息处理模块此模块就是处理服务器与客户机之间的通信,服务器线程收到客户机的连接请求后,创建一个对应的服务器接收线程,用来接收客户机发送过来的消息;接收到客户机的消息后,进行相应的处理后,将结果返回给客户机。在这里主要说说主要游戏逻辑在服务器的实现。客户机在游戏处理模块中判断出选中的棋子能否移动到命中的位置后,将选中棋子位置和命中的位置发送的服务器。服务器就根据保存在服务器的各棋子大小进行判断。首先将接收到得客户机的位置,转换成服务器的位置;如果要到达的位置不是盟友的话才继续;接下来如果要到达的位置上没有棋子,则直接移动到目标位置,并返回消息通知所有客户机;如果目标位置上有棋子,判断目标位置上棋子的值,如果目标位置上的棋子为炸弹或者选中棋子为炸弹或者目标位置棋子和选中棋子相同,则两个棋子同掉,如果目标位置上的棋子小于选中位置上的棋子,则选中棋子吃掉目标棋子,如果目标位置上的棋子大于选中位置上的棋子,则选中棋子死掉;如果同掉或死掉的棋子是司令的话,则相应玩家的军旗翻出,如果是军旗的话,则相应玩家判为灭亡。如果所有同盟都灭亡,那么胜负已分,就可判断出赢家与输家。当然,所有比较结果都要通知所有客户机。如图4-7所示图4-7 棋子比较逻辑流程图5 系统调试与测试5.1 遇到的主要问题1、消息发送时经常收不到;2、线程一直阻塞着,结束程序后线程还是存在;3、服务器关闭后,客户机还是保存着这个不存在的服务器;5.2 解决问题的方法1、关于消息收不到这个问题,我猜测可能是因为两次消息发送的间隔太短,所以才会出现没有发送出去的情况。解决方法是在每次发送消息前Sleep一下。果然,这样子问题就解决了。2、线程一直阻塞,可以确定是因为recv和send两个函数都是阻塞函数,导致了线程被阻塞。这里用的解决方法是使用select模型。Select模型可以判断Socket是否可读写,如果可读写的话,再用recv或send去读写消息,这样从理论上来讲,recv和send因有数据可读写,是不会阻塞住的,这样问题就解决了。3、服务器关闭后,客户机还是保存着这个不存在的服务器,这个问题刚开始想了很久,不知道怎么解决,最后发现原来是那么简单,只要在服务器关闭的时候发送一条广播消息,告诉所有客户机,此服务器已关闭,客户机再将其从map中删除就可以。5.3 程序运行情况1) 大厅界面,如图5-1图5-1 大厅界面2) 游戏界面,如图5-2图5-2 游戏界面6 结论实现了一个局域网内使用的四国军棋游戏,能够创建游戏、加入游戏和协同游戏,即实现了局域网内联机对战的功能。采用了Socket编程技术和使用了GDI+图形设备接口。应用了双缓冲技术,有效解决了屏幕闪烁的问题。应用矩阵变换的技术实现了不同方位的坐标转换。将游戏的仲裁权交给了服务器,由服务器比较棋子大小,一定程度上防止了作弊。由于知识面以及时间上的原因,程序还是有些不足。比如没有在大厅桌子的显示中区分出不同的服务器,还有没有游戏没有对玩家的操作时间做出限制。这个我打算在接下来的时间里,学习相关只是,继续将程序完善。还有模块间的独立性还有待改进。总的来说,程序基本实现了主要功能。参考文献1 2 2010-6-5. 4-5、12-133 Bu. Windows Socket编程Z. 2009-01-11: 1-144 5 Charles Petzold.Programming Windows 程式开发设计指南M.余孟学.网络译文未出版,2000: 36-406 Z7. Udp广播消息Z.2010-10-22:1-487 http:/it.china- 育龙网.基于TCP协议的socket编程实例Z. 2010-01-30:23-898 ,百度百科.双缓冲技术绘图Z.2010-08-27:3-139 宁正元.数据结构与算法M.北京:清华出版社,2009:139-14210 11 马石安,魏文平.面向对象程序设计教程M.北京:清华出版社,2008:141-14412 CharlesPetzold.Windows程序设计M.方敏.北京:清华出版社,2010:65-6613 2007-12-31:1-10714 塘之恋.VC中创建线程的方法Z. 2008-11-05:1-2615 胡鸣.Windows网络编程技术M.北京:科学出版社,2008:122-131致谢在此,需要特别感谢指导老师、答辩老师对程序出现的问题、不足以及如何改进提出了宝贵的意见。同时也要感谢新博网络的诸位同事给予的帮助。要是没有诸位的建议和帮助,我定会遇到更多的困难。在此再次表示感谢。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!