毕业设计(论文)网络聊天与五子棋的设计与实现

上传人:1777****777 文档编号:37397819 上传时间:2021-11-03 格式:DOC 页数:43 大小:1.90MB
收藏 版权申诉 举报 下载
毕业设计(论文)网络聊天与五子棋的设计与实现_第1页
第1页 / 共43页
毕业设计(论文)网络聊天与五子棋的设计与实现_第2页
第2页 / 共43页
毕业设计(论文)网络聊天与五子棋的设计与实现_第3页
第3页 / 共43页
资源描述:

《毕业设计(论文)网络聊天与五子棋的设计与实现》由会员分享,可在线阅读,更多相关《毕业设计(论文)网络聊天与五子棋的设计与实现(43页珍藏版)》请在装配图网上搜索。

1、分类号:TP311.1 U D C:D10621-408-(2008) 2478-0密 级:公 开 编 号:2004032成都信息工程学院学位论文网络聊天与五子棋的设计与实现论文作者姓名:申请学位专业:网络工程申请学位类别:工学学士指导教师姓名(职称):(副教授)论文提交日期:2007年05月24日网络聊天与五子棋的设计与实现摘 要20世纪末,随着计算机科学的发展,网络应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。个性化已逐渐成为当今网络应用的潮流。本论文提出一个集聊天和五子棋游戏于一体的网络应用系统的解决方案,并对其具体应用中的实现模块进行剖析。首先,此系统包括聊天和游戏两个模

2、块,聊天模块具有用户注册、加载好友、添加和删除好友、发送消息、接收消息、多人聊天等功能。游戏模块具有悔棋、战绩显示、人机对弈、人人对弈、聊天等功能。其次,此系统利用java语言进行开发的。系统使用Socket来完成服务端和客户端之间的通信,使用多线程技术支持多用户操作,使用SQL 2000对数据进行永久性存储。最后,此系统服务端通过定期的将数据库的数据存储到内存中的方式解决数据库并发访问的瓶颈问题。关键词:网络聊天;棋盘分割算法 ;设计模式;五子棋;Design and Realization of Gobang and network chatAbstractAt the end of 20

3、th century, with the development of computer science, Internet applications technology is widely used. This makes network users can enjoy more convenient and individual services. Personalization is the trend of todays Internet applications.This thesis proposes a solution of internet application syst

4、em that it sets chat、 gobang development in a body , and has dissected its realization module while employing specifically. Firstly, this system includes two modules of chat and game The chat module can possess functions like users registration,loading good friends,adding and deleting the good frien

5、ds,and sending and receiving message,chating with many people ,and so on. The game module can possess function like retracting a false move、showing the record of victory,man-machine match,man-man match,chating, and so on. Secondly, this system is developed by java language. This system uses Socket t

6、o finish communication between the server and the client, it uses multi-threading technology to support for multi-client, uses SQL 2000 to store permanent data. Finally, the systems server solves the problem of the bottleneck of database through regularly updated information into memory from the dat

7、abase.Key words:Network chat; Algorithm of partitioning chessboard;Design Patterns ;Gobang; 目 录论文总页数:38页1 引言11.1 设计背景11.2 设计意义11.3 设计方法11.4 本论文的目的及工作内容22 系统需求分析22.1业务用例分析22.2用例图42.2.1基本用例42.2.2游戏子用例42.2.3聊天子用例52.3用例简要说明52.4基本用例描述52.5扩展用例描述82.6后续用例描述93 系统分析报告93.1 系统类图93.1.1用户界面类103.1.2业务处理类103.1.3数据访

8、问类103.1.4权限管理类103.1.5异常处理类113.2 类的职责说明113.4类的静态结构123.5用例动态分析123.6用户界面原形134 系统设计报告164.1主要类详细设计图164.1.1 游戏模块类设计164.1.2 聊天模块类设计164.2游戏类的职责说明174.3聊天类的职责说明184.4 主要活动图:204.4.1游戏客户端与服务端活动图:204.4.2聊天服务端与客户端活动图214.5 主要状态图224.5.1 用户聊天状态图:224.5.2 用户游戏状态图234.6 服务端与客户端整体设计思想234.7 数据包设计235系统算法的详细分析报告255.1 数据库并发访问

9、瓶颈问题解决方案255.2棋盘分割算法的详细分析255.3 人机对弈的算法分析305.4 数据库表效率问题的解决方案325.5 防止灌水性注册的解决方案335.6 整体提升性能的解决方案335.7 用户下载好友和黑名单列表信息的实现说明335.8多人并发聊天的实现方式335.9 多用户并发下棋的实现方式345.10 用户移动好友,删除好友,增加好友的实现说明345.11 棋盘结构的构造说明345.12 游戏积分处理的实现说明345.13 悔棋功能的实现方式355.14音乐播放器的实现说明35第6章系统测试与性能分析356.1系统测试方案356.2系统测试环境和测试条件356.3 系统性能分析3

10、5结论36参考文献36致谢37声明381 引言1.1 设计背景 在互联网飞速发展及个人计算机普及的当今社会,各个领域都在充分利用着计算机资源。为了让处于不同地方的人能通过计算机进行实时通信和休闲愉悦,人们开发出基于互联网的网络游戏和聊天工具。滕讯的QQ就是行业中很好的聊天工具,但同时也是病毒的传播工具。许多软件开发公司,他们需要一个自己公司内部独立的通信工具进行通信和交流经验。现在的通信工具中只有滕讯QQ,MSN等几个通信工具。随着分布式系统领域的热化,分布式处理技术也成为处理异步程序的主要技术。故以此作为研究对象来对通信原理进行研究并对分布式处理技术及socket通信技术作比较。计算机硬件的

