C#毕业设计说明书--网络五子棋游戏的设计

发布时间:   来源:文档文库   
字号:
网络五子棋游戏的开发及设计

摘要

随着人类社会进入21世纪,网络技术的快速发展,使得人类生活中的方方面面都围绕着这些丰富多彩的网络应用。这些网络应用在不同的领域都有不同的光彩,它们也逐渐成为人类生活中不可缺少的一部分。网络游戏就是在顺应这一网络应用潮流下所诞生的新兴技术产业,更是在网络市场上也掀起了一股开发网络游戏软件的技术热潮。网络游戏的种类繁多,比如休闲型的、对战型的、角色扮演型的和功能型的网络游戏。网络五子棋游戏就是一种简单的休闲型的网络游戏,这类网络游戏给予百忙中的人们一个休闲的娱乐方式,能够在工作之余,既能享受到游戏生活的乐趣,又能提高脑部思维能力,以便更好地提高工作效率。
通过研究分析网络市场上比较常见的五子棋游戏软件,如五子连珠、QQ五子棋等等的五子棋游戏软件,这一类的软件都是典型的休闲型络游戏,同时也是非常富有趣味性的益智型游戏。任意一款网络五子棋游戏的结构都是基于C/S模式的,这类的软件主要都包含客户端和服务器端两部分的功能设计,各部分分别实现不一样的功能。本系统重点设计了五个模块,包括用户注册模块、用户登录模块、游戏大厅模块、对弈窗体模块、服务器窗体模块。系统支持用户注册、登录、保存用户信息、简单的两人对弈、游戏胜负的判断等功能操作。

关键字:网络游戏、五子棋、C/S模式、功能模块设计

Abstract

THEDEVELOPMENTANDDESIGNOFGOBANGGAMEON
NETWORK

Abstract
Withthehumansocietywasenteringintothe21stcentury,therapiddevelopmentofnetworktechnology,whichmakesallaspectsofhumanlifebesurroundedwithcolorfulnetworkapplications.Thesenetworkapplicationhavedifferentgloryindifferentfields,theyarealsograduallybecomeanindispensablepartoflife.Onlinegameistheemergingtechnologyindustrythatwasbornedunderthetrendofnetworkapplication,butalsoboomsantechnologyupsurgeofdevelopingnetworkgamesoftwareinthenetworkmarket.Therearemanytypesofonlinegames,suchascasual,pvpscenarios,roleandfunctionalonlinegame.Gobanggameonnetworkisasimpleandcasualonlinegames,thiskindofonlinegamesgivesaleisureentertainmentwhichisnotonlyenjoythefunoflife,butalsoimprovethebrainpowerforbusypeopleafterwork,inordertoimproveworkefficiencybetter.
Throughresearchingandanalyzingthemorecommongobanggamesoftwareonthenetworkmarket,suchasNith-Game,QQ-Renju-Gamesoftwareandsoon,Thiskindofsoftwareisatypicallycasualgamesandalsoapuzzlegamewhichisveryinteresting.anygobanggameonnetworkwhosestructureisbasedonC/Smode,thiskindofsoftwaremainlycontainstwopartsfunctiondesignoftheclientandserver,andeachpartrespectivelyrealizesdifferentfunction.Thissystemhasfocusedondesigningfivemodules,includingtheuserregistrationmodule,userloginmodulemodule,thegamehallmodule,gameformmodule,serverformmodulefivemodules.Systemsupportsthefunctionalityoftheuserregister,login,savingtheuserinformation,simplechessgamefortwopeople,judgingthetheoutcomeofgame.
Keywords:OnlineGamesGobang,C/SMode,FunctionModuleDesign



目录
1网络五子棋游戏的系统简介.........................................1
1.1网络五子棋系统开发背景..........................................11.2网络五子棋系统概述..............................................3
1.2.1系统设计目标...............................................31.2.2系统功能结构图.............................................31.2.3系统运行流程图.............................................41.3网络五子棋系统开发环境..........................................52网络五子棋游戏数据库设计与开发...................................6
2.1数据库的概念设计................................................62.2数据库的创建....................................................62.3数据库的编程....................................................73网络五子棋游戏的通信设计.........................................9
3.1网络编程模型....................................................9
3.1.1IP地址.....................................................93.1.2端口.......................................................93.1.3UDP协议....................................................93.1.4Socket套接字...............................................93.2通信模块设计...................................................104网络五子棋游戏的功能模块设计....................................14
4.1GobangClass类库................................................144.2用户注册模块设计...............................................15
4.2.1功能设计..................................................154.2.2程序界面..................................................154.2.3实现过程..................................................15

I


4.3用户登录模块设计...............................................17
4.3.1功能设计..................................................174.3.2程序界面..................................................174.3.3实现过程..................................................184.4游戏大厅模块设计...............................................19
4.4.1功能设计..................................................194.4.2程序界面..................................................194.4.3实现过程..................................................204.5对弈窗体模块设计................................................22
4.5.1功能设计..................................................224.5.2程序界面..................................................224.5.3实现过程..................................................224.6服务器窗体模块设计.............................................26
4.6.1功能设计..................................................264.6.2程序界面..................................................264.6.3实现过程..................................................27
5网络五子棋游戏的算法设计........................................296网络五子棋游戏的系统测试........................................317结论...........................................................32致谢..................................................................33参考文献..............................................................34附录..................................................................35
II



前言
人类社会已经进入了信息化产业迅猛发展的新世纪当中,软件和信息服务产业作为信息产业的核心,已经成为时代全球信息产业中最重要的,同时也是最核心的一部分。无论是进行宇宙探索的航天飞船,还是日常生活中的飞机、汽车、家电或手机,这些器械之所以能够正常地运行,全都是靠它的内在软件系统。因此,从安全性和实用性的方面来看,软件系统的开发其实是一个相当困难的过程,不但会遇到各种需要解决的技术难题,更面临着无处不在的风险压力。所以,一个优秀的软件技术开发人员不仅仅需要过硬的技术基础和丰富的经验,还需要一颗坚定的心来抵抗一切来自软件开发的压力。
现阶段的软件开发与网络技术相结合,研发出了一种适合在互联网或企业内部网中,使用网页浏览器操作的应用软件,这种软件也就是网络应用。现实生活中的网络应用多种多样,包括了网络办公、网络游戏、网络电视、电子商务、网络资源搜索、电子邮件、千姿百态的网站、杂志订阅、远程控制以及其他各种与网络相关的应用软件。这些网络应用软件逐渐占领了国内外的网络市场,拥有较为广阔的经济发展前景的同时,使得大量的软件技术开发人员或是IT精英都投入到网络应用开发的领域中来,引领着网络技术应用方面不断地进步和发展。
由于现代都市生活的发展节奏越来越快,人们在工作、学习和生活等方面所承受的压力也在不断地增大,逐渐超出人们所能承受的范围,遏制着人们前进的步伐。因此,越来越多的人们都选择在工作之余进行类似网络游戏这样的娱乐方式,来缓解压力,以达到劳逸结合的同时提高工作效率,增强积极向上的乐观生活态度的目的。
现阶段网络上的网络游戏的种类游戏很多,比如休闲网络游戏、网络对战类游戏、角色扮演类大型网上游戏和功能性网游等等。五子棋游戏就是一款典型的休闲网络游戏,同时也是一款富有趣味性的益智型游戏。用户可以通过游戏网站和平台下载各种各样的网络五子棋游戏,如五子连珠勋章版、五子彩球、五彩连珠、五色球、七彩连珠、彩珠连连看、彩色五子棋以及搞怪碰碰球、QQ五子棋、五子棋大师、黑石等等。而提供这类的游戏下载网站和平台大体上有4399小游戏、多玩、5173、游民星空、浩方、QQ、起凡等等。不相识的用户通过像五子棋游戏一样的网络游戏进行对弈和信息交流,切磋棋艺,提高技艺和交流能力。
III



1网络五子棋游戏的系统简介
1.1网络五子棋系统开发背景
1.研究现状
随着计算机技术的发展,特别是因特网的推广与应用,网络技术已深入到人们的工作和生活的各个方面,众多的计算机通过网络连接在一起,网络组件应用程序必不可少,现有的应用软件必须结合网络功能才能在市场上拥有竞争力。同时,快节奏的生活给人们的压力日益增大,更多的人愿意在工作之余进行各种娱乐。而网络游戏作为这种娱乐方式的一朵奇葩,迅速占领了市场发展的重要部分,各种各样的网络游戏软件层出不穷,不断丰富着人们的生活,逐渐成为人们生活娱乐的重要方式之一。
本次设计要求开发一款基于VisualC#平台的网络五子棋游戏软件,这是一款类似于棋牌的休闲网络游戏应用软件。网络五子棋游戏的技术研发,就是将网络技术与五子棋游戏规则相结合,以便实现在同一网络中两人或多人在线对弈五子棋的功能。五子棋游戏又称连珠游戏,是一种两人对弈的纯策略型的棋类竞技运动的益智游戏。五子棋游戏因其简单易学、技巧简单、学问深奥的特点而被广大人民群众所喜闻乐见。五子棋游戏的就是黑子先行,五子相连即可得分,棋子的方向可以是横向、竖向、斜向。这种游戏规则不仅明显地体现了现代休闲生活的短、平、快的特征,又体现出了高深的古典哲学阴阳易理的学问,是中西文化的交流点和古今哲理的结晶,拥有东方的神秘性和西的方直观性特点。这种益智型的网络游戏技巧简单易学但又具有深奥的逻辑性,非常富有趣味性和消遣性,能增强思维能力和提高智力,有助于修身养性,让人们在休闲放松之时锻炼脑力。
网络五子棋游戏不仅能够满足了人们对休闲娱乐游戏生活的需求,从不同的角度上看,网络五子棋游戏软件也具有一定深远的意义。例如,从经济发展角度上来看,网络五子棋游戏软件在网络市场发展中很受欢迎,用户通过在网上免费下载或购买这一系列的软件游戏,从而带动了网络市场的经济发展,使得网络市场经济将在国民经济市场总值中占有一定的比例,提高市场经济发展能力。再比如说,从文化传播角度上看,五子棋游戏软件在设计开发时依旧遵循五子棋的文化特色。软件在市场上越受欢迎,也就会有更多的人喜爱这些五子棋游戏软件,不断地弘扬和传播五子棋的精神和棋文化,同时带动我国其它文化底蕴深厚的棋文化的交流与传播,比如说象棋、围棋等等。软件设计基于C/S模式,有服务器端和客户端两部分。服务器端程序设计用来保存用户的个人信息,包含注册信息和对弈信息,设置游戏大厅,与客户端的对弈连接,判断对弈胜负。而客户端程序设计则要求实现用户登录服务器,确定房间坐席,进行对弈的功能。