11、降低,使得计算机进入所有家庭。休闲愉悦更是计算机提供给人们一个休闲的渠道。网络游戏使得人们能感受到现实社会中感受不到的异度空间。1.2 设计意义现在只有几个通信工具,而且是面向大众的。虽然功能很强大,但是不适合作为企业内部交流信息的通信工具,而且成为网络病毒传播的一种工具。作为企业内部的通信工具应该具有操作简单,实时响应等特点。许多大型的网络游戏并不适合所有的计算机用户,并且大型的网络游戏需要安装。给那些只希望休闲愉悦的人带来很大的麻烦,所以通过浏览器和非安装程序作为游戏的客户端能很好的满足所有的计算机用户。网络中的五子棋游戏需要双人对弈,对于那些单用户或者练习技术的人来说需要找到一个人来和他

12、对弈。而对于那些人机对弈的五子棋程序又不能很好的满足人牛刀小试的愿望。所以通过此次毕业设计来开发一个实时通信和网络五子棋游戏结合一体的程序。通过此应用设计来学习和掌握游戏的开发过程和算法实现。1.3 设计方法根据通信原理结合JAVA的相关技术编写java版本的网络聊天程序。并用java语言来编写网络五子棋游戏。聊天程序采用C/S模式,游戏程序采用C/S和B/S模式。用SQL2000数据库来存储永久性的数据。游戏帐户注册的网页页面采用ASP语言进行设计。为防止用户的灌水性注册程序中采用验证码机制进行注册。服务器端程序采用Singleton模式并基于时间的回调定期的刷新数据库中的数据到内存中,通过

13、此方式解决数据库并发访问的瓶颈问题并加速业务响应速度。在数据库设计中根据表分割原理将频繁使用的数据放到一张表中,不经常用到的表放到另一张表中。游戏采用棋盘分割的算法进行输赢判断。1.4 本论文的目的及工作内容本论文主要详细介绍程序的构架和各功能的实现方式及程序中的主要算法。主要包括如下:(1)程序的构架设计;(2)服务端程序的设计;(3)客户端的程序设计;(4)客户端和服务端的通信机制;(5)程序中的多线程设计和实现;(6)数据库并发访问瓶颈的解决方案;(7)提升数据库性能的解决方案;(8)用户注册功能的实现方式; (9)用户下载好友信息的实现方式;(10)用户删除好友,添加好友,转变好友类型

14、的实现方式;(11)多人并发聊天的实现逻辑;(12)音乐播放器的实现说明;(13)处理多用户聊天消息的逻辑;(14)用户下载游戏数据的逻辑;(15)游戏规则维护的逻辑; (16)游戏积分处理逻辑;(17)处理多用户同时游戏的逻辑(18)人机对弈的算法; (19)输赢判断的算法;2 系统需求分析2.1业务用例分析系统应该具有如下功能:(1)注册帐户用户进入游戏前,界面中提供注册的标志。注册时采用验证码的机制防止恶意用户的灌水注册。(2)用户登录用户通过帐户登录后方可进入游戏。(3)游戏采用积分制度游戏的胜负都有一定的分值。系统根据用户的胜负状态给用户加载相应的分值,且此分值是累积的。用户通过自己

15、的合法帐户进入游戏后系统取得该帐户的所有信息包括注册信息,及历史游戏的积分。(4)用户可以自主选择桌面在游戏中用户可以自主地选择进入某个桌面,而不是固定进入一个桌面。游戏提供多个游戏桌面,提供给众多用户选择。游戏能容纳一定数量人同时游戏。服务器不会有负担,并且服务器能准确地定位和转发每个游戏对弈双方的数据包。(5)用户可以自主选择对弈者系统给用户一定的自由度能让用户自主的选择对弈方,并可在未开始对弈的时候随意变换座位。进入游戏后则不提供任意跳出游戏而与其它人进行对弈。在此种情况下只有对弈方同意离开方可退出游戏进入游戏主界面。恢复自由选择对弈方的功能。(6)对弈中可以进行聊天对弈双方可以在对弈的

16、同时进行聊天。消息栏中保留聊天的记录。且消息的发送和接收同步运行。有常用短语选择栏,用户可以通过选择它当中的短语进行快速聊天。(7)自动判断输赢程序能自动判断对弈双方的输赢并结束此次游戏,计算出对弈双方的游戏得分,并把详细信息显示给用户,最后更新到数据库中。(8)对弈中用户可以请求对方结束此次对弈用户在对弈的时候可以通过向对方申请退出游戏的渠道退出游戏。只有在对方同意退出请求时双方才可以退出游戏。如果强制退出应该给与处罚,处罚的方式是给强制退出者扣除一定的游戏积分。(9)游戏中具有悔棋功能游戏提供悔棋申请的功能,只有在对弈方同意对方悔棋的时候,方可悔棋。(10)服务器具有记录用户的登陆信息的功

17、能服务器记录每个用户登录的信息以及ip地址,目的为了监控服务器的工作状态和客户端之间的通信是否异常。(11)悔棋采用扣分机制悔棋申请需要有一定的代价,要扣除积分的。在游戏结束的时候进行统计。积分分等级,获胜有固定的分值,和棋没有分值但在有悔棋时同时统计。强制退出有固定的惩罚分数。(12)提供人机对弈的功能,并提供人机对弈和人人对弈转换的功能。(13)聊天程序采用登录验证的机制,具有增加好友,删除好友,改变好友类型等功能。(14)用户具有修改密码和找回密码的功能修改密码和查找密码都需要在密码提示问题正确的情况下方可查询。(15)用户能任意和好友进行独立聊天且不会发生数据混乱(16)用户能在聊天程

18、序中进入游戏并取得相应的游戏数据。(17)具有播放音乐的功能。2.2用例图2.2.1基本用例图1 用户基本业务用例图2.2.2游戏子用例图2 游戏子用例图2.2.3聊天子用例图3 聊天子用例图2.3用例简要说明A1: 用户注册帐号。A2: 用户登录聊天程序。A3: 用户登录游戏程序。A4: 用户查找密码。A5: 用户退出游戏。A7: 用户开始聊天。A6: 用户进入游戏。A8: 用户打开音乐播放器播放音乐。2.4基本用例描述A1(基本)前置条件:用户打开游戏客户端或者登录了游戏网站的主页选择了注册功能。后置条件:用户注册成功或者注册失败并显示注册失败的原因。主要流程:A-1用户登录了客户端或真接

19、登录了游戏网站主页。A-2用户选择了注册。A-3用户输入注册信息。A-4点击注册按钮。A-5显示注册结果。异常路径:B-1如果A-3中用户输入了不合法的消息,则显示相应的提示消息。B-2如果A-3中用户输入了已经存在的用户,则显示用户已经存在此帐户名,要求注册用户重新填写帐户名的提示消息。B-3如果A-4中用户没有输入完整的注册信息。则显示相应的提示消息。并定位到没有输入的地方。B-4如果A-4中用户点击注册后服务器因不知名的故障或者服务器忙碌,则显示相应的请求失败的提示信息。活动图:图4 注册用户活动图A2:(基本)前置条件:用户打开了聊天的应用程序,并输入了合法的用户帐户。后置条件:下载好

20、友列表进入聊天主界面。主要流程:A-1: 打开应用程序。A-2: 输入合法的登录帐户。A-3: 登录A-4: 进入聊天。异常路径:B-1: 如果A-2中没有输入信息则显示用户的帮助消息。B-2: 如果A-3服务器繁忙的时候或者网络带宽受限时应该显示用户正在进登录中的提示消息。或网络终端,则提示登录失败的信息。B-3: 如果A-4中服务端异常,则显示相应的提示信息。活程图:图5 登陆聊天程序活动图A3: (基本)前置条件:打开客户端程序。后置条件:登录成功或者显示登陆失败的原因。主要流程:A-1: 输入用户帐户。A-2: 输入用户密码。A-3: 输入用户验证码。A-4: 登陆。异常路径:B-1:

21、 输入了不是有效的帐户,则进行相应的提示。B-2: 输入了空密码则自动清空并作相应的提示。B-3: 如果服务器关闭或者什么原因使登录不能进行则显示相应提示消息。活程图:图6 游戏登陆活动图A4: (基本)前置条件:输入要查询的帐户名,和有效的密码提示问题以及新密码。后置条件:修改成新密码。主要流程:A-1: 输入用户的帐户名。A-2: 输入密码提示问题。A-3: 输入密码提示问题的答案。A-4: 修改密码成功。异常路径:B-1: 在A-1中输入错误的帐户名或者在A-2中输入错误的密码提示问题或者在A-3中输入错误的密码提示答案则显示不能修改密码的出错消息。A5: (基本)前置条件:用户没有进行

22、游戏且处在游戏桌场选择的界面中。后置条件:用户退出游戏客户端与服务器断开连接。主要流程:A-1: 用户选择退出按钮。A-2: 判断用户是否具有正常退出的条件。A-3: 退出游戏客户端并失去与服务器的连接。异常路径:B-1: 本来就与服务器失去了连接。选择退出后则服务器不能监控到客户端,扫尾工作部不能正常进行,客户端显示出错信息。2.5扩展用例描述A6:(扩展)前置条件:登录了聊天应用程序或者已经进入了游戏客户端。后置条件:用户登录到游戏中。主要流程:A-1: 用户选择登录按钮。A-2: 判断用户帐户是否是有效帐户。A-3: 进入游戏中。异常路径:B-1:如果在A-1中游戏服务器关闭或者出现异常

23、,显示出错信息。B-2:如果在A-2中输入不是有效的帐户,显示相应的信息。A7:(扩展)前置条件:选择了某个好友。 后置条件:进入聊天中。主要流程:A-1: 用户选择自己好友列表中任意一个好友。A-2: 进入好友聊天界面中。A-3: 开始聊天。异常路径:B-1: 如果在A-1中服务端与客户端断开连接,或者服务器异常等。显示出错信息。B-2: 如果在A-2中选择的好友不在线提示出错信息。B-3: 如果在A-3中选择了黑名单中的用户聊天则显示不能与黑名单中用户进行聊天的相关信息。2.6后续用例描述A8:(后续)前置条件:聊天程序启动。后置条件:打开音乐播放器。主要流程:A-1: 用户选择音乐播放器

24、按钮。A-2: 打开音乐播放器。A-3: 选择音乐A-4: 播放音乐(3)选择播放音乐进行播放。异常路径:B-1: 如果在A-2中程序异常,显示出错信息。B-2: 如果在A-3中不存在歌曲,显示相应的提示信息。B-3: 如果在A-4中歌曲类型不支持,显示相应的提示信息。3 系统分析报告3.1 系统类图系统中基本分为三层结构。用户层,业务层,数据访问层。所有的客户端程序均不具有操作数据访问层的功能。而是交给服务端进行数据的操作。根据各层的功能逻辑抽象出以下几个类:3.1.1用户界面类图7 用户界面包类图3.1.2业务处理类图8 用户业务包类图3.1.3数据访问类图9 数据访问包类图3.1.4权限