1


2.研究现状
现阶段网络上有很多个游戏网站和平台都推出了具有趣味性和消遣性的五子棋游戏软件成品。在这些游戏网站和平台上,程序员发布研发出来的软件有不同的运行环境,有单机型的(无网络连接,人机对决、网页对战型(在线平台对决和手机版。
单机型的五子棋游戏软件界面简洁,操作简单。这类的游戏大都可以在游戏网站上下载到电脑中即可。这种类型的益智五子棋小游戏有五子连珠、五子球、疯狂五子连珠、五子连珠勋章版、五子彩球、五彩连珠、五色球、七彩连珠、彩珠连连看、彩色五子棋以及搞怪碰碰球等等。游戏运行不需要联网,界面中只有棋格和预览框,棋盘上的棋子则是用不同颜色的球代替,每选择一个颜色的球放在棋格中,棋格中就会自动给出其它颜色的球,用户还可以在预览框中查看到下一步可选择的球色,在棋格被填满之前将达到五个以上的同色球消除就可以得分。
对战型的五子棋游戏界面美观大方,配置华丽,人物众多,操作也简单。这类型的五子棋游戏都是需要在线对弈,而且大部分都必须在该游戏软件的游戏保障平台上才可以对决。很多人比较熟悉的游戏平台QQ上就包含这类的五子棋软件:QQ五子棋和五子连珠。QQ五子棋是由腾讯公司推出的,在原有玩法规则和比赛模式上推陈出新,游戏性能更强大的QQ游戏平台中研究开发出的一款两人在线对弈游戏。游戏中设置多个区域和房间、以及桌子,每张桌子只容两人对决。根据五子棋的规则进行黑白棋子游戏,然后获得积分和相应的段数等级。五子连珠是指腾讯QQ平台开发的《QQ想世界》中的一款在线游戏,有各种各样的人物造型。在游戏中有黑罐子、白罐子和炸弹怪三种怪物,用户根据五子棋的玩法消灭这些怪物。消灭黑罐子就会出现白罐子,反之,消灭白罐子就会出现黑罐子;消灭炸弹怪,就可以把它周围的所有罐子都消灭掉。同样,在游戏结束后获得相应的分数、等级和装备。除了必须在游戏平台上使用的五子棋游戏以外,还有一款五子棋游戏辅助软件黑石BlackStone,这是一款被公认为连珠对弈软件中综合棋力最强的最常用的软件。在2000年传入中国后,黑石对中国各学术界研究五子棋理论起到了前所未有的推进作用。
手机版的五子棋游戏界面也非常简洁。在很多情况下,布局和配置上也含有很多的趣味性,这类的游戏有五子连珠MoovingBalls、五子棋大师、极品五子棋、JM休闲五子棋、欢乐五子棋和彩色五子棋等等。就拿五子连珠MoovingBalls来说,它的趣味性在于将传统的黑白五子棋更改为各种各样的以人物的脸部表情为原型的球,和五子棋的规则一样,每走一步就任意出现三个球,在界面被填满之前,只要把至少5个一行或一列的球消掉就可以得分。
这些五子棋游戏软件的设计研发也都在不断地进行着,秉持着界面美观、大方、友好,操作简单、方便的基本特点,设计研发出独具特色的游戏软件系统。软件各模块设计之间层次更加分明,联系更加紧密。用户使用这些五子棋游戏软件时,软件保存用户的各种信息,提供可靠的信息保密制度和安全保障。

2


1.2网络五子棋系统概述
1.2.1系统设计目标
设计要求开发一个基于VisualC#平台的在线五子棋游戏软件,软件的开发要求各模块层次要求进行详细分析和规划,设计必须条理清晰,实现各种不同的功能,全面而系统地编程设计五子棋游戏软件,以便软件可以按照要求正常运转,进行五子棋游戏。具体设计要求包括:
(1操作简单方便、界面简洁美观;
(2注册模块除了注册个人信息以外,还可以包含用户头像;
(3设置游戏大厅,进入游戏大厅后选择房间进入,显示当前房间的人员信息;(4进入和退出座位时,显示座位状态;
(5在对弈双方的棋盘上实时显示棋子,对弈结束后,高亮显示最后下的棋子;(6按照五子棋规则判断胜负,并按胜负给玩家进行分数的调整;(7在服务器端对人员的分数进行排序;
(8五子棋软件要求服务器端和客户端都能正常工作运转,用户可以在该软件上顺畅地进行游戏,最后提交整个工程的源代码。
1.2.2系统功能结构图
本系统设计基于C/S模式分为客户端和服务器端两大部分。客户端则包含用户注册模块和用户登录模块、对弈窗体模块,而服务器端包含游戏大厅模块和服务器窗体模块。
网络五子棋游戏软件系统的功能结构如图1-1所示:

网络五子棋游戏软件系统
客户端
服务器端

用户注册模块


用户登录模块


对弈窗体模块


游戏大厅模块


服务器窗体模


1-1网络五子棋游戏的系统功能结构
3


1.2.3系统运行流程图
当五子棋软件的服务器端运行时(开始服务,客户端的用户首先进入用户注册模块,判断用户是否注册过,如果已注册,则直接登录用户;否则用户要先在注册模块填写个人的注册信息,包括IP地址、端口号、用户名、密码、头像和性别等信息。将这些注册消息发送给服务器端,服务器端处理接收到的消息命令,并返回注册是否成功消息。如果注册成功则进入用户登录模块;否则重新注册用户信息。
用户进入登录模块时,输入用户名和密码,将登录信息发送给服务器端,判断是否存该用户,如果存在,则返回登录成功消息,证明该用户存在并且用户成功登录游戏大厅模块;否则就返回登录模块窗体,重新登录用户。
用户登录游戏大厅模块后,选择想要进入的区号、房间、桌子以及座位后,发送消息给服务器端,由服务器端判断是否可以进入对弈窗体模块。
用户进入对弈窗体模块后,窗体显示进入座位的用户信息,等待另一个用户的进入,就可以双方在棋盘上对弈,最后将得分跟新到数据库中。
五子棋游戏软件的客户端和服务器端的系统运行流程图如图1-2所示:

1-2网络五子棋游戏的系统运行流程图

4


1.3网络五子棋系统开发环境
1.软件开发语言
C#语言是由CC++衍生出来的,拥有强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的能力,使之成为.NET编程开发的首选语言,为编程提供了一系列的工具和服务,以便程序员可以最大程度地研究开发计算与通讯等计算机领域。本次系统设计就使用C#语言作为系统的开发编程语言,凭借该语言的各个语法特点,软件设计的编程开发将会更加地简洁,条理层次也将更加地清晰。2.软件开发平台
MicrosoftVisualStudio2010是目前最流行的Windows平台应用程序开发环境。本重新设计和组织了集成开发环境IDE)的界面。支持开发面向Windows7的应用程序设计,更是支持包含MicrosoftSQLServerIBMDB2Oracle数据库在内的数据库编程的开发。本次系统设计使用VisualStudio2010作为软件的开发平台。新版本的功能强大,包括有C#4.0中的动态类型和动态编程;多显示器支持;使用VisualStudio2010的特性支持TDD;支持OfficeQuickSearch特性;C++0x新特性;IDE增强;使用VisualC++2010创建Ribbon界面;新增基于.NET平台的语言F#3.数据库开发平台
MicrosoftSQLServer2008是目前版本较为新颖的数据库开发平台,使用该平台可以存储、组织、管理数据库中表的任何数据,也可对这些数据库中的表进行查询、搜索、同步、报告和分析之类的操作,具有可靠性、高效性、智能性的特点。用户可以在该数据库开发平台中创建一个任意数据库,并在库中创建一个或多个二维数据表格(关系表格,用来储存需要储存的数据信息。同时还可以对这些表格进行分类、合并、连接或选取等运算操作,以便实现对表格中数据的管理。
5



2网络五子棋游戏数据库设计与开发
设计开发网络游戏软件时,需要设计相应的数据表来存放游戏中的基本信息。系统使用SQLServer2008作为数据库的开发平台,创建五子棋游戏软件的数据库db_LANGobang_Data,在数据库中创建表“dbo.tb_Gobang,用来存放游戏中注册的所有用户的信息,包括用户名、密码、分数、等级以及状态等等。在需要的情况下,可以对这些信息进行查询、修改、读取等操作。
2.1数据库的概念设计
根据系统的设计目标得知在该系统中,服务器端需要向数据库表中存储的用户信息。用户注册时,需要注册用户的IP地址、端口号、用户名、密码、头像和性别等信息,当把注册信息存储到数据表中时,表自动分配一个用户的编号ID
用户在进入游戏大厅时,会存储用户的状态、分数。选择座位后存储区号、房间号、桌号、座位号和用户座位名称等信息。由此可得数据表“dbo.tb_Gobang”的各个属性值,实体E-R图如图2-1所示:
编号ID
端口号
用户名
IP地址
座位名称
座位号
密码
数据表
dbo.tb_Gobang
桌号
头像
房间号
性别
分数
状态
区号

2-1数据表dbo.tb_Gobang的实体E-R
2.2数据库的创建
(1运行SQLServer2008的数据库开发软件,选择服务器类型、服务器名称、身份验证类型,输入软件在安装时设置的登录名和密码,即可打开数据库开发平台。
(2选择节点“数据库”,右击“新建”,弹出的新建新的数据库的窗体,输入数据库名“db_LANGobang_Data”后,单击“确定”按钮。
(3E-R图得到数据表“dbo.tb_Gobang”的逻辑结构设计,如表2-1所示。在新的数据库db_LANGobang_Data的节点下,选项“表”右击新建,弹出表格的设计

6


窗体,在窗体中填写包括字段、数据类型、允许为空值和字段描述等信息。
2-1数据表dbo.tb_Gobang的逻辑结构设计
列名ID(主键IPPortUserNamePassWordFractionStateBoroughRoomMarkDeskMarkSeatMarkUserCaptionCaputSex
数据类型
intvarchar(20varchar(20varchar(20varchar(20
intintintvarchar(20varchar(20varchar(20varchar(20
intint
允许空不允许允许允许允许允许允许允许允许允许允许允许允许允许允许
字段描述编号IP地址端口号用户名密码分数用户当前状态
区号房间号桌号座位号用户座位名称
头像性别
(4设置完相应的字段和数据类型和描述,字段ID设为主键和自动编号。单击存”按钮,在弹出窗口中输入表名“dbo.tb_Gobang,单击确定后数据库表创建成功。
2.3数据库的编程
ADO.NET是为了.NET框架而建的,是对ADO(ActiveXDataObjects对象模型的扩充。ADO.NET的两大核心控件是.NETFramework数据提供程序和DataSet1.NETFramework数据提供程序
.NETFramework数据提供程序用于连接数据库、执行命令和检索结果,共4种,分别是SQLServer.NETFramework数据提供程序、OLEDB.NETFramework数据提供程序、Oracle.NETFramework数据提供程序和ODBC.NETFramework数据提供程序。.NET数据提供程序模型的核心对象有四种,如表2-2所示:
2-2.NET数据提供程序的核心对象
对象ConnectionCommandDataReaderDataAdapter

功能
与特定数据源建立连接对数据源执行命令
从数据源中读取只向前的且只读的数据流,是一个简易数据集
用数据源填充DataSet并解析更新
7


2.DataSet数据集对象
DataSet数据集对象作为支持ADO.NET的断开式、分布式的数据方案的一个核心对象。DataSet对象是数据的内存驻留表示形式,DataSet对象用于多种不同的数据源,XML数据源、管理应用程序的本地数据源等。根据不同的数据源,DataSet对象都会保持关系编程模型和数据源之间的一致性。DataSet由相关表、约束和表间关系组成。
DataSet对象中添加行要经过三个步:第一步是为数据集中的某个数据表添加一个新行;第二步是给新行的各列赋值;第三步是把新行添加到数据表的行集合中。3.数据库连接
本次毕业设计系统中,系统要连接数据源是SQLServer数据源,所以在程序使用了以sql开头的SqlConnection对象和SqlCommand对象来处理软件和数据源的连接和操作。其中,SqlConnection对象用来连接数据库,SqlCommand对象执行SQL操作。
系统设计中将服务器对数据库的所有操作分装在ClassOptionData类中,通过调用类中的各个方法来对数据库进行查询、添加、修改等操作。具体编程设计步骤如下:
(1建立包含数据库连接的字符串;(2生成连接数据库的SqlConnection对象;
(3建立包含SELECT语句的字符串,从表中获取记录的列;(4生成SqlCommand对象,保存这个SELECT语句;(5SqlConnection对象的Open(方法打开数据库连接;(6执行SQL语句;
(7释放SqlCommand对象资源;(8关闭连接数据库;
(9释放SqlConnection对象资源。
8



3网络五子棋游戏的通信设计
3.1网络编程模型

系统设计要求设计的网络五子棋游戏软件是基于Socket套接字和UDP协议实现的。设计使用无连接的UDP网络编程依据服务器端Server和客户端ClientIP地址和端口来进行进行连接通信。
3.1.1IP地址
IP地址(InternetProtocolAddress,也就是互联网协议地址,是由IP协议提供的一种统一的地址格式,为每个连接在互联网上的主机或路由器分配一个在全世界范围内唯一的逻辑地址标识符。一个IP地址主要有两部分组成:一部分是用于标识该地址所从属的网络号,另一部分是用于指明该网络上某个特定主机的主机号。
3.1.2端口
端口(PortTCP/IP协议中用来与IP地址相匹配的端口,范围从065535IP址与网络服务的关系是一对多的关系,如果主机仅是靠IP地址的话,是不能实现不同的网络服务的。所以这才有了端口的存在。在Internet中,TCP/IP使用“IP地址+端口号”来唯一标识设备和服务,以此来实现不同的网络服务。
3.1.3UDP协议
UDP协议(UserDatagramProtocol,用户数据报协议,是OSI参考模型中一种提供面向事务的简单不可靠信息传送服务的无连接的传输层协议。UDP协议用来支持那C/S模式的网络应用在计算机之间传输数据。数据发送一方(客户端或服务器端)使用UDP协议将网络数据的流量压缩成UDP数据报,再通过源端口发送出去,而数据接收一方则通过目标端口接收数据。一个UDP数据报就是一个数据传输单位,以二进制的形式的字节来表示,数据报的字节分别包含了报头信息和具体的传输数据。
3.1.4Socket套接字
套接字Socket是当前最流行的网络编程的接口之一,它有流套接字和数据报套接字这两种类型,主要是用来和在同一域中的套接字进行通信中并交换数据的。系统设计使用了无连接的套接字。无连接的套接字是不需要在网络设备之间发送连接信息的。因此不能确定谁是服务器,谁是客户机。如果一个设备最初是处在等待远程设备的信息,则必须用Bind(方法将套接字就绑定到一个本地的地址和端口。完成绑定后,设备之间就可以利用套接字进行通信接收数据。

9


3.2通信模块设计
本次系统中使用了UDPSocket控件,它将UDP协议封装在该控件中,用于对主机的端口号进行监听,以获取远程计算机发送来的消息。在编程设计中使用UDPSocket控件的Send(方法将发送数据消息,然后在接收数据的一方创建控件的异步托管事件DataArrival来处理判断的各种消息命令。
系统中将需要使用的消息对象、消息命令和发送类型,都封装在ClassMsg类中,用来序列化这些消息命令。该类中的消息命令、发送类型分别如表3-13-2所示:
3-1ClassMsg类中的消息命令
消息命令无命令注册注册结束注册存在登录登录结束发送消息发送消息用户列表更新状态进入大厅退出大厅开始游戏关闭游戏退出区域获取消息返回消息语聊更改分数对弈连接连接完毕退出连接单聊获取分数退出

枚举值NoneRegisteringRegisteredRegisterAtLoginingLoginedSendToOneSendToAllUserListUpdateStateComeToHallExitToHallBeginToGameEndToGameExitToAreaBegingRivalEndRivalComeToSayUPDataFractBeginJoinEndJoinExitJoinOddLittleGetGameFClose
10
功能说明没有消息命令用户注册个人信息用户注册信息结束注册的用户信息已存在
用户登录用户登录结束发送消息给单个用户发送消息给所有用户获取用户的列表信息
更新用户状态
进入游戏大厅窗体,更新用户状态退出游戏大厅窗体,更新用户状态开始对弈游戏,更新用户状态结束对弈游戏,更新用户状态退出大厅区域,发送消息给所有用户
获取用户信息,发送给对方获取对方消息,返回给用户
添加语聊信息在数据库中更改分数连接对弈的双方对弈双方连接完毕退出对决游戏对弈的双方单聊获取对方玩家的分数
退出窗体


3-2ClassMsg类中的发送类型
发送类型无类型发送命令发送消息
枚举值SendNoneSendCommandSendMsg
功能说明无类型发送的是命令发送的是消息
1.服务器端消息
服务器端在收到发送来的信息后,先判断该消息发送类型的是命令SendCommand还是消息SendMsg。如果是发送消息类型,则执行发送消息下的发送消息给单个用户的命令。如果是发送命令,则依据消息命令的不同执行不同的操作,如图3-1所示,具体如下(1~(12的操作。
(1服务器端接收到“注册”的消息命令时,即命令类型值为Registering,程序在调用RegisterUser(方法用来注册用户的信息之前,要先调用IfRegisterAt(方法判断是否已经存在该用户,如果不存在则调用InsertUser(方法来插入新用户。
(2服务器端接收到“登录”的消息命令时,即命令类型值为Logining,程序调用UserLogin(方法用来登录用户之前,先调用UpdateLoginUser(查找数据库中是否有该用户,当有该用户的时候才可以登录成功。
(3服务器端接收到“发送消息”的消息命令时,即命令类型值为SendToOne,程序调用SendUserMsgr(方法发送信息给单个用户。
(4服务器端接收到“进入大厅”的消息命令时,即命令类型值为ComeToHall程序调用UpdateUser(方法更新用户在线状态,恢复消息的MsgCommand命令后,调用UpdateUserList(方法将信息返回所有进入大厅的用户。
(5服务器端接收到“退出大厅”的消息命令时,即命令类型值为ExitToHall,程序调用UpdateUser(方法用来更新所有在线用户的状态。
(6服务器端接收到“开始游戏”的消息命令时,即命令类型值为BeginToGame程序调用UpdateUser(方法用来更新所有在线用户的状态,并将结果更新到窗体列表。
(7服务器端接收到“退出游戏”的消息命令时,即命令类型值为EndToGame,程序调用UpdateUser(方法用来更新所有在线用户的状态。
(8服务器端接收到“退出区域”的消息命令时,即命令类型值为ExitToArea,程序调用MessColley(方法用来将消息发送给所有的在线用户。
(9服务器端接收到“获取对手信息”的消息命令时,即命令类型值为BegingRival程序调用UserGame(方法用来获取对方用户的信息。
(10服务器端接收到“语聊”的消息命令时,即命令类型值为ComeToSay,程序调用UserText(方法发送聊天信息给对方,然后调用MessColley(方法将消息发送给所有的在线用户。

11


(11服务器端接收到“在数据库中修改得分”的消息命令时,即命令类型值为UPDataFract,程序调用UpdatePlayChess(方法用来更新用户的得分情况,最后调用UpdateUser(方法将数据更新到窗体列表。
(12服务器端接收到“获取对方得分”的消息命令时,即命令类型值为GetGameF程序调用UserGame(方法用来获取对方用户的得分信息情况。
服务器端
注册
Registering注册用户信息
发送类型?
消息
登录
Logining用户登录进入游戏大厅,
更新用户在线状态退出游戏大厅,更新用户在线状态开始游戏,更新用户在线状态退出游戏,更新用户在线状态退出大厅区域,更新用户在线状态
进入游戏大厅



ComeToHall
退出游戏大厅
ExitToHall
开始游戏
BeginToGame
客户端
命令类型?关闭游戏
EndToGame
退出区域
ExitToArea
语聊
ComeToSay添加语聊信息
获取分数
GetGameF获取对方玩家的分数
获取消息
BegingRival
命令类型?
获取用户信息,发送给对方
更改分数
UPDataFract
在数据库中更改分数
发送消息
SendToOne发送消息给单个用户
3-1服务器端处理消息命令的流程图
2.客户端消息
客户端各模块中创建UDPSocket控件的异步托管事件DataArrival处理由服务器端返回的消息,根据消息命令执行不同的操作,如图3-2所示。具体如下(1~(7的操作。
(1客户端接收到“注册成功”的消息命令时,即命令类型值为Registered,程序

12


Windows下生成INI文件,记录用户的IP地址、端口号、用户名和头像,并关闭窗体。
(2客户端接收到“注册用户已存在”的消息命令时,即命令类型值为RegisterAt程序清空窗体中注册的用户信息,要求用户重新注册。
(3客户端接收到“登录成功”的消息命令时,即命令类型值为Logined,程序获取用户的IP、端口、性别、分数等信息,关闭登录窗体。
(4客户端接收到“对弈连接”的消息命令时,即命令类型值为BeginJoin,窗体显示当前用户的头像、性别、分数等信息在窗体中。
(5客户端接收到“获取对方分数”的消息命令时,即命令类型值为GetGameF程序获取用户的IP、端口、性别、分数等信息,关闭登录窗体。
(6客户端接收到“单聊”的消息命令时,即命令类型值为OddLittle,程序中两个用户可以在对弈窗体中的聊天室进行聊天。
(7客户端接收到“退出连接”的消息命令时,即命令类型值为ExitJoin,程序先判断是哪一个用户退出连接的,然后窗体将移除该用户的用户名、头像和棋盒等信息,在用户列表中也将移除该用户的信息。
客户端
接收返回的消息
注册
消息
Registered
注册信息结束,注册信
息成功,生成INI文件注册的用户已存在,注册
失败,重新注册登录成功,记录用户的信息,并关闭窗体
RegisterAt
命令类型?
登录
Logined
BeginJoin
对弈连接,窗体显示用户的信息
对弈窗体
GetGameF获取对方玩家的分数
OddLittle
退出游戏,
更新用户在线状态断开连接,窗体移除用户的信息
EndJoin

3-2客户端处理消息命令的流程图

13



4网络五子棋游戏的功能模块设计
4.1GobangClass类库
在开发网络五子棋游戏软件时,可以将多个封装发送接收消息功能的类储存在一个类库GobangClass中,以便服务器端和客户端编程时很好地调用这些功能类。类库GobangClass中的各个功能类及其功能描述如表4-1所示:
4-1GobangClass类中的功能类
类名
UDPSocket控件
功能描述
程序窗口设计中添加了一个UDPSocket控件,将UDP协议封装在这个控件中,用于对主机的端口号进行监听,以获取远程计算机发送来的消息。
Publec_Class在设计中创建Publec_Class类,用来记录服务器端和客户端的基本信息,MyHostIP(Get_windows(MyHostIP(是用来获取服务器端所有的IP地址,方法Get_windows(是用来获取windows路径(目录
ClassForm在设计中创建ClassForm类主要实现的功能是用来通过指定的索引号,InnerList表中查找你到相应的窗体,并进行添加和移除等操作。
ClassMsg在程序设计中创建ClassMsg类,主要是打算使用[Serializable]对该类中用枚举型的元素值来指定参数、消息命令、消息类型等所有的对象进行序列化操作。序列化的引擎会跟踪所有已经序列化过的引用对象,确保这些对象不会被多次序列化。
ClassOptionData在设计中创建ClassOptionData类,把服务器对数据库的所有操作都进行了封装,通过对该类中各个方法的调用来对数据库中的数据进行查询、添加、修改等操作。
ClassSerializersGobangClass类库设计中创建ClassSerializers类,因为Socket只能以二进制流的形式进行传输,所以当客户端发送或接收到的消息时,必须将对象序列化或反序列化成二进制流。
ClassUserInfo在设计中创建ClassSUserInfo类,用于记录当前的用户ID、用户IP址、用户名、分数、状态、区号、房间号、桌号、座位号、用户座位号名称、头像和性别等,并对该类进行序列化。
ClassUser在设计中创建ClassUser类主要是用来将服务器端所有注册的用户信息存储到base类的InnerList列表中,使得当前用户在登录或退出时,可以将列表中的信息群发给所有的在线用户,以改变用户显示状态。
14


4.2用户注册模块设计
用户注册模块是在客户端的用户第一次进行网络五子棋游戏的程序时,对当前用户进行注册,并将注册信息发送给服务器端记录到数据库中。
4.2.1功能设计
(1如果用户是第一次进行游戏,运行客户端程序窗体,弹出界面窗体,单击窗体中的“注册新用户”文字,系统将弹出注册窗体界面。
(2在弹出的窗体中输入IP地址、端口号、用户名、密码、头像和性别等信息。其中,头像和性别可以通过下拉列表的格式选择。
(3输入完注册信息,单击“确定”按钮,实现新用户的信息注册,注册成功后将会关闭注册窗体,弹出登录窗口,用户即可登录。
4.2.2程序界面
如果用户是第一次进行游戏,运行客户端程序窗体,单击程序运行窗体中的“注册新用户”的字样,系统将弹出用户注册信息的窗体界面。用户注册模块窗体F_SerSetup的界面如图4-1所示,在界面中输入需要注册的用户信息,如IP地址、端口号、用户名、密码、头像和性别后,单击“注册”按钮注册用户信息。

4-1用户注册窗体F_SerSetup界面
4.2.3实现过程
用户运行客户端的注册界面F_SerSetup,以便实现新用户注册信息的功能,大体流程图如图4-2所示:
15


客户端服务器端
发注册消息
用户注册模块
调用RegisterUser(方法
注册用户
输入IP地址、端口号、用户名、密码、头像、
性别等信息
返回注册失败信息
调用IfRegisterAt(方法判断用户是否已注册过

已注册?
N
注册成功?
返回注册成功信息
N
调用
InsertUser(方法来插入
新用户

用户登录模块

4-2用户注册模块流程图
(1新建Windows窗体F_SerSetupForm界面的Text属性设置为“用户注册”窗体设计的主要控件如表4-1所示,依次添加这些控件,设置相关的属性值。
4-1用户注册模块F_SerSetup的主要控件
控件类型TextBox
控件IDtext_IPtext_IP5text_Nametext_PassWordtext_PassWord2
ComboBox
comboBox_CPhoto
主要属性设置
BorderStyleFixedSingleBorderStyleFixedSingleBorderStyleFixedSingle
PasswordChar*PasswordChar*DropDownStyleDropDownListDrawModeOwnerDrawVariable
comboBox_Sex
DropDownStyleOwnerDownDrawModeNormal
Button
button_OKbutton_Close
UDPSocket1
udpSocket1
Text"注册"Text"取消"LocalHost127.0.0.1LocalPort11001
ImageList1

用途注册用户IP地址注册用户端口号注册用户用户名注册用户密码再次输入密码注册用户头像
注册用户性别
用户注册取消注册
初始化服务器的IP地址设置服务器端口号
imageList1
16
存储的各种头像图片


(2程序中使用了ComboBox控件和GDI+技术来绘制一个头像的下拉列表。定义控件的IDcomboBox_CPhoto设置DropDownStyleDrawMode的属性,需创建该控件的DrawItem事件,在控件的可视方位更改时触动事件,ImageList1组件中所存储的头像图片绘制到下拉控件中。
(3定义“注册”按钮的IDbutton_OK,创建它的Click事件,输入注册信息后单击该按钮,判断注册的密码是否一致,如果不一致就消息窗体;一致的话就将用户注册的信息通过自定义控件udpSocket1send(方法,将注册信息以二进制流的形式发送给服务器端,由服务器端判断是否注册成功。
(4udpsocketDataArrival事件异步托管,监听获取服务器端返回来的消息。当返回的是注册成功的消息时,关闭注册窗体;当返回的是用户已注册的消息命令,则弹出消息对话框。
4.3用户登录模块设计
用户登录模块主要是将用户输入用户名和密码用来实现登录游戏大厅的功能的窗体,发送消息到服务器端,判断存在该用户时,将返回一个登录成功的消息,通过该消息关闭登录窗口。
4.3.1功能设计
(1输入用户名和密码,单击窗体中的"登录"按钮,实现用户的登录功能。(2登录成功后将会关闭登录窗体,弹出游戏大厅窗体。
4.3.2程序界面
用户注册成功自己的用户信息后,客户端程序弹出登录模块窗体,在窗体中输入已注册好的用户名和密码,单击“登录”按钮,登录游戏大厅模块。登录模块窗体F_Logon的界面如图4-3所示:

4-3用户登录窗体F_Logon界面
17


4.3.3实现过程
用户成功注册信息后,弹出登录界面窗体F_Logon,实现用户登录功能。登录模块大体上功能实现的流程图,如图4-4所示:
客户端
发登录消息
调用UpdateLoginUser(方法登录用户
服务器端
用户登录模块
在数据库表中查找该用
户名和密码
输入用户名和密码
未找到用户?
N
验证成功?
返回验证成功信息

更改该用户未上线状态

游戏大厅模块

4-4用户登录模块流程图
(1新建Windows窗体F_LogonForm界面的Text属性设置为“用户登录”。根据模块功能设计得到窗体设计的主要控件,设置相关的属性值,如表4-2所示:
4-2用户登录模块F_Logon的主要控件
控件类型Button
控件IDbutton_GbOKbutton_GbClose
UDPSocket1
udpSocket1
主要属性设置Text"登录"Text"退出"LocalHost127.0.0.1LocalPort11001
用途用户登录取消注册
初始化服务器的IP地址设置服务器端口号
(2设置“登录”按钮的IDbutton_GbOK,单击该按钮触发一个Click事件。界面加载到IP和端口时,用户输入用户名和密码后,将输入的信息通过控件udpSocket1send(方法以二进制流的形式发送给服务器端,由服务器端根据登录的用户名和密码在数据库进行查找,判断是否存在该用户。
(3udpsocketDataArrival事件异步托管,监听获取服务器端返回来的消息。当返回的是登录成功的消息时,存储服务器返回的IP地址、ID值、用户得分和性别,关闭登录窗体。

18


4.4游戏大厅模块设计
游戏大厅模块是服务器端的功能模块之一,主要用来显示所有在线用户信息、房间信息以及公共聊天信息等。用户可以任意选择房间中的座位,等待另一用户也进入这个桌子,然后开始游戏。
4.4.1功能设计
(1游戏大厅左边窗口显示五子棋房间的导航,以树状结构显示游戏的区域,分为普通区或高手区域的,每个区域下又包含多个房间。
(2游戏大厅的中间窗口显示每个房间内每张桌子的状态信息情况,每个房间有20张桌子,每张桌子仅供两个座位,用户可以自主选择座位进入游戏。
(3游戏大厅的右边窗体分别显示在线用户的状态和公共的聊天窗口,用户查看所有在线用户的状态,发送聊天信息给所有在线用户,窗口保存聊天记录。
(4当用户任意进入一个座位时,弹出对弈窗体,游戏大厅中的座位显示用户头像,表示该用户已占用,进入和退出座位时,显示座位状态。
4.4.2程序界面
用户登录成功后,程序运行弹出游戏大厅窗体,在窗体左侧选择五子棋导航下的任意区域、房间、桌子以及座位进入游戏对弈窗体模块。大厅右侧显示在线用户的信息列表,包括头像、用户名和分数等。大厅右下角显示语聊窗体,发送的语聊信息为所有在线用户所看到。游戏大厅模块窗体Frm_Hall的界面如图4-5所示:

4-5游戏大厅窗体Frm_Hall的界面

19


4.4.3实现过程
用户登录游戏大厅后,自主选择房间座位进入游戏对弈窗体。游戏大厅模块功能实现的流程图,如图4-6所示:
服务器端
客户端
用户登录到游戏大厅
游戏大厅模块
区域
进入游戏大厅
导航区域
用户列表区域
用户列表区域
语聊区域五子棋导航区域
显示当前所有的在线用户信息
更新当前用户为在线状态,将信息显示到用户列表区域中
打开五子棋导航,显示五子棋的区域和房间
发送聊天消息给所有的在线用户
选择房间进入
显示头像、用户分数信息
大厅显示房间内的所有
桌子和座位
选择座位
座位图片填充用户的头像,座位号为用户姓名
进入对弈
退出对弈发送消息个所有在线用户
退出游戏大厅
在用户列表中移除用户信息,并发消息给所有用户
4-6游戏大厅模块流程图
(1新建Windows窗体Frm_Hall。根据模块功能设计得到窗体设计的主要控件,依次添加这些控件,设置相关的属性值,如表4-3所示:
4-3游戏大厅模块Frm_Hall的主要控件
控件类型


控件IDPanel2
20
用途
布局游戏大厅的窗体底色(蓝色


Panel
Panel_TitlePanel1Panel_TreePane3Panel_PublicPanel_DialogB
布局游戏大厅的窗体标题布局游戏大厅的窗体底边框布局游戏大厅的左边窗口布局游戏大厅的右边窗口布局游戏大厅的右边用户状态窗口布局游戏大厅的右边聊天发送窗口
布局游戏大厅的中间的窗口窗体运行时大厅背景图片
发送聊天信息按钮隐藏或显示左边窗体按钮隐藏或显示右边窗体按钮
最大化按钮关闭按钮标签
布局游戏大厅左侧五子棋导航初始化服务器的IP地址:127.0.0.1,
设置服务器端口号:11000
FlowLayoutPanelPictureBox
flowPanel_OpposepictureBox_BackpictureBox_Hair
pictureBox_LApictureBox_RA
Image_MaxImage_Close
LabelTreeViewUDPSocket1
LabeltreeView_AreaudpSocket1
ImageList1imageList1存储的各种头像图片
(2加载游戏大厅界面,背景图片显示整个大厅。调用用户登录窗体,当登录窗体验证成功后,释放登录窗体资源,获取当前窗口IP和端口号,并打开套接字监听。
(3创建控件treeView_AreaNodeMouseDoubleClick事件,用户在“五子棋导航”列表中展开某一区域,双击进入房间,主区域显示房间内的所有在线用户信息。
(4创建GetUserList(方法,并将所有在线用户的头像、用户名、分数显示在窗体右边的用户状态区域。当用户进入游戏大厅时,将用户信息添加到该区域列表中。
(5当用户想要进入某个座位时,创建pictureBox3Click(事件,图片pictureBox3显示当前用户的头像,获取用户信息,将座位名改成用户名。
(6创建聊天记录发送的图片按钮pictureBox_HaiClick(事件,将文本框中的聊天消息发送给所有的在线用户。
(7创建图片按钮Image_MaxImage_MinImage_CloseClick事件,实现最大化、最小化和关闭游戏大厅的操作。创建Image_MinMouseLeaveMouseEnter件,当鼠标移动到按钮上时,图片按钮颜色变浅;鼠标移开时,图片按钮恢复颜色。
(8创建图片pictureBox_LAClick(事件,隐藏左边五子棋导航的区域;创建pictureBox_RAClick(事件,隐藏右边用户信息列表和聊天窗体。
(9创建udpSocket控件的异步托管执行DataArrival事件,对服务器端发送的消息进行监听,实现客户端与远程客户端的通行,根据不同的消息命令,采取对应的操作。

21


4.5对弈窗体模块设计
对弈窗体是双方用户进行下棋的窗体,主要功能是在线的用户在游戏大厅内任意选择一个房间中的桌子进入,弹出对弈窗体,等待另一个用户也进入该桌子,当桌子满两人时,点击“开始”按钮,开始游戏,如果在用户进入前已存在用户,在窗体中显示双方信息。游戏规则是谁先点开始,谁执黑棋。
4.5.1功能设计
(1用户选择桌子进入后,弹出对弈窗体,窗体显示左边窗口显示对弈的棋盘,盘两边分别设置对弈用户的头像;窗体右边显示当前用户的信息,状态以及聊天窗体。
(2当房间人数满2人时,即可开始对弈,游戏规则谁先点开始,谁就执黑棋先行。对弈时在棋盘上实时显示黑白棋子。对弈结束后,高亮显示最后下的棋子。服务器端修改数据库的用户得分。
4.5.2程序界面
当对弈窗体中的用户满两个人的时候,开始按钮变为蓝色,即可开始连接网络,网络连接成功,即可开始对弈,对弈窗体模块Frm_Chessboard的界面如图4-7所示:

4-7对弈窗体Frm_Chessboard的界面
4.5.3实现过程
对弈窗体模块用来实现客户端用户与远程客户端用户通过服务器进行对弈。模块的流程图如图4-8所示:

22


客户端
对弈窗体模块
用户显示在列表中,棋盘右侧显示用户头像和名称,以及棋盒
显示当前用户的信息
和聊天区域
用户可以在聊天区域私聊
等待另一个用户进入
N
是否有两个用户?Y
另一用户显示在列表中,棋盘左侧显示用户头像和名称,以及棋盒
双方点击开始
调用一个ChessClass的类,触发该类中的事件,包括打开连接、关闭连接、信息传递
连接服务器
点击棋盘下棋子
每下一子,就触动算法,查询在横向、竖向、正斜、反斜,该棋子的个数
黑子5个?白子5个?
黑子赢,加10白子赢,加10
更新数据库中的分数
关闭窗体移除用户的信息

4-8对弈窗体模块流程图

23


(1新建Windows窗体Frm_Chessboard。根据模块功能设计窗体的主要控件,依次添加这些控件,设置相关的属性值,如表4-4所示:
4-4游戏大厅模块Frm_Chessboard的主要控件
控件类型Panel
控件IDpanel_CheckPanel_All
PictureBox
pictureBox_Q_LeftpictureBox_LeftpictureBox_Q_RightpictureBox_Right
LabelUDPSocket1
LabeludpSocket1
用途
布局对弈窗体的棋盘布局对弈窗体右边窗口
用户1的棋子用户1的头像用户2的棋子用户2的头像
标签
初始化服务器的IP地址:127.0.0.1,
设置服务器端口号:11000
ImageList1
imageList1~imageList2
存储的各种头像图片
(2创建自定义Client类、ClientObject类和ClientObjectEventArgs类在ChessClass文件中,用于Socket的监听以及自定义事件的设置。自定义Client类主要是用来建立对弈用户的连接、关闭连接和信息的传递;自定义ClientObject类主要是用来创建自定义事件,通过接收的消息的标识判断执行的事件类型。
(3创建GetGameInfo方法,获取对方用户名、头像、分数、性别等信息。(4窗体Frm_Chessboard加载时,即窗体的Shown事件。首先判断另一个座位是否有用户,如果没有用户,在窗体中显示当前用户信息,棋盘右边显示头像、用户名和棋盒,在用户列表中也显示当前用户的信息;如果有检测到用户的话,在窗体的中添加对弈双方的信息,棋盘两边显示对弈双方的信息。创建并打开一个新的主线程,调用StartServer(启动服务。将用户信息发送到服务器端,并启动监听。
(5创建Frm_ChessboardLoad事件,设置窗体的IP地址和端口号。IP地址为127.0.0.1,端口号为11001,由此可以看出该对弈窗体属于客户端模块。
(6创建StartServer(方法启动服务,打开监听,连环接收请求,创建客户端对象,并启动添加对方下的棋子AddChess(、添加对方发来的信息AddMessage(、重新开始AginMessage(、谁先下棋FiDnMessage(服务,客户端接收消息并处理协议。
(7创建asd(方法,当有鼠标点击棋盘上的任意位置时,该方法将会获取棋盘上的坐标值,在该坐标的位置上添加黑白棋子。
(8创建AddChess(方法,调用自定义ChessClass类的handleDownMessage(事件,在棋盘中添加对方下的棋子。
(9AddMessage(ChessClass

24


handleSendMessage(事件,接收对方发来的信息。
(10创建AginMessage(方法,调用自定义ChessClass类的handleAginMessage(事件。判断是否重新开始下棋,调用Agin(方法移除棋盘中的棋子,重新绘制15x15的棋盘,用户即可在棋盘中重新开始下棋。
(11创建FiDnMessage判断谁先下棋,调用ChessClass类的handleFiDnMessage(事件,谁先下棋标示符WhoFisrtDownTrue
(12创建“棋子”pictureBox1Click(事件,当某个棋子图片的集合元素大于4即棋子数位5时,断开连接,发送消息到服务器端。弹出是否关闭窗体的消息框。
(13创建“开始”图片按钮pictureBox2Click事件,点击后,开始按钮为灰色。触发自定义Client类的对弈连接事件,连接服务器。当对连接、准备、开始按钮的操作标识ConnHandle1,尝试连接服务器;对连接、准备、开始按钮的操作标识ConnHandle2时,判断是否重新开始。哪个用户先点击开始,就先启动了监听。
(14发送聊天信息时,可以创建“发送”图片pictureBox_ChartClick(事件,点击发送文本框中的聊天信息,就可以把文本框中的信息发送给对方,并显示在聊天记录窗体中,每发送一条记录,换行显示聊天记录;也可以创建文本框comboBox_HairKeyPress事件,按Enter就可发送信息。
(15创建图片按钮Image_MinImage_CloseClick事件,实现最小化和关闭对弈窗体的操作。创建Image_MinMouseLeaveMouseEnter事件,当鼠标移动到按钮上时,图片按钮颜色变浅;鼠标移开时,图片按钮恢复颜色。
(16创建窗体Frm_ChessboardFormClosing事件,关闭监听、睡眠主线程和关闭子线程,关闭控件的监听。
(17创建Arithmetic(方法,查询横向、竖向、正斜、反斜等方向的棋子,统计这些棋子的个数,分别在添加棋子的方法和添加对方棋子的方法中调用该算法,当本机用户下的棋子个数先达到5个,即可判断本机上的用户胜利;若对方机上的用户下的棋子数先到达五个,则判断远程客户机上的用户胜利。
(18创建Bwin(方法,弹出“黑子赢了,请重新开始游戏!,如果是本机上的执黑子用户赢了,分数加10分,对方减10分;如果是对方机(远程客户端的黑子赢了,对方用户加10分,本机用户执白子,分数就减10分。将对弈双方的分数记录发送到服务器端,并有服务器端将这些信息更新到数据库中。
(19创建Wwin(方法,弹出“白子赢了,请重新开始游戏!,如果是本机上的执白子用户赢了,分数加10分,对方用户减10分;如果是对方机(远程客户端的白子赢了,对方用户加10分,本机用户执黑子,分数就减10分。将对弈双方的分数记录发送到服务器端,并有服务器端将这些信息更新到数据库中。
(20将信息发送给服务器端后,创建自定义udpsocket控件事件中利用DataArrival事件异步托管,监听获取服务器端返回来的消息。根据这些消息判断需要处理的操作。

25


4.6服务器窗体模块设计
服务器窗体模块作为客户端与远程客户端相互通信的一个中转站,用来保存用户的个人信息和对弈信息,设置游戏大厅,客户端与远程客户端的用户进行对弈连接服务器。程序运行时,窗体显示所有已注册用户的信息。
4.6.1功能设计
(1运行服务器端程序,弹出服务器窗体,窗体中显示数据库中已注册的用户IDIP地址、端口、用户名、用户分数和状态等信息。
(2选择“控制台/开始服务”选项,服务器端程序开始服务,服务器端打开UDP协议的监听网络状态,时刻接收者由客户端发送而来消息,对这些消息进行判定,指定相应的窗体或程序代码,如用游戏大厅、对弈窗体的显示、信息的保存等等。
(3选择“控制台/结束服务选项,服务器端结束服务,关闭监听网络状态,服务器端拒绝接收客户端发送而来的消息。
(4选择控制台/分数排名选项,可对服务器端的所有用户成绩进行排名,有从小到大和从大到小两种排序方式。
(5选择控制台/刷新选项,服务器端时刻更新数据库中的信息。(6选择系统/退出选项,退出服务器系统。
4.6.2程序界面
服务器窗体模块主要是用来实现对用户注册数据信息的储存功能,同时监听并接收网络中的消息。服务器窗体模块Frm_Server的界面如图4-9所示:

4-9服务器窗体Frm_Server界面

26


4.6.3实现过程
服务器窗体模块设计的功能流程图如图4-10所示:
服务器端
服务器窗体模块
控制台系统
退出
开始服务
分数排名
刷新
从小到大
关闭服务器端
打开网络监听,接收
发送来的消息
从大到小
从数据库中将信息更新到窗体中
创建UdpSocket的异步托管DataArrival事件,处理消息

4-10服务器窗体模块流程图
(1新建Windows窗体Frm_ServerForm界面的Text属性设置为“网络五子棋服务器”。体设计的主要控件如表4-5所示,依次添加这些控件,设置相关属性值。
4-5服务器窗体Frm_Server的主要控件
控件类型UDPSocket1
控件IDudpSocket1
属性设置
LocalHost127.0.0.1LocalPort11000
ListViewmenuStrip1
LV_SysUsermenuStrip1
编辑列(IDIP地址等
功能描述
初始化服务器的IP地址设置服务器端口号实现数据表信息的显示
添加"开始服务"“分数排名”“刷新”等编辑项
(2定义“控制台/开始服务(结束服务”选项IDTool_Open,创建它的Click事件。开始服务时,选项字样变为结束服务”,服务器端打开UDP协议的监听网络状态,时刻接收者由客户端发送而来消息。结束服务时,选项字样变为“开始服务”,关闭监听网络状态,服务器端拒绝接收客户端发送而来的消息。
(3定义“控制台/分数排名”选项为IDTool_Arrange,有从小到大Tool_SB和从大到小Tool_BS两种子菜单。对服务器端窗体中的所有用户成绩进行排名,分别创建

27


排序方式的Click事件。选择从小到大,服务器端对用户分数从小到大排名;反之,分数从大到小排列。单击从小到大方式,系统会在该方式之前打“√,如果之前已选择了从小到大的方式,系统会先取消在从小到大的“√”
(4定义“控制台/刷新”选项的IDTool_Refurbish,创建Click事件。服务器端调用UpdateUser(方法,将数据库中的最新的用户信息,更新到服务器的窗体中。
(5定义“系统/退出”选项的IDTool_Close,创建Click事件。服务器端调用Close(方法,关闭服务器端的窗体。
(6开始服务后,创建udpSocket控件执行异步托管的DataArrival事件,监听客户端发送来的消息,服务器端将消息转化为二进制流后,根据这些消息的发送类型、命令类型来判断调用该什么样的函数处理方法来进行程序的操作。

28

延陵学院毕业设计说明书

5网络五子棋游戏的算法设计
网络五子棋游戏系统的核心技术体现在客户端的对弈窗体模块中如何确定棋盘、如何判断五个棋子连在一条直线上,直线可以是横向的、竖向的、正斜的或是反斜的。1.棋盘和棋子
系统设计棋盘大小为15x15,定义数组note=newint[15,15]来记录棋子的摆放位置。窗体加载时,使用For循环语句绘制棋盘,并将每个数组位置赋初始值-1。同时,定义鼠标点击位置的XY坐标,即Mouse_XMouse_Y。当有棋子落在数组中,即棋盘中,根据棋子落下的坐标都减30再乘以35,然后取整,得到行Row、列Column。绘制棋子的相对于棋盘上的每个角的上、下、左、右四个坐标。棋盘的标志位置绘制在四个坐标的中心位置。棋子的大小为30x30,并调整为适合棋盘的大小。类型标识符BBow自加,当BBow除以2的余数为1时,在棋盘中绘制棋子的地方填充黑子,棋盘标志在棋子的中心;BBow除以2的余数为0时,在棋盘中绘制棋子的地方填充白子,棋盘标志在棋子的中心。最后将棋子的坐标值赋值给bw,黑子为0,白子为1。调用算法Arithmetic(查询棋子的数目,谁先达到五颗棋子时,这一方胜利。最后调用Bwin(法和Wwin(方法,更新用户得分。2.算法
两个用户对弈的时候创建Arithmetic(算法,查询横向、竖向、正斜、反斜等方向的棋子,统计棋子的个数。当第一颗棋子落下时,绘制好棋子后,将绘制该棋子的标识符bwrowcolumn三个参数带入Arithmetic(方法,作为该算法的参数nArowAcolumn。此时已有棋子落下,Bcount的值为1。赢棋的标志Ckind初始值为-1
(1横向查找:定义横向查找的方向标志:向左方向Lbol和向右方向Rbol。向左查询时,循环5次查询该棋子所在的行上向左的每一列的数组note[Arow,Acolumn-i]的值是否为n,是的话Bcount的值就自加1;否则停止向左查询。向右查询时,循环5次查询该棋子所在的行上向右的每一列的数组note[Arow,Acolumn+i]的值是否为n,也就是bow,是的话Bcount的值就自加;否则停止向右查询。
(2竖向查找:定义竖向查找的方向标志:向上方向Ubol和向下方向Dbol。向上查询时,循环5次查询该棋子所在的列上向上的每一行的数组note[Arow+i,Acolumn]的值是否为n,是的话Bcount的值就自加1;否则停止向上查询。向下查询时,循环5次查询该棋子所在的列上向下的每一行的数组note[Arow-i,Acolumn]的值是否为n,是的话Bcount的值就自加;否则向下查询。
(3正斜查找:定义正斜查找的方向标志:向左下角方向Lbol和向右上角方向Rbol

29


向左下角查询时,循环5次查询该棋子所在的左下角的每一个坐标数组note[Arow-i,Acolumn-i]的值是否为n,是的话Bcount的值就自加1;否则停止向左查询。向右上角查询时,循环5次查询该棋子所在的右上角每一个数组note[Arow+i,Acolumn+i]的值是否n,是的话Bcount的值就自加1;否则停止向右上角查询。
(4反斜查找:定义反斜查找的方向标志:向左上角方向Lbol和向右下角方向Rbol5note[Arow-i,Acolumn+i]的值是否为n,是的话Bcount的值就自加;否则停止向左上角查询。向右下角查询时,循环5次查询该棋子所在的右下角每个数组note[Arow+i,Acolumn-i]的值是否为n,是的话Bcount的值就自加;否则停止向右查询。
Bcount的值为5时,判断n的值,n0时黑子赢;n1时白子赢。该算法的运行流程图如图5-1所示:
客户端
调用Arithmetic(
法,统计棋子个数
绘制棋盘
有棋子落下
Bcount=1
查询方向?
横向
竖向
正斜
反斜
查询方向查询方向
向左下角
查询方向查询方向
向左向右向上向下向右上角向左上角向右下角
查询note[Arow,Acolumn+i]的值查询note[Arow+i,Acolumn]的值查询note[Arow-i,Acolumn-i]的值查询note[Arow-i,Acolumn-i]的值
查询note[Arow+i,Acolumn-i]的值
查询note[Arow,Acolumn-i]的值查询note[Arow-i,Acolumn]的值查询note[Arow+i,Acolumn+i]的值
N
数组值=n
n=0
YBcount++
Y
Y黑子赢
白子赢N
停止查询
N
Bcount=5
调用Bwin(方法
调用Wwin(方法

5-1Arithmetic(算法的运行流程图

30



6网络五子棋游戏的系统测试
本次毕业设计主要设计包括用户注册模块、用户登录模块、游戏大厅模块、对弈窗体模块和服务器窗体模块等五大模块的设计。所以软件系统的测试也主要集中在这几个模块上,主要测试的问题就是各个模块界面的设计和程序运行的结果是否达到了预期设计的目标。网络五子棋游戏软件的系统测试过程如下:1.用户注册模块
测试目标:用户输入注册信息,可以注册信息到数据库表中。
运行注册模块程序,在程序界面中输入要注册的IP地址、端口号、用户名、密码等信息后,选择“注册”按钮。显示数据库信息的服务器端窗体中添加了新注册的用户信息,程序关闭注册窗体,弹出登录窗体,表示注册模块设计系统测试成功。2.用户登录模块
测试目标:用户输入用户名和密码,登录到游戏大厅模块。
运行登录模块程序,在界面中输入要测试的用户名和密码,前提是这个用户已经成功注册信息到数据库中,然后选择“登录”按钮,程序关闭登录窗体,弹出游戏大厅模块的界面,则表示登录模块的系统测试成功。3.游戏大厅模块
测试目标:选择任意房间进入,显示用户状态;进入座位可弹出对弈窗体模块。运行游戏大厅模块程序,选择任意区域下的房间进入,用户列表显示当前所有在线用户的信息,同时在数据库窗体中把该用户的状态改为上线状态。选择任意座位进入,弹出对弈窗体界面,界面中显示当前用户的个人信息,游戏大厅模块的系统测试成功。4.对弈窗体模块
测试目标:两个用户开始游戏,棋盘实时显示棋子,最后高亮显示获胜棋子。运行对弈窗体模块程序,等待另一用户进入该桌子后,点击“开始”按钮连接服务器。棋盘上显示连个客户端用户的棋子,最后获胜的一方棋子高亮显示,表示对弈窗体模块的系统测试成功。5.服务器窗体模块
测试目标:窗体显示数据库表中的信息,可以对用户分数进行排名。
运行服务器端窗体程序,程序已连接数据库,界面中始终显示数据库中的各个用户信息;选择分数排名时,用户信息随着分数的排名而变化着。

31



7结论
本次毕业设计使用C#开发语言,结合使用MicrosoftVisualStudio2010MicrosoftSQLServer2008开发环境,设计出一款基于C/S模式的网络五子棋游戏软件,软件设计由UDP网络编程和Socket套接字实现。由于本系统是基于C/S模式的,所以系统的组成就包含两部分——客户端和服务器端。客户端的主要功能是能够实现用户登录服务器,确定房间坐席,进行对弈的功能。所以客户端的功能模块设计可以大体分为三个模块:用户注册模块、用户登录模块和对弈窗体模块。而服务器端实现的功能主要是保存用户的个人信息,包含注册信息和对弈信息,设置游戏大厅窗体,与客户端的对弈连接,判断对弈胜负等等。按照这些功能可以把服务器端的功能模块设计分为两个个主要模块:游戏大厅模块和服务器窗体模块。
用户首先进入客户端的用户注册模块,判断用户是否注册过,如果是第一次登录五子棋游戏软件的用户,应该先进入用户注册模块填写需要注册个人的信息,包括IP地址、端口号、用户名、密码、头像和性别等信息。然后将这些注册消息通过UDPSocket控件的Send(方法发送给服务器端,服务器端的程序监听并处理这些消息,如果服务器端在数据库中也未找到该用户名,则表示该用户可以注册成功,服务器返回注册成功消息,然后系统关闭注册界面,弹出用户登录模块的界面;如果服务器端返回注册失败消息,系统则显示注册模块界面,要求重新注册用户信息。
用户进入客户端的登录模块时,输入用户名和密码,程序代码将用户登录信息通UDPSocket控件的Send(方法发送给服务器端,服务器端代码查找数据库,判断是否存该用户,如果已存在,则说明该用户是已注册过的,服务器端返回登录成功消息后,系统自动关闭用户登录模块界面,弹出游戏大厅模块界面;如果返回登录失败消息,系统则显示登录模块界面,要求用户重新登录。
用户登录服务器端的游戏大厅模块后,界面实时显示所有在线用户的列表信息,在窗体右下角的聊天室内聊天,信息发送给所有的在线用户。窗体左侧显示五子棋的导航,用户选择想要进入的区号、房间、桌子以及座位后,将消息发送给服务器端,由服务器端代码判断是否可以进入对弈窗体模块。
用户进入客户端的对弈窗体模块后,等待另一用户(远程客户端进入桌子,谁先点开始按钮,谁就执黑棋先行。在棋盘中添加显示本机用户的棋子和远程用户的棋子,在下棋过程中调用算法查询棋子的个数,当一方的棋子个数先达到五个时,程序判断该用户胜利。同时判断是黑子赢了,还是白子赢了。调用方法给用户双方修改得分。记录对弈双方的最新信息,发送到服务器端,由服务器端将新的得分更新的数据库中,并在服务器窗体中显示最新用户信息。

32



致谢
光阴荏苒,眼看着为期几个月的毕业设计即将结束,这也意味着我的大学生活也走到了尾声。我觉得这次的毕业设计说明书不仅仅是要求让我们对大学四年来所学的知识做一次系统的总结,更是想让我们对这四年的肆意快活的时光做最后的告别。
首先,我要感谢我的毕业设计指导老师钱诚钱老师,您用您丰富的教学知识在大四的上半学期指导我们班的《计算机控制技术》和《ARM嵌入式开发实例》这两门专业课程。真心的谢谢您在我编程设计的时候,详细地为我讲述了我此次毕业设计课题的研究方向、需求分析、功能设计和模块设计等方面的内容。感谢您在我遇到无法解决的问题和困难的时候,无私地为我们挤出闲暇时间,不辞辛劳的为我们讲解难点,帮助我们解决设计中的困难。
感谢当初指导我们班学习C#语言的游庆祥游老师,感谢您带领我走进C#语言编程的世界,教导了我们很多的C#语言编程知识。
感谢为我们审阅论文和毕业答辩的老师们,感谢你们在这最繁忙的日子里抽出宝贵的时间来指导我!指出我论文和答辩的不足,谢谢你们的教导。
感谢和我同组的同学们,陈玲、丁琪、季青、丁桂钧和戴志立同学,感谢你们和我一起在图书馆不辞辛苦地查阅各种编程资料,一起讨论编程,解决简单的问题。
感谢10Y班的辅导员和所有同学,感谢406的舍友们。谢谢你们这四年的陪伴,我们一起学习、一起生活,我相信这样的时光将会成为我未来生活中的美好回忆之一。
33



参考文献
[1]童爱红(.VisualC#.NET应用教程[M].北京:清华大学出版社.2004:1518,283292[2]JasonPrice(,邱仲潘(.C#数据库编程[M].北京:电子工业出版社:2003:1518[3]曹祖圣(.VisualC#.NET程序设计经典[M].北京:科学出版社.2004:137163
[4]微软公司,东方人华(.C#编程技术[M].北京:清华大学出版社.2001:1518,333340[5]谢希仁(.计算机网络(5[M].北京:电子工业出版社.2008:110128,180188[6]唐学忠,费贤举(.VisualBasic程序设计教程[M].北京:中国电力出版社.2008:234300[7]张海藩,倪宁(.软件工程(3[M].北京:人民邮电出版社.2010:4162[8]温怀玉,陈长忆(.C#技术开发综合应用[M].北京:清华大学出版社.2010[9]刘玉宝(.C#实用开发教程[M].北京:清华大学出版社.2008[10]雷之宇(.C#语言实用教程[M].北京:人民铁道出版社.2004[11]吴财军(.C#经典范例50[M].北京:北京希望电子出版社.2003
[12]马俊,郑逢斌,沈夏炯(.C#网路编程应用高级编程[M].北京:人民邮电出版社:2006
[13]郎锐编(.VisualC++网络通信程序开发基础及实例分析[M].北京:机械工业出版社.2006:3255
[14]唐学忠,李亦飞(.SQLServer2005数据库教程(第二版[M].北京:电子工业出版社.2011:220250
[15]张跃廷,许文斌,王小科(.C#数据库系统开发完全手册[M].北京:人民邮电出版社.2006[16],,,(.C#[M].:.2004:242287
[17]汪兵等(.WindowsCE嵌入式高级编程及其实例详解[M].北京:中国水利水电出版.2008:1518,422434
[18]郭胜(.C#.NET程序设计教程[M].北京:清华出版社.2002


34


附录
部分代码:
//************注册用户********/
privatevoidRegisterUser(ClassMsgmsg,System.Net.IPAddressIp,intPort{
if(IfRegisterAt(msg,Ip,Port==false//如果用户未注册{
msg=InsertUser(msg,Ip,Port;}}
//*********插入注册用户信息********/
privateClassMsgInsertUser(ClassMsgmsg,System.Net.IPAddressIp,intPort{
ClassOptionDataOptionData=newClassOptionData(;MsgCommandSate=msg.msgCommand;StringUserName=msg.UserName;StringPassWord=msg.PassWord;StringvIP=Ip.ToString(;intCPhot=msg.CPhoto;intSex=msg.Sex;

//向数据表中添加注册信息OptionData.ExSQL("insertPort.ToString(
+
",'"
+
UserName
+
into"','"
+
PassWord
tb_Gobang+
"',"
+
(IP,Port,UserName,PassWord,State,Caput,Sexvalues('"+vIP+"',"+
Convert.ToString((int(MsgCommand.Registered+","+CPhot+","+Sex+"";
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_Gobang";UpdateUser(;







//更新用户列表
//将注册命令返回给注册用户
msg.msgCommand=MsgCommand.Registered;//用户注册结束命令SendMsgToOne(Ip,Port,msg;returnmsg;}
//*********更改登录用户********/
privateClassMsgUpdateLoginUser(ClassMsgmsg,System.Net.IPAddressIp,intPort{

35


//注册用户的名称//注册用户的密码//注册用户的IP地址//注册用户的头象//用户的性别





ClassOptionDataOptionData=newClassOptionData(;//创建并引用ClassOptionDataMsgCommandmsgState=msg.msgCommand;StringUserName=msg.UserName;StringPassWord=msg.PassWord;StringvIP=Ip.ToString(;





//获取接收消息的命令//登录用户名称//用户密码//用户IP地址
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_Gobang+"'"+PassWord+"'";
if(DataReader.HasRows{
DataReader.Read(;






//读取查找到的记录//获取当前用户的分数//获取当前用户性别Set
State
=
"
+
stringID=Convert.ToString(DataReader.GetInt32(0;//获取第一条记录的IDmsg.Fraction=DataReader.GetInt32(5;msg.Sex=DataReader.GetInt32(13;OptionData.ExSQL("Update

tb_Gobang



//在数据库中通过用户名和密码进行查找


//如果查询到该用户
WhereUserName="+"'"+UserName+"'"+"andPassWord="
Convert.ToString((int(MsgCommand.Logined+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+"'"+"WhereID="+ID;//修改当前记录的标识为上线状态
msg.msgCommand=MsgCommand.Logined;//设置为上线命令SendMsgToOne(Ip,Port,msg;//将消息返回给发送用户UpdateUser(;//更新用户列表}
returnmsg;}
//*******更新用户列表********/privatevoidUpdateUser({
ClassOptionDataOptionData=newClassOptionData(;
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_Gobang"+fellin;











//查询返回一个SqlDataReader//清除数据列表的信息
LV_SysUser.Items.Clear(;boolDRbool=false;if(DataReader.HasRows{
DRbool=DataReader.Read(;while(DRbool

36
//返回


{//添加数据库用户的信息到用户列表中
ListViewItemlistItem=newListViewItem(;
listItem.Text=Convert.ToString(DataReader.GetInt32(0;listItem.SubItems.Add(DataReader.GetString(1;listItem.SubItems.Add(DataReader.GetString(2;listItem.SubItems.Add(DataReader.GetString(3;
listItem.SubItems.Add(Convert.ToString(DataReader.GetInt32(5;listItem.SubItems.Add(Convert.ToString(DataReader.GetInt32(6;LV_SysUser.Items.Add(listItem;DRbool=DataReader.Read(;
}
DataReader.Dispose(;
}}
//*******发送消息给单用户*********/
privatevoidSendUserMsg(ClassMsgmsg,System.Net.IPAddressIp,intPort{
ClassOptionDataOptionData=newClassOptionData(;
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_GobangWhereID="+msg.RID;//查询返回一个SqlDataReader
DataReader.Read(;
stringip=DataReader.GetString(1;intport=DataReader.GetInt32(2;

udpSocket1.Send(IPAddress.Parse(ip,
ClassSerializers(.SerializeBinary(msg.ToArray(;DataReader.Dispose(;}
//************更改游戏中的用户状态*******/
privateClassMsgUpdateUser(ClassMsgmsg,System.Net.IPAddressIp,intPort,MsgCommandNsign{
ClassOptionDataOptionData=newClassOptionData(;//创建并引用ClassOptionDataMsgCommandmsgState=msg.msgCommand;//获取接收消息的命令StringvIP=Ip.ToString(;//用户IP地址StringUname="";

37
//释放SqlDataReader对象







//读取IP地址//读取端口号
new
port,




//发送数据到服务器端
//释放SqlDataReader对象


SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_GobangWhereIP="+"'"+vIP+"'";//在数据库中通过IP进行查找if(DataReader.Read({
Uname=DataReader.GetString(3;MsgCommandmsgCsign=Nsign;
stringID=Convert.ToString(DataReader.GetInt32(0;//获取第一条记录的IDif(msg.msgCommand==MsgCommand.ComeToHall||msg.msgCommand==MsgCommand.BeginToGame{
if(msg.msgCommand==MsgCommand.ComeToHall{
msgCsign=MsgCommand.ComeToHallL;//发送信息给单个用户
OptionData.ExSQL("Updatetb_GobangSetState="+Convert.ToInt32(Nsign+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+"',Borough="+Convert.ToInt32(msg.AreaMark+",RoomMark="+Convert.ToInt32(msg.RoomMark+"WhereID="+ID;}
if(msg.msgCommand==MsgCommand.BeginToGame//开始游戏{
msgCsign=MsgCommand.BeginToGameL;
//更改用户状态
OptionData.ExSQL("Update"',Borough
=
"
+
tb_Gobang
Set+
State"
=
"
++
Convert.ToInt32(Nsign+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+
Convert.ToInt32(msg.AreaMark
,RoomMark="
Convert.ToInt32(msg.RoomMark+",DeskMark='"+msg.DeskMark+"',SeatMark='"+msg.SeatMark+"',UserCaption='"+msg.UserCaption+"'WhereID="+ID;}}else{
if(msg.msgCommand==MsgCommand.ExitToHall||msg.msgCommand==MsgCommand.EndToGame{
if(msg.msgCommand==MsgCommand.ExitToHall//退出游戏大厅

38
//读取查找到的记录
//修改当前记录的标识为上线状态
//更改用户状态


OptionData.ExSQL("Updatetb_GobangSetState="+
Convert.ToInt32(Nsign+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+"',Borough=0,RoomMark=0,DeskMark='0',SeatMark='0'"+"WhereID="+ID;if(msg.msgCommand==MsgCommand.EndToGame{
msgCsign=MsgCommand.EndToGameL;OptionData.ExSQL("Update
tb_Gobang
Set
State
=
"
+
Convert.ToInt32(MsgCommand.BeginToGame+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+"',DeskMark='0',SeatMark='0'"+"WhereID="+ID;//更改用户状态}}else{
OptionData.ExSQL("UpdateWhereID="+ID;//更改用户状态}}
if(msg.msgCommand==MsgCommand.ExitToHall{
msg.msgCommand=MsgCommand.Close;SendMsgToOne(Ip,Port,msg;}else{
msg.msgCommand=msgCsign;
msg.sendKind=SendKind.SendCommand;SendMsgToOne(Ip,Port,msg;}
DataReader.Dispose(;FurbishMsg(msg;}returnmsg;}

39
tb_GobangSetState="+
Convert.ToInt32(Nsign+",IP="+"'"+vIP+"',Port="+"'"+Port.ToString(+"'"+"
//用户退出大厅
//将消息返回给发送用户



//将消息返回给发送用户//释放资源//恢复命令




MessColley(msg,Ip,Port,Nsign;//应有一个群发的方法


//*********将信息发送给所有用户**********/
privatevoidMessColley(ClassMsgmsg,System.Net.IPAddressIp,intPort,MsgCommandNsign{
MsgCommandMsgSign=newMsgCommand(;MsgSign=Nsign;
if(Nsign==MsgCommand.ComeToHall
MsgSign=MsgCommand.ComeToHallH;if(Nsign==MsgCommand.BeginToGame
MsgSign=MsgCommand.BeginToGameH;if(Nsign==MsgCommand.EndToGame
MsgSign=MsgCommand.EndToGameH;
ClassOptionDataOptionData=newClassOptionData(;//创建ClassOptionData对象boolDRbool=false;
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_Gobangwhere(State>="+Convert.ToInt32(MsgCommand.Logining+"andState<="+Convert.ToInt32(MsgCommand.ExitToArea+"";//and(IP<>'"+Ip.ToString(+"'";
if(DataReader.HasRows{
DRbool=DataReader.Read(;while(DRbool{
msg.msgCommand=MsgSign;
SendMsgToOne(IPAddress.Parse(DataReader.GetString(1,Convert.ToInt32(DataReader.GetString(2,msg;DRbool=DataReader.Read(;}
DataReader.Dispose(;}
UpdateUser(;//更新用户列表}
//********向所有在线用户发送进入大厅及游戏的用户信息********//privatevoidUpdateUserList(ClassMsgmsg,System.Net.IPAddressIp,intPort{
ClassUsersUsers=newClassUsers(;

40
//群发给所有在线用户


ClassOptionDataOptionData=newClassOptionData(;
SqlDataReaderDataReader=OptionData.ExSQLReDr("Select*Fromtb_Gobangwhere(State>="+Convert.ToInt32(MsgCommand.BeginToGame+"andState<="+Convert.ToInt32(MsgCommand.ExitToArea+"";//查询进入大厅,或开始游戏的对象
while(DataReader.Read({
ClassUserInfoUserItem=newClassUserInfo(;//创建并引用ClassUserInfoUserItem.UserID=Convert.ToString(DataReader.GetInt32(0;//记录用户用编号UserItem.UserIP=DataReader.GetString(1;UserItem.UserPort=DataReader.GetString(2;

UserItem.UserName=DataReader.GetString(3;

//记录用户的IP地址

//记录端口号//记录用户名称





//遍历所有用户
UserItem.Fraction=Convert.ToString(DataReader.GetInt32(5;//当前分数UserItem.State=Convert.ToString(DataReader.GetInt32(6;//记录当前状态UserItem.Borough=Convert.ToString(DataReader.GetInt32(7;UserItem.RoomMark=Convert.ToString(DataReader.GetInt32(8;==Convert.ToInt32(MsgCommand.BeginToGame
{
UserItem.DeskMark=DataReader.GetString(9;UserItem.SeatMart=DataReader.GetString(10;}
UserItem.Caput=Convert.ToString(DataReader.GetInt32(12;UserItem.Sex=Convert.ToString(DataReader.GetInt32(13;Users.add(UserItem;}
//将用户列表写入到二进制流中
msg.Data=newClassSerializers(.SerializeBinary(Users.ToArray(;msg.msgCommand=MsgCommand.UserList;DataReader.Dispose(;
msg.msgCommand=MsgCommand.UserList;
//udpSocket1.Send(Ip,Port,newClassSerializers(.SerializeBinary(msg.ToArray(;MessColley(msg,Ip,Port,msg.msgCommand;}

41
//区号//房间号
if(msg.msgCommand==MsgCommand.BeginToGame||DataReader.GetInt32(6



//桌号//坐位号//用户名//头像//性别
UserItem.UserCaption=DataReader.GetString(11;
//将单用户信息添加到用户列表中
//群发

本文来源:https://www.2haoxitong.net/k/doc/2a67c47da5e9856a561260b7.html

《C#毕业设计说明书--网络五子棋游戏的设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式