25、管理类图10 权限管理包类图3.1.5异常处理类图11 异常处理包类图3.2 类的职责说明1用户界面类的说明(1) 与用户交互,接受用户的各种输入并输出各种提示信息和处理结果,进行界面数据的重新组织。(2) 对输入数据进行校验,过滤非法数据。(3) 向业务层发送业务请求。(4) 根据业务层返回的结果进行界面数据的更新。2 数据访问类职责说明(1) 实现对数据的查询和持久化操作。(2) 保持数据的唯一性。3 业务处代理类职责说明(1) 实现各种业务处理逻辑和算法。(2) 对用户的输入数据进行合法验证。(3) 向数据访问层请求数据或向数据访问层发送数据进行永久性存储。(4) 向用户界面层发送处理后

26、的结果。(5) 对游戏规则的维护,游戏对战的棋步的记录,对游戏通信数据的封装与拆分,对游戏界面的数据更新,和游戏中聊天数据的转发。协调服务器端进行有序不间断工作。对业务层中的数据更新和逻辑上的整理。对数据积分规则进行判断并对数据进行计算,同步到数据访问类中,实现数据的永远存储。4 异常处理类职责说明处理系统中出现的各种异常5 权限管理类职责说明验证请求者的请求权限3.4类的静态结构图12 类的静态结构图3.5用例动态分析图13 用例动态分析图流程说明(1) 用户界面对象接收到用户的输入请求后,向业务代理类发送处理请求。(2) 业务代理类对象接收的请求后,向权限管理类对象发送验证权限请求。(3)

27、 权限管理类对象验证权限后,将验证结果返回各业务代理类对象。(4) 业务代理类根据收到的权限验证结果进行以下处理:对于不符合权限的请求则向用户界面类返回相应的提示信息,对于符合权限的请求,业务代理类对象转发信息给业务对象。(5) 业务对象进行业务处理。对于业务处理中的数据持久化操作,通过数据库访问对象进行操作。期间的任何异常都交给异常处理类对象处理。最后处理结果信息给业务代理对象。(6) 业务代理对象收到信息后作进一步加工,最后返回给用具界面对象(7) 用户界面对象根据收到的信息重新组织数据并更新相应的界面。3.6用户界面原形(1) 登录界面:图14 登录界面图(2) 聊天程序主界面:图15

28、聊天界面图(3) 聊天窗口界面:图16 聊天窗口(4) 游戏大厅界面:图17 游戏界面图(5) 游戏对战界面:图18 游戏对弈界面(6) 音乐播放器界面:图19音乐播放器界面4 系统设计报告4.1主要类详细设计图4.1.1 游戏模块类设计(1)客户端类设计:图20 游戏模块客户端主要类的类图(2) 服务端类设计图21 游戏模块服务端主要类的类图4.1.2聊天模块类设计(1)客户端类设计图22 聊天模块客户端主要类的类图(2) 服务端类设计图 23 模块服务端主要类的类图4.2游戏类的职责说明1 GameMainFrame说明GameMainFrame相当于系统分析中的用户界面类,此类包含了所有

29、与业务有关的界面类。是用户权限验证后直接打交道的类。负责与用户交互,并维护各个业务界面及有序的动态显示各个业务界面。是业务中最接近用户的包装类。它当中的ReadTread类相当于系统分析中的业务类,此业务类是负责网络用户对弈逻辑的业务逻辑类(主要负责数据包的拆分和分析,然后把数据发送到相应的业务请求类中)业务请求类包括(ChessPane,MsgPane,ControlPane,VSinfo)。2 AccountGameInfo和ChariButtonAchievement说明AccountGameInfo 和ChariButton都是业务中和页面构造中不可少的元素类。AccountGameI

30、nfo主要负责存储用户的游戏信息。ChariButon是界面构造中不可缺少的元素类它负责构造每个台面上的椅子。在业务类中引用他是负责处理和记录每个用户的座位信息,Achievement类用来记录用户的积分信息,并在每局结束时显示给用户。3 PlayPane说明此类是业务请求类(ChessPane,MsgPane,ControlPane,VSinfo)的包装类。相当于系统分析中的业务代理类,主要职责负责几个业务请求之间的协调和调度,并根就根据业务请求来动态的规划他们之间的序列。最后向业务类发送业务请求。4 DataBaseOperate说明此类是系统分析中数据访问类。他的职责负责所有与数据库操作

31、的业务请求。他封装了实现所有业务层需要请求数据的数据库操作的方法。数据层只与server端通信。对其他层是不可见的。5 GameWin说明GameWin是直接与用户界面打交道的一个包装类。他负责构造用户游戏大厅。以loginPane为元素进行构造。并协调统一管理所有的loginPane。通过此类可以实现多用户多选择的游戏规则。6 ChessPane,MsgPane,ControlPane,VSinfo说明这四个类都是业务请求类,ChessPane类主要负责游戏对弈,并向业务处理类发送业务请求。MsgPane类主要负责聊天信息的显示及向业务处理类中发送业务请求,ControlPane类主要负责控

32、制游戏的各种状态机。VSinfo类主要负者显示用户的游戏积分信息,并向业务处理类发送数据更新和存储的业务请求。7 RefrushThread 说明此类主要负责用户界面的刷新。保证用户的界面数据更新后能及时反映到用户界面上。8 TableStatus 说明此类是游戏模块服务端中用来记录每个做面信息的类。用他来处理多用户,多桌面的并发游戏,在服务端记录每个桌面中对弈者的信息(包括输出流),每个桌面中的逻辑处理都是由它来精确定位信息,并交给每个桌面中的用户线程来处理用户的业务。4.3聊天类的职责说明1 ChatMainFrame说明ChatMainFrame相当于系统分析中的界面类。它是聊天程序中的

33、主界面也是直接和用户交互的类。他是ChatMainPane的包装类。只有合法用户登录后。ChatMainFrame才会把ChatMainPane包含进来。它当中的ReadThread类相当于系统分析中的业务类。他负责一切业务的逻辑处理,主要是与server端进行通信及处理server端发来的信息,并拆分信息,分析数据,最后将结果返回给业务代理类中,最终业务代理类把结果呈现给客户。2 ChatMainPane说明此类主要负责与用户交与,相当于业务系统分析中的业务代理类,提供给用户一切业务请求的可能。并把用户请求的业务结果显示给用户。它保持对ChatWin的引用。只有在用户的某个业务请求发生后。才

34、产生此引用的具体实例。4 ChatWin说明此类负责维护用户聊天界面,并提供一切与聊天有关业务功能。5 AccountFriendInfo 说明此类是聊天程序中好友信息的基本元素类。存储用户的详细信息。6 Music 说明此类负责音乐文件的播放,它相当于系统分析中的业务代理类。他是直接与用户打交道的类,负责维护播放器的界面,并将用户的业务请求发送到播放器的业务处理类中(WaveGraphPanePlayMusic)。最后根据处理的结果数据进行界面的显示。7 SongTablePane 说明此类负责维护用户的音乐文件列表。显示用户可播放的音乐文件。提供用户操作音乐文件的业务功能。8 SRThre

35、ad 说明此类是聊天模块和游戏模块中服务端的监听客户端连接的主线程。如果有客户端连接服务端。则此类便产生一个子线程负责该客户的业务操作。9 ChildThread 说明此类是负责处理,特定客户端的业务请求。每一个客户端都对应一个该线程。服务端处理每个用户的逻辑也都是有各个用户的线程负责处理。10 AccountStateInfo 说明此类是聊天模块服务端中用来记录登录者信息的类。用他来处理多用户并发聊天,每个登录的用户信息都会被服务端记录(包括输出流)。服务端收到聊聊天消息后,就会根据此类的记录取出输出流,进行数据的转发。4.4 主要活动图:4.4.1游戏客户端与服务端活动图:图22 游戏客户

36、端与服务端活动图流程说明:1 游戏服务端启动。2 游戏客户端启动。如果要对弈则必须需要两个以上的客户端启动。3 用户输入帐户,向服务器端发送验证请求数据包。4 服务端收到客户端的数据包后进行分析,如果是验证请求信息,则进行验证。如果是合法帐户,则发送验证成功的消息到客户端,同时记录日志。如果不是合法帐户,则向客户端发送验证失败的消息到客户端。5 客户端收到信息后,分析数据包,如果是登录失败的数据包,则提示登录失败的消息并返回到登录窗口中重新登录。如果是登录成功的消息,则进入游戏大厅。如果是其他消息则继续进行分析数据包的内容,如果是开始对弈的消息,则根据数据包中的内容初始化用户的游戏积分信息,如

37、果是聊天信息则在客户端显示聊天信息,如果是棋步消息,则更新客户端的数据。6 用户成功登录后进入游戏大厅,选择游戏场地,客户端程序验证用户选择的场地是否可用,如果可用则做下。如果不可用则显示已作下者的头像,用户重新选择场地。当用户坐下后,客户端则判断对弈双方是否准备好,如果准备好了则开始对弈,并向服务端发送命令消息。如果没有准备好则继续判断。7 服务端收到客户端开始对弈的消息后,到数据库中取得对弈双方的游戏积分信息,并记录日志,最后发送给对弈客户端。8 客户端收到服务端的初始化信息后,初始化游戏积分,然后进入对弈界面中。9 用户开始下棋,首先用户选择落棋的位置,客户端程序判断用户的落棋点是否有效

38、。如果有效则落棋,并进行全盘扫描,判断是否有赢棋或者棋盘是否已经充满棋子,如果有赢棋或者充满棋子,则提示客户端相应的输赢消息。最后将棋步和判断结果发送到服务端。10 服务端收到用户的棋步消息后,则组织数据包进行转发给对弈者。11 客户端收到棋步更新消息或者聊天信息,则显示聊天消息或者更新游戏的数据。如果是输赢的消息,则结束游戏对弈,并显示相应的提示框。此时用户可以选择退出游戏,或者重新开始游戏,或者返回大厅等命令。如果不是输赢消息,则跳转到9中继续执行。4.4.2聊天服务端与客户端活动图图23 聊天服务器与客户端活动图流程说明:1 聊天服务器启动,客户端启动。2 用户输入帐户进行登录,并向服务

39、端发送验证请求数据包。3 服务端收到客户端的数据包后,进行分析。如果是验证请求信息,则进行验证,如果验证失败,则向客户端发送登陆失败的消息,如果验证成功,则取得用户的好友列表信息,最后发送到请求客户端。4 客户端收到服务端的数据包后,进行分析。如果是登录失败的消息,则提示登录失败,并返回到登录窗口中重新登录。如果是登录成功的消息,则初始化用户的的好友列表和黑名单列表。5用户选择各种业务如:登陆游戏添加好友打开音乐播放器聊天。6 用户选择好友中的某个好友或者多个好友进行聊天,最后将聊天信息发送到服务端。7 服务端收到数据包后。分析数据,如果是聊天数据,则修改数据包,转发给要聊天者。8 用户收到聊

40、天消息后,则显示聊天信息,或者跳转到5中继续执行或者退出聊客户端。4.5 主要状态图4.5.1 用户聊天状态图:图24 用户聊天状态转换图4.5.2 用户游戏状态图图25 用户游戏状态转换图4.6 服务端与客户端整体设计思想系统采用C/S模式,所有客户端之间的通信都是通过服务端进行转发。为了能有序的正确的转发每个用户的数据。服务端采用多线程机制,每个线程对应一个客户端。首先服务端有一个监听主线程,监听用户的连接。一旦有某个用户连接了服务端,服务端便产生一个子线程负责处理该客户的业务。客户端和服务端通信是基于socket进行通信。客户端和服务端通信采用一定格式的数据包进行通信。服务端收到客户端的

41、数据包后将根据包头信息决定是那种业务请求并进行相应业务处理,最后将处理结果发送到客户端。客户端段收到数据包后,同样根据包头信息决定是那种业务的处理结果,最后更新到相应的界面中。聊天客户端采用记录聊天窗口对象的机制处理多用户的聊天信息。采用的存储结构是hashmap。首先用户在选择与某个人聊天时,系统就到窗体信息记录表中查找是否有该用户的聊天窗口信息记录,如果有则把该窗体换出设置为当前活跃的窗体。若没有则建立聊天窗口对象,并将聊天窗口对象的信息加入到聊天窗口信息记录表中。当用户收到聊天消息时,系统分析数据后同样到聊天窗口信息记录表中查找是否有该用户的聊天窗口对象,如果有就换出并设置为活跃窗口,如

42、果没有则建立该用户的聊天窗口对象,并将对象加入到聊天窗口信息记录表中。用户如果关闭了聊天窗口,聊天窗口信息记录表将删除该聊天窗口对象的记录信息。游戏客户端大部分是在处理用户的界面的维护,所以游戏客户端采用多线程机制。一个线程负责数据的接收和处理,一个负责用户界面的刷新。4.7 数据包设计表1 数据包格式表数据包格式发包端说明login:台号,椅子号客户端申请入座该台号,椅子号的座位logout:台号,椅子号客户端注销该台号,椅子号的座位,当客户段换座位时先发出lougoutplay!客户端请求与入座的另一方开始对弈 ,服务器可判断出客户的台号和椅子位置 下同go:棋子位置客户端请求服务器转发一

43、步棋给对方win:棋子位置客户端客户下完一步棋后发现自己赢了将发送此数据包到服务器要求转发对弈方对方收到后 将这步棋显示出来并弹出输了的信息框peace:棋子位置客户端客户下完棋发现双方打和将发送数据包到服务器 对弈方收到服务器的转发消息后将这步棋显示出来并弹出双方打和的消息框talk:聊天话本客户端请求服务器转发该聊天话本给对弈方Restart!客户端客户端点击”重新对弈”按钮后发送该请求到服务器,服务器将转发该数据包到对弈方agree!客户端客户收到对弈方请求重新开始对弈后,若接受,将发送数据包到服务器让服器转发回请求者go back!客户端客户点击”返回大厅按钮后发送数据包到服务器,服务

44、器收到后将转发给对弈方 ,也导致对弈方返回大厅exit:台号,椅子号客户端用户强行关闭网页时,将导致客户Applet发送数据包到服务器refresh!客户端客户请求服务器将游戏台面,椅子的入座情况信息,以刷新自己的游戏大厅seat:台号,椅子号服务器服务器向客户发送某台上的椅子的情况no seat!服务器服务器向客户返回该座位不可申请坐下的信息start:椅子号服务器客户点击”开始对弈”按钮后服务器判断双方可进行对弈就向双方发送数据包chess:棋子位置服务器服务器向客户端转发对方的一步棋defeat:棋子位置服务器客户端判断自己赢棋后,发送数据包给服务器,服务器将发出defeat包给对弈方让

45、他们弹出一个提示输棋的信息框peace!服务器客户端判断棋局打和后向服务器发送打和信息 服务器转发该包向对弈方表明打和message:;聊天话本服务器客户端通过talk包向服务器发送聊天信息,服务器收到后,发一个message包给对弈方和自己,使聊天话本显示出来agree?服务器当客户端点击”重新对弈”按钮后 ,服务器收到后将发送此格式包给对弈方询问是否愿意重新开始agree!服务器当服务器收到对弈方同意重新开始后将发送此格式包到原来的请求方以表明情况go back!服务器游戏一方通知其已返回游戏大厅之后 服务器发送此包通知另一方5系统算法的详细分析报告5.1 数据库并发访问瓶颈问题解决方案数

46、据库的设计无非就是建立索引,对表分割,主键的建立,以及SQL语句的编写。但一旦这些都经过了优化。那么数据库的并发访问就成了数据库应用的瓶颈。此次程序中选择了基于时间的回调定期的刷数据库中的最新数据到内存中。客户端的所有数据业务请求,Server端不会直接与数据库操作。而是所有的数据业务请求都会与Server端的内存打交道。为了保证所有客户请求数据的唯一性,Server端采用Singleton模式。为了让客户端查询速度快,Server端的内存构造采用的是Hash方式的Hashmap来构造。通过Hash方式检索定位数据,在速度上会得到很大的提高。用户请求的数据大部分都是异构型的数据所以根据应用定义

47、相应的类。Hashmap中的value 用相应的类列表进行填充。这样如果客户端请求的是大量异构数据的时候只要hash一次就可以精确定位到要查找的数据集。如果是查询某个具体的数据则会出现二次遍历。此时采用list来构造。在速度上比hashmap速度慢一些,但是他会减少hash的空间浪费问题。5.2棋盘分割算法的详细分析所谓的棋盘分割算法就是根据落棋点进行最小开始点前推和最大结束点后推,得出最小起始点和最大结束点。元算法如下图所示图24 棋盘分割算法元输赢判断和人机对弈的算法遍历则是根据推算出的最小起始点和最大结束点进行棋盘的局部遍历。流程说明:1 用户落棋。2 取得落棋点的坐标,并转换为棋盘中相

48、应的坐标。3 判断横坐标是否小于4,是则最小起始点横坐标就为0。如果不小于4,最小起始点横坐标=落棋点的横坐标-4,并继续进行判断是否小于10,不小于10 最大结束点横坐标等于14 ,小于10 则最大结束点横坐标等于落棋点的横坐标+4。4判断纵坐标是否小于4,是则最小起始点纵坐标就为0。如果不小于4,则最小起始点的纵坐标=落棋点的纵坐标-4,并继续进行判断是否小于10,不小于10 最大结束点纵坐标等于14 ,小于10 则最大结束点纵坐标等于落棋点的纵坐标+4。 游戏基本流程图如下:图25游戏对弈流程图分割算法:首先是在对角线上对棋盘进行分割如下图:图26 棋盘”分割图此时已经对对角线分割成对角

49、线上方和下方。对上下方继续进行分割对角线下方分割如下图:图27 “”下方子分割图在白色线包围的区域中具有同一种判断属性。在此区域中纵向向前推最小起始点都会越界(我们前推的方向是与对角线平行的);用下图进行举例分析。图28 “” 子分割图此时根据与对角线方向平行。棋子的落棋坐标为(3,4),根据前面横向前推原理得到他的最小起始点横向为边界即横向坐标为0,那么纵向向前推4个点后就会超出其边界,此时落棋点的纵向坐标前推4个点正好等于0,这是一个最边缘的临界点,且所有白色线包围的区域内向前推4个点后都会小于零,然而此时推算出的最小起始点和落棋点并不在一条直线上,且不与对角线平行。所以此区域有着单独的纵

50、向最小起始点的推算方法。(落棋的纵向坐标横向坐标)如图所示那么它的纵向最小起始点的坐标系就是4-3=1 那么此时最小起始坐标点就是(0,1)。而在黑色线包围的区域内符合通用的推算法(最小起始点横向坐标点=落棋横向坐标-4,最小起始点纵向坐标点=落棋纵向坐标点-4)。对角线上方分割如下图:图29 “”上方分割图此时在白色线包围的区域中有着同一种属性算法。根据前面的横向最小起始点推算法则最小起始点的横向起始点会出现越界的问题。如下图举例说明:图30 “”子分割图此时棋子的落点坐标为(3,2)根据前面纵向前推理论得到最小起始点的纵向坐标为0,那么根据通用的横向最小起始点推算法此时横向坐标点为0,与落

51、棋点不在一条直线上,且与对角线不平行。如果在保持与对角线平行的条件下推算会出现小于零。所以在白色线包围的区域中有着独立的最小起始点横向推算方法。此时的最小起始点的推算方法为(最小起始点横向坐标=落棋点横向坐标落棋点纵向坐标,0)根据此公式得出最小起始点坐标为(1,0)在黑色线包围的区域中有着通用的最小起始点算法(最小起始点横向坐标=落棋点横向坐标4,最小起始点纵向坐标=落棋点纵向坐标4)。左下角方向对角线分割方法:图31 “/”分割图根据不的同规则,在对角线上下方分别作棋盘分割。对角线上方分割规则和算法如下:图32 “/”分割举例图棋盘被对角线分割后,主要通过从落棋点到最大结束点的棋盘遍历方式

52、来进行输赢判断。在此对角线上方的棋盘又分割成两个部分。白色线包围的区域内具有统一的最大结束点后推方法,黑色线包围的区域中具有统一的最大结束点后推方法。在白色线包围的区域中最大结束点的纵坐标都是0,而最大结束点的横坐标的=落棋点横坐标+ 落棋点的纵坐标。所以该区域中的最大结束点坐标算法为:最大结束点坐标=(落棋点横向坐标+落棋点纵向坐标,0)。而在黑色线包围的区域内的最大结束点坐标的算法为:最大结束点坐标=(落棋点横向坐标+4 ,落棋点纵向坐标-4)举例说明:如上图所示白色棋子落在了白色线包围的区域内坐标为(2,3)则根据算法他的最大后推结束点坐标=(2+3=5,0)黑色棋子落在黑色线包围的区域

53、内根据该区域的算法得到最大后推结束点=(2+4=6,8-4=4)即应该推到黑色圆圈那截止。 对角线下方分割规则和算法:图33 “/”下方分割举例图在白色线包围的区域具有统一的最大后推结束点的算法,黑色线包围的区域中有着统一的最大后推结束点的算法。白色线包围的区域中的最大后推结束点的算法为 :最大后推结束点坐标=(14,落棋点纵向坐标-(14-落棋点横向坐标)。黑色线包围的区域中的最大结束点坐标算法为: 最大后推结束点坐标=(落棋点横向坐标+4,落棋点纵向坐标-4)。举例说明如下:如上图所示,白色棋子落在了白色线包围的区域中,坐标(11,5),根据该区域的最大后推结束点的算法,得到该落棋点的最大

54、后推结束点坐标=(14,5-(14-11)=2)即最大后推结束点坐标=(14,2)。黑色棋子的坐标(5,11)落在黑色线包围的区域中根据该区域的算法得到该落棋点的最大后推结束点坐标=(5+4=9,11-4=7)即最大后推点为图中黑色圆圈处(9,7)。5.3 人机对弈的算法分析主要采用放射性遍历棋盘来判断棋子最优位置。如下图所示:图34 人机对弈算法图用户落棋后计算机取得用户落棋的位置并以该位置为起点放射性的进行四个方向的搜寻统计棋子。并取得各个方向的棋子加权值(遍历统计方法采用前面的最小起始点和最大结束点的分割算法)。对四个方向的加权值进行比较取得加权值最大的那个方向作为落棋方向的最优方向。再

55、在最优方向上搜索空位置落棋,算法流程如下图:图35 人机对弈流程图流程说明:1 用户下棋2 判断下棋点是否是合法下棋点,是则落下棋子,不是则重新选择位置下棋。3 计算机取得用户落棋的坐标并转换成棋盘结构中的相应位置。4 在棋盘数组中以此位置作为起点进行横向,纵向,斜向搜索。搜索的距离是五个棋子位置的距离。5 统计各个方向的加权值。6 根据各个方向的加权值取得最大加权值的方向作为计算机落棋的最优方向。7 在此方向上寻找空位置,如果找到则在空位上落棋,如果没有找到随机落棋。5.4 数据库表效率问题的解决方案如果规范化设计产生了许多4路或更多路合并关系,而在具体应用中会大量使用这些合并关系,就可以考

56、虑在数据库实体(表)中加入重复属性(列)。采用标准的范式进行数据库逻辑设计会在存储空间上获得补偿,但是在性能上会有损失,因此数据库的设计不应仅仅考虑标准的范式,还要根据具体的应用增加适当的冗余。为了减少实体外部属性数据或行数据的开支而把1个实体(表)垂直分割成2个表(把所有的属性分成2组)。这样就把频繁被访问的数据同较少被访问的数据分开了。所以把用户信息表分割成了两个表,一个是用户永久不变的信息表和用户经常变动的好友表。而单独把游戏数据的信息构造成一个表。图36 数据库设计图5.5 防止灌水性注册的解决方案本程序中采用了两种方式注册用户一种是在应用程序中注册。另一种是在网页中注册。现在在应用程

57、序中注册不会出现灌水性注册。但在网页中注册时却容易出现灌水性注册(没有目的的大量注册用户),所以在网页注册的时候选择了填写验证码的机制来防止恶意用户的注册。如下图所示:图37 验证码5.6 整体提升性能的解决方案性能提升的原则和方法主要在以下几个方面:凡是大量用到字符串连接的操作时,变量结构摒弃String而是采用StringBuider,原因是String的连接操作会产生新的变量。这样对内存的开销会有很大的浪费,同时对于gc也是一个很大的负担。程序中涉及查询的结构时都是采用hash的方式。对于不需要同步的则采用hashmap这样可以减少很多关于同步机制维护的开销。对于同步的则采用hashta

58、ble的方式进行。对于动态数组的选择根据应用采用不同的动态数组。对于只需要快速随机访问的操作,则采用arrylist 而对于需要频繁的插入和删除采用linkedlist。对于server端和客户端的数据包传送,尽量用String类型的数据流进行传送。而对于大量异构类型的数据传送则采用序列化类。在服务端于客户端之间传送类。在读字符流的时候采用bufferreader进行快速读取。5.7 用户下载好友和黑名单列表信息的实现说明当用户登录聊天程序后输入合法的帐户并发送到服务器端去验证,当服务器端验证成功后就根据用户的帐户在内存表中查询该用户的所有好友和黑名单信息,并放入一个用户信息类列表中。因为li

59、st是可序列化的类类型。所以通过序列化的方式传送到客户端,客户端收到数据后将用户信息类进行反序列化得到原始数据。并根据这些信息来填写自己的好友列表好黑名单列表。5.8多人并发聊天的实现方式客户端根据记录每个用户聊天的聊天窗口对象来处理多人聊天的信息记录及信息的显示。服务端根据记录每个连接用户的线程信息来处理每个用户的业务。其具体流程如下:1 服务端接收到聊天请求数据后,分析该数据得到要聊天者的信息。2 服务端到线程记录表中查找是否有该聊天者的线程记录。如果有的话就把数据交给该线程进行转发,如果没有则向请求者返回相应的提示信息。3 客户端接收到消息后分析数据。如果是聊天数据就到聊天窗口信息记录表

60、中查找是否有该聊天者的窗口对象,有则换出,并设置为活跃窗口,进行信息的显示。没有则建立该用户的聊天窗口对象,并将对象加入到聊天窗口信息记录表中。如果是错误提示信息则显示提示信息。5.9 多用户并发下棋的实现方式多用户并发下棋主要是由服务端负责。首先客户端的游戏大厅界面构造采用了台面类作为元素构造多台面的游戏大厅。其次服务端定义了台面状态类。该类中含有与该台面的椅子信息属性,ip属性,输入输出流属性。主要流程如下:1 客户端选择台面进入游戏,就会向服务端发送入座的台面和台面中的椅子位置。2 服务端接收到数据对其分析,最后将该客户的台面和椅子信息记录到负责该客户的线程中的台面状态类的相应属性中。3

61、 客户端下棋,并向服务端发送相应的数据包。4 服务端接收到下棋数据包后进行分析,取得数据包中的台面和椅子信息并用服务端相应的台面线程来负责数据的转发。5 客户端收到信息后更新自己界面中的数据。6 跳转到 3中继续执行。5.10 用户移动好友,删除好友,增加好友的实现说明用户在选择了移动好友,删除好友,增加好友的业务时,均采用客户端向服务端发送包含业务相关信息的数据包。服务端分析数据包并请求数据层进行数据库操作。只有在数据层操作成功的情况下,客户端才能更新结果。5.11 棋盘结构的构造说明游戏客户端用做好的图片作为棋盘。程序中用二维数组来存储棋盘中的交叉点。程序启动后此数组的各元素值均为0,用户下棋后系统会取得下棋的坐标点,系统将坐标点进行调整转换为二维数组中的相应维的位置。并存储到数组中。黑棋子则存储1,白棋子则存储-1,空位则存储0。5.12 游戏积分处理的实现说明游戏采用积分制度。每一种游戏状态都对应一定的积分。程序中定义存储积分信息的积分类。当游戏结果出来时客户端取得记录自己积分信息类的对象中的积分信息并与本次的积分作累加再写入到对象的属性中。同时也取得记录对方的积分信息类的对象的积分信息并与本次对方应得的积分作累加再写入到对象的属性中,同时发送到服务端,服务端向数据层发送消息进行数据的存储。最后呈现给用户并更新到战

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

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

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


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