![《C#网络应用编程》课程设计_第1页](http://file4.renrendoc.com/view/ed9a78998b6c494152d813760a5334ae/ed9a78998b6c494152d813760a5334ae1.gif)
![《C#网络应用编程》课程设计_第2页](http://file4.renrendoc.com/view/ed9a78998b6c494152d813760a5334ae/ed9a78998b6c494152d813760a5334ae2.gif)
![《C#网络应用编程》课程设计_第3页](http://file4.renrendoc.com/view/ed9a78998b6c494152d813760a5334ae/ed9a78998b6c494152d813760a5334ae3.gif)
![《C#网络应用编程》课程设计_第4页](http://file4.renrendoc.com/view/ed9a78998b6c494152d813760a5334ae/ed9a78998b6c494152d813760a5334ae4.gif)
![《C#网络应用编程》课程设计_第5页](http://file4.renrendoc.com/view/ed9a78998b6c494152d813760a5334ae/ed9a78998b6c494152d813760a5334ae5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#网络应用编程院(系): 专业班级:姓名: 学号: 组员: 日期: 成绩: 一、课程设计目标通过C#网络编程的课程设计,能够增强我们对C#网络编程的认识,更加牢固的掌握网络编程的相关知识.综合运用学习到的理论知识,提高实践能力.通过小组讨论形式对任务进行分解,提出实现方案,制定计划,小组成员分工协作,共同完成课程设计题目,培养团队合作能力。课程设计期间,通过对问题的分析查找资料,培养资料查询以及运用现代信息技术获取相关信息并进行归纳总结的基本能力。与同学讨论,互相学习,提升个人学习能力。二、课程设计内容1课程设计的内容1.1参考《C#网络应用编程实验指导与开发实例》,编写一个网络对战五子棋游戏,简单的实现网络对战五子棋游戏的基本功能。1。2由于和小组成员分工合作,本人负责客户端方面代码。因此,本课程设计报告主要涉及服务器端的内容。并且把重点放在了线程管理,服务器如何管理多个玩家,服务器和客户端如何进行通信等等。2原理介绍(服务器与客户端通信描述)网络编程的关键是服务器和客户端如何通信,当服务器和客户端建立连接后,服务器或客户端当接收到对方发送过来的信息后要,对接收的信息做出反应。为了让通信双方都能理解对方发送过来的信息含义,必须事先规定每条信息的格式以及信息的含义,在本例中,规定任何一条信息,都必须以命令开头,命令后面跟上需要的参数.命令和参数以及各参数之间均用逗号分隔.这样接收方接收到信息后,才能理解,并且根据参数可作出相应的反应。3开发环境及技术介绍3。1开发环境:MicrosoftVisualStudio2008MicrosoftVisualStudio2008是面向WindowsVista、Office2007、Web2.0的下一代开发工具,代号"Orcas",是对VisualStudio2005一次及时、全面的升级。VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。使用VisualStudio2008可以高效开发Windows应用.设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。同时VisualStudio2008支持项目模板、调试器和部署程序。VisualStudio2008可以高效开发Web应用,集成了AJAX1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。3.2引用命名空间以及相关类命名空间:除了一些基本的,本例中还引用了一些其他的命名空间,如下:System.IO命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型System。Net。Sockets命名空间为需要严密控制网络访问的开发人员提供了WindowsSockets(Winsock)接口的托管实现。TcpClient、TcpListener和UdpClient类封装有关创建到Internet的TCP和UDP连接的详细信息.System.Threading用于多线程编程,对线程进行管理,如创建线程、启动线程、终止线程、合并线程等等.System。Net该命名空间为Internet网络上使用的多种协议提供了方便的编程接口,利用这个命名空间提供的类,不需要考虑所使用协议的具体细节,就能很快实现具体功能.System.Windows.Forms命名空间包含用于创建基于Windows的应用程序的类,以充分利用MicrosoftWindows操作系统中提供的丰富的用户界面功能相关类:BinaryReader类,用特定的编码将基元数据类型读作二进制值。BinaryWriter类,以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。TcpListener类,侦听来自TCP网络客户端的连接。Thread类,创建并控制线程,设置其优先级并获取其状态。IPaddress类,提供网际协议(IP)地址。IPEndPoint类,将网络端点表示为IP地址和端口号。界面设计:使用的控件:(1)两个button负责启动和终止服务。(2)listBox显示客户状态信息以及服务器与客户端通信的内容。(3)两个textBox控件,分别控制游戏室允许进入的最多人数和游戏室同时开出的房间数。整体界面如图所示叫服务雌 占II百芭1^, 」上1口:1口3tBs田七曰七1二j □ 白游戒室允许进入的最多人数(1-300): 启动服务 停止服务游戏室同时开出的房间数(1-1加);4服务器端主要代码介绍运行VS,新建一个名为GobangServer的Windows应用程序项目。4。1添加一个User。cs类,表示所有连接到服务器的客户。代码如下:usingSystem;usingSystem.Collections。Generic;usingSystem。Linq;usingSystemoText;usingSystemoNet。Sockets;usingSystem」。;namespaceGobangServerclassUser{publicreadonlyTcpClientclient;publicreadonlyStreamReadersr;publicreadonlyStreamWritersw;publicstringuserName;publicUser(TcpClientclient){this.client=client;this。userName="";NetworkstreamnetStream=client。GetStream();sr=newStreamReader(netStream,System。Text。Encoding。Default);sw=newStreamWriter(netStream,System.Text.Encoding。Default);}}}4。2添加一个名为Player。cs的类,表示坐在游戏桌两边的玩家,代码如下:usingSystem;usingSystemoCollections。Generic;usingSystem.Linq;usingSystemoText;namespaceGobangServerclassPlayerprivateUseruser;publicUserGameUser{get{returnuser;}set{user=value;}}privateboolstart;publicboolStart{get{returnstart;}set{start=value;publicPlayer(){start=false;user=null;}}}4。3添加一个名为GobangBoard.cs的类,表示棋盘,代码如下:usingSystem;usingSystem.Collections。Generic;usingSystem.Linq;usingSystem.Text;namespaceGobangServer{classGobangBoard{publicconstintNone=-1;//无棋子publicconstintBlack=0;//黑色棋子publicconstintWhite=1;//白色棋子privateint[,]grid=newint[15,15];//15*15的方格///<summary〉///棋盘///</summary〉publicint[,]Gridget{returngrid;}}privateintnextIndex;publicintNextIndex ///应该黑方放棋子还是白方放棋子{get{returnnextIndex;}set{nextIndex=value;}}publicGobangBoard()//构造函数{InitializeBoard();}publicvoidInitializeBoard()///将15*15的方格中的每个交叉点均设置为无棋子for(inti=0;i<=grid.GetUpperBound(0);i++){for(intj=0;j〈=grid。GetUpperBound(1);j++){grid[i,j]=None;}}nextIndex=Black;}publicboolIsExist(inti,intj)///判断放棋子的位置是否已有棋子{if(grid[i,j]!=None){returntrue;}else{returnfalse;}}publicboolIsWin(inti,intj)///判断棋子落下后是否获胜{〃与方格的第ij交叉点向四个方向的连子数,依次是水平,垂直,左上右下,左下右上int[]numbers=newint[4];numbers[0]=GetRowNumber(i,j);j);numbers[1]=GetColumnNumber(i,j);{{{{numbers[2]=GetBacklashNumber(i,j);numbers[3]=GetSlashNumber(i,j);for(intk=0;k〈numbers.Length;k++)//检查是否获胜{if(Math。Abs(numbers[k])==5){returntrue;}}returnfalse;}///判断横向相同颜色的棋子个数privateintGetRowNumber(inti,intj){intnum=1;//连子个数intx=i+1;//向右检查while(x〈15){if(grid[x,j]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;x++;}else}}break;}}x=i-1;//向左检查while(x>=0){if(grid[x,j]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;x ;}else{break;}}returnnum;}privateintGetColumnNumber(inti,intj)///判断纵向相同颜色的棋子个数{intnum=1;//连子个数inty=j+1;//向下检查while(y〈15){if(grid[i,y]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;y++;}else{break;}}//向上检查y=j—1;while(y>=0){〃前方棋子与j点不同时跳出循环if(grid[i,y]==grid[i,j]){num++;y--; }else{break;}}returnnum;}//判断左上到右下相同颜色的棋子个数privateintGetBacklashNumber(inti,intj){intnum=1;//连子个数intx=i+1;//右下方向inty=j+1;while(x<15&&y〈15){if(grid[x,y]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;x++;y++;else{break;}}〃左上方向(x-,y-)x=i—1;y=j—1;//不超出棋格while(x>=0&&y〉=0){if(grid[x,y]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;x—-;y--;}else{break;}}returnnum;}privateintGetSlashNumber(inti,intj)//判断左下到右上相同颜色的棋子个数{intnum=1;//连子个数intx=i-1;inty=j+1;while(x>=0&&y<15)}}}}if(grid[x,y]==grid[i,j])〃前方棋子与ij点不同时跳出循环{num++;x——;y++;}else{break;}}x=i+1;y=j—1;while(x<15&&y>=0){〃前方棋子与ij点不同时跳出循环if(grid[x,y]==grid[i,j]){num++;x++;y——;}else{break;}}returnnum;}}}添加一个名为Service.cs的类,代码如下:usingSystem;usingSystem.Collections。Generic;usingSystem。Linq;usingSystem。Text;usingSystem。Windows.Forms;usingSystem。Net.Sockets;usingSystem。IO;namespaceGobangServer{//显示或发送信息classService{privateListBoxlistbox;privatedelegatevoidAddListBoxItemCallback(stringstr);privateAddListBoxItemCallbackaddListBoxItemCallback;publicService(ListBoxlistbox){this。listbox=listbox;addListBoxItemCallback=newAddListBoxItemCallback(AddListBoxItem);}publicvoidAddListBoxItem(stringstr)〃比较调用AddListBoxItem方法的线程和创建listBox的线程是否为同一个线程if(listbox。InvokeRequired==true{listbox。Invoke(addListBoxItemCallback,str);}else{if(listbox。IsDisposed==false{listbox。Items.Add(str);listbox。SelectedIndex=listbox.Items.Count—1;listbox.ClearSelected();}}}//将信息发送给指定的客户publicvoidSendToOne(Useruser,stringstr){try{user.swoWriteLine(str);user。sw.Flush();AddListBoxItem(string.Format("向{0}发送{1}“,user.userName,str));catch{AddListBoxItem(string。Format("向{0}发送信息失败”,user.userName));}}//将信息发送给指定房间的所有人publicvoidSendToRoom(GameRoomgameRoom,stringstr){//向玩家发送for(inti=0;i<gameRoom.gamePlayer。Length;i++){if(gameRoom.gamePlayer[i]。GameUser!=null){SendToOne(gameRoom.gamePlayer[i]。GameUser,str);}}//向旁观者发送for(inti=0;i<gameRoom.lookOnUser.Count;i++){SendToOne(gameRoom.lookOnUser[i],str);}}publicvoidSendToAll(System°Collections°Generic.List<User>userList,stringstr)for(inti=0;i<userList.Count;i++){SendToOne(userList[i],str);}}}}添加一个名为GameRoom.cs的类,游戏室内的每个小房间,代码如下:usingSystem;usingSystem。Collections.Generic;usingSystem.Linq;usingSystem。Text;usingSystem。IO;usingSystem。Net。Sockets;usingSystem。Windows。Forms;namespaceGobangServer{classGameRoom{//进入房间的旁观者publicList<User〉lookOnUser=newList〈User〉();//坐在玩家位置上的黑白两个游戏者publicPlayer[]gamePlayer=newPlayer[2];//黑方玩家publicPlayerBlackPlayer{get{returngamePlayer[0];}set{gamePlayer[0]=value;}}///白方玩家publicPlayerWhitePlayer{get{returngamePlayer[1];}set{gamePlayer[1]=value;}}privateGobangBoardgameBoard=newGobangBoard();publicGobangBoardGameBoard{get{returngameBoard;}}〃/向listbox中添加显示信息以及向客户发送信息privateListBoxlistbox;privateServiceservice;//构造函数publicGameRoom(ListBoxlistbox){this。listbox=listbox;gamePlayer[0]=newPlayer();gamePlayer[1]=newPlayer();service=newService(listbox);//将棋盘上的棋子全部清除gameBoard.InitializeBoard();}//放置棋子publicvoidSetChess(inti,intj,intchessColor){〃发送格式:SetChess,行,歹U,颜色gameBoard.Grid[i,j]=chessColor;gameBoard。NextIndex=gameBoard.NextIndex==0?1:0;service。SendToRoom(this,string.Format("SetChess,{0},{1},{2}",i,j,chessColor));if(gameBoard。IsWin(i,j)){ShowWin(chessColor);}else{service.SendToRoom(this,”NextChess,”+gameBoard.NextIndex);}}privatevoidShowWin(intchessColor){gamePlayer[0].Start=false;gamePlayer[1].Start=false;gameBoard。InitializeBoard();service。SendToRoom(this,string.Format("Win,{0}”,chessColor));}}}4。6重命名Forml。cs为FormServer.es,修改代码如下:usingSystem;usingSystem。Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem。Drawing;usingSystem。Linq;usingSystem.Text;usingSystem。Windows。Forms;usingSystem.Net。Sockets;usingSystem。IO;usingSystem。Threading;usingSystem.Net;namespaceGobangServer{publicpartialclassFormServer:Form{privateintmaxUsers;List<User〉userList=newList<User>();privateintmaxRoomNumbers;privateGameRoom[]gameRoom;IPAddresslocalAddress;privateintport=51888;privateTcpListenermyListener;privateServiceservice;publicFormServer(){InitializeComponent();listBoxStatus。HorizontalScrollbar=trueservice=newService(listBoxStatus);}//加载窗体触发的事件privatevoidFormServer_Load(objectsender,EventArgse){listBoxStatus.HorizontalScrollbar=true;IPAddress口addrIp=Dns。GetHostAddresses(Dns.GetHostName());foreach(IPAddresspinaddrIp){if(p.AddressFamily==AddressFamily。InterNetwork){localAddress=p;break;}}buttonStop。Enabled=false;}privatevoidbuttonStart_Click(objectsender,EventArgse)//开始按钮事件if(intoTryParse(textBoxMaxTablesoText,outmaxRoomNumbers)==falseI|int.TryParse(textBoxMaxUsers。Text,outmaxUsers)==false{MessageBox.Show("请输入在规定范围内的正整数”);return;}if(maxUsers〈1IImaxUsers>300){MessageBox。Show("允许进入的人数只能在1〜300之间”);return;}if(maxRoomNumbers〈1||maxRoomNumbers>100){MessageBox。Show("允许开出的房间数只能在1〜100之间”);return;}textBoxMaxUsers.Enabled=false;textBoxMaxTables。Enabled=false;//初始化数组gameRoom=newGameRoom[maxRoomNumbers];for(inti=0;i<maxRoomNumbers;i++){gameRoom[i]=newGameRoom(listBoxStatus);}myListener=newTcpListener(localAddress,port);myListener。Start();service。AddListBoxItem(string.Format("{0:yyyy年M月d日(dddd)h点m分}开始在{1}:{2}监听客户连接”,DateTime.Now,localAddress,port));ThreadStartts=newThreadStart(ListenClientConnect);ThreadmyThread=newThread(ts);myThread.Start();buttonStart.Enabled=false;buttonStop。Enabled=true;}//停止服务事件privatevoidbuttonStop_Click(objectsender,EventArgse){service.AddListBoxItem(string.Format("目前连接用户数:{0}”
userList.Count));service.AddListBoxItem(string.Format("{0:yyyy年M月d日(dddd)h点m分}停止服务,并依次使客户退出。",DateTime。Now));StopCLientAndListener();buttonStart。Enabled=truebuttonStop.Enabled=false;textBoxMaxUsers。Enabled=true;textBoxMaxTables.Enabled=true;}///关闭TcpClient实例并停止监听privatevoidStopCLientAndListener()for(inti=0;i〈userList.Count;i++)userList[i]。client。Close();}myListener。Stop();}//循环监听客户端连接,直到单机【停止服务】按钮或退出程序privatevoidListenClientConnect(){while(true){TcpClientnewClient=null;try{newClient=myListener.AcceptTcpClient();}catch{break;}ParameterizedThreadStartpts=newParameterizedThreadStart(ReceiveData);ThreadthreadReceive=newThread(pts);Useruser=newUser(newClient);threadReceive。Start(user);userList。Add(user);service.AddListBoxItem(string.Format("{0}连接服务器成功。"newClient。Client。RemoteEndPoint));service。AddListBoxItem(string。Format("当前连接用户数:{0}”{{userList。Count));}}privatevoidReceiveData(objectobj){Useruser=(User)obj;TcpClientclient=user.client;boolnormalExit=false;boolexitWhile=false;while(exitWhile==false){stringreceiveString=null;try{receiveString=user。sr。ReadLine();}catch{service。AddListBoxItem(”接收数据失败!”);RemovePlayerfromRoom(user);}if(receiveString==null){if(normalExit==false){if(client。Connected==true)service.AddListBoxItem(string.Format(”与{0}失去联系,已经终止接收该用户信息!",client.Client.RemoteEndPoint));}RemovePlayerfromRoom(user);}break;}//观察接收的信息service.AddListBoxItem(string。Format("来自[{0}]{1}:{2}”,user.client。Client.RemoteEndPoint,user.userName,receiveString));string[]splitString=receiveString.Split(’,’);inttableIndex=—1;//桌号intside=—1;//座位号intanotherSide=-1;//对方座位号stringsendString=””;switch(splitString[0]){case”Login”:if(userList.Count〉maxUsers){sendString=”Sorry”;service。SendToOne(user,sendString);service.AddListBoxItem("人数已满,拒绝"+splitString[1]+”进入游戏室”)exitWhile=true;else{boolisSameName=false;foreach(UseronlineUserinuserList){if(onlineUser。userName==splitString[11){isSameName=true;break;}}if(isSameName==true){sendString="NameUsed”;service。SendToOne(user,sendString);service。AddListBoxItem("该用户昵称已用过,拒绝重名的"+splitString[1]+”进入游戏室");exitWhile=true;}else{user。userName=splitString[1];service.AddListBoxItem(string。Format("[{0}]以{1}为昵称进入游戏室",client。Client。RemoteEndPoint,user.userName));service。SendToOne(user,string.Format(”RoomNumbers,{0},{1}",maxRoomNumbers,userList。Count));sendString=”Tables,"+this。GetTablesOnlineString();service.SendToAll(userList,sendString);service。SendToAll(userList,string.Format("Login,{0}",user。userName));}}break;case”Logout":service.SendToAll(userList,string.Format("Logout,{0}”,user。userName));normalExit=true;exitWhile=true;break;case"EnterRoom":tablelndex=int。Parse(splitString[1]);side=int。Parse(splitString[2]);stringroomOnlineString=GetRoomOnlineString(tableIndex);if(side==2)//旁观{gameRoom[tableindex].lookOnUser。Add(user);serviceoAddListBoxitem(string.Format(”{0}在第{1}{{{{{{桌旁观”,user.userName,tableIndex+1));service。SendToOne(user,“Grid,"+GetBoardGrid(tableIndex));}else//入座{anotherSide=side==0?1:0;gameRoom[tablelndex1°gamePlayer[side]°GameUser=user;service.AddListBoxItem(string.Format(”{0}在第{1}桌{2}入座”,userouserName,tablelndex+1,side==0?"黑方":"白方”));}stringenterNames="";if(gameRoom[tableIndex]ogamePlayer[0]oGameUser!=null){enterNames+=gameRoom[tableIndex].gamePlayer[0].GameUser.userName;}enterNames+="/”;if(gameRoom[tableIndex].gamePlayer[1]oGameUser!=null){enterNames+=gameRoom[tableIndex]ogamePlayer[1].GameUser.userName;}enterNames+=”/";if(side==2)enterNames+=user。userName;sendString=string°Format("EnterRoom,{0},{1},{2}“,side,enterNames,roomOnlineString);service。SendToRoom(gameRoom[tableIndex],sendString);service。SendToAll(userList,"Tables,"+thisGetTablesOnlineString());break;case”ExitRoom”:tableIndex=int.Parse(splitString[1]);side=int.Parse(splitString[2]);stringnames= ;if(gameRoom[tableIndex].gamePlayer[0].GameUser!=null){names+=gameRoom[tablelndex]。gamePlayer[0]。GameUser.userName;}names+="/”;if(gameRoom[tablelndex]。gamePlayer[1].GameUser!=null){names+=gameRoom[tableindex]。gamePlayer[1].GameUser.userName;}names+=”/”;if(side==2)names+=user。userName;service。SendToRoom(gameRoom[tablelndex],string.Format("ExitRoom,{0},{1}“,side,names));if(side==2){gameRoom[tableIndex]。lookOnUser.Remove(user);}else{gameRoom[tableIndex]。gamePlayer[side]。Start=falsegameRoom[tableIndex]。gamePlayer[side]。GameUser=nullanotherSide=(side==0?1:0);gameRoom[tableIndex].gamePlayer[anotherSide].Start=false;gameRoom[tableIndex]。GameBoard.InitializeBoard();}service。AddListBoxItem(string。Format("{0}返回游戏室”,user.userName));service.SendToAll(userList,"Tables,”+this。GetTablesOnlineString());break;case"Talk”:tableIndex=int.Parse(splitString[1]);sendString=string.Format(”Talk,{0},{1}",user.userName,receiveString。Substring(splitString[0]。Length+splitString[1]。Length+2));sendString);service。SendToRoom(gameRoom[tablelndex],break;sendString);case"Start":tablelndex=int。Parse(splitString[1]);side=int.Parse(splitString[2]);gameRoom[tableIndex].gamePlayer[side].Start=true;if(side==0){anotherSide=1;sendString="Message,黑方已开始。”}else{anotherSide=0;sendString="Message,白方已开始。”;}service。SendToRoom(gameRoom[tablelndex],sendString);if(gameRoom[tableIndex]。gamePlayer[anotherSide].Start){gameRoom[tableIndex]。GameBoard.InitializeBoard();service.SendToRoom(gameRoom[tableIndex],"Start,”+gameRoom[tableIndex]。GameBoard.NextIndex);}break;case"SetChess":tableIndex=int.Parse(splitString[1]);side=int.Parse(splitString[2]);intxi=int.Parse(splitString[3]);intxj=intoParse(splitString[41);intcolor=int.Parse(splitString[5]);gameRoom[tableIndex]oSetChess(xi,xj,color);break;case”AskTie":tableIndex=int.Parse(splitString[1]);side=intoParse(splitString[2]);anotherSide=side==0?1:0;if(gameRoom[tableIndex]ogamePlayer[anotherSide]oGameUser!=null){service.SendToOne(gameRoom[tableIndex]ogamePlayer[anotherSide]oGameUser,”AskTie,”+side);}break;case”Reply":tableIndex=intoParse(splitString[1]);side=int.Parse(splitString[2]);anotherSide=side==0?1:0;if(splitString[3]=="True")gameRoom[tableIndex].GameBoardoInitializeBoard();{{{{}}gameRoom[tableIndex]。gamePlayer[side].Start=falseanotherSide=(side==0?1:0);gameRoom[tableIndex].gamePlayer[anotherSide]。Start=false;gameRoom[tablelndex].GameBoard。NextIndex=0;service。SendToRoom(gameRoom[tablelndex],“Message,双方同意和棋.”);service.SendToRoom(gameRoom[tableIndex],”Restart,"+gameRoom[tableIndex]。GameBoard.NextIndex);}else{if(gameRoom[tableIndex].gamePlayer[anotherSide]。GameUser!=null){service.SendToOne(gameRoom[tableIndex].gamePlayer[anotherSide]。GameUser,string.Format("Reply,{0},{1}“,side,splitString[3]));}}break;default:service.SendToAll(userList,"什么意思啊:"+receiveString);break}RemovePlayerfromRoom(user);userList。Remove(user);stringstr=user。userName;client.Close();service.AddListBoxItem(string.Format("{0}退出游戏室,剩余连接用户数,{1}",str,userList.Count));}//循环检测该用户是否做到某游戏桌上,若是,将其从游戏桌上移除,并终止该游戏privatevoidRemovePlayerfromRoom(Useruser){for(inti=0;i<gameRoom.Length;i++){if(gameRoom[i].BlackPlayer。GameUser!=null){if(gameRoom[i].BlackPlayer.GameUser==user){StopPlayer(i,0);return;}}if(gameRoom[i].WhitePlayer。GameUser!=null{if(gameRoom[i].WhitePlayer.GameUser==user)StopPlayer(i,1);StopPlayer(i,1);return;}}for(intj=0;j<gameRoom[i].lookOnUser。Count;j++){if(gameRoom[i].lookOnUser[j]!=null){if(gameRoom[i]。lookOnUser[j]==user){gameRoom[i]。lookOnUser.RemoveAt⑴;return;}}}}}privatevoidStopPlayer(inti,intj)//让第i个房间第j个座位的玩家退出房间{gameRoom[i].gamePlayer[j].Start=false;service。SendToRoom(gameRoom[i],string。Format("LostPlayer,{0},{1},{2}",i,j,gameRoom[i]。gamePlayer[j]。GameUser.userName));}//获取每桌玩家情况及昵称字符串,每桌之间用逗号分隔//每桌格式:黑方有人情况(1位)+昵称/白方有人情况(1位)+昵称//有人情况:0表示无人,1表示有人privatestringGetTablesOnlineString(){StringBuilderstrBuilder=newStringBuilder();for(inti=0;i〈gameRoom.Length;i++){stringblackName="0";if(gameRoom[i].gamePlayer[0].GameUser!=null){blackName="1"+gameRoom[i]。gamePlayer[0]。GameUser.userName;}stringwhiteName=”0";if(gameRoom[i]。gamePlayer[l].GameUser!=null{whiteName="1"+gameRoom[i]。gamePlayer[l].GameUser.userName;}strBuilder°Append(string°Format("{0}/{1},”,blackName,whiteName));}//移除最后一个逗号strBuilder=strBuilder。Remove(strBuilder。Length—1, 1);returnstrBuilder.ToString();}//获取指定房间人员情况及昵称字符串,每人之间用/分隔//格式:黑方昵称/白方昵称/旁观者昵称/旁观者昵称/。。..privatestringGetRoomOnlineString(inttableIndex)StringBuilderstrBuilder=newStringBuilder();GameRoomroom=gameRoom[tableIndex];for(inti=0;i〈room。gamePlayer.Length;i++){if(room.gamePlayer[i].GameUser!=null){strBuilder。Append(room。gamePlayer[i]。GameUser。userName)}strBuilder。Append。'/");}for(inti=0;i〈room。lookOnUser.Count;i++){strBuilder。Append(room。lookOnUser[i]。userName);strBuilder。Append。'/");}//移除最后一个/符号strBuilder=strBuilder。Remove(strBuilder。Length—1,1);returnstrBuilder。ToString();}//获取某游戏桌棋盘上的落子情况privatestringGetBoardGrid(inttableIndex){StringBuildersb=newStringBuilder();int[,]grid=gameRoom[tableIndex].GameBoard.Grid;for(inti=0;i〈=grid。GetUpperBound(O);i++){for(intj=0;j<=grid.GetUpperBound(1);j++){sb.Append(grid[i,j]。ToString());sb.Append("/");}}sb=sb.Remove(sb。Length—1, 1);〃移除最后一个/符号returnsb。ToString();}//关闭窗体时触发的事件privatevoidFormServer_FormClosed(objectsender,FormClosedEventArgse){if(myListener!=null){StopCLientAndListener();}}}}5服务器与客户端进行测试运行效果(截图)5。1运行效果图:服务器界面如下:5.2客户端连接到服务器:客户端发送给服务器Login着戏室允在进入的最哆人数(1-300):24启动服务僖止服务瑜戟室同时开出的房间数U-ioo):16客户端游戏室界面:客户端根据服务器发送的指令,来显示游戏室的相关信息.5。3客户端进入游戏房间发送给服务器的消息5・45・4游戏过程中5・45・4游戏过程中四服务器湍 四服务器湍 <=>回年6月四曰《星财)3点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年五年级语文上册教学总结样本(二篇)
- 2025年个人商铺租房合同标准版本(三篇)
- 医药行业物流运输合同范文
- 加油站装修项目居间协议
- 城市道路监理居间合同
- 乳制品低温运输托运协议
- 医疗器械无菌运输管理合同
- 海鲜冷链物流代理合同
- 酒泉灰色烧结砖施工方案
- 市政项目渣土清理运输协议
- 2024年长沙卫生职业学院单招职业适应性测试题库含答案
- 2024山西省文化旅游投资控股集团有限公司招聘笔试参考题库附带答案详解
- (正式版)SHT 3075-2024 石油化工钢制压力容器材料选用规范
- 出租房房东消防培训
- 2024年度-小学语文教师经验交流
- 加油站廉洁培训课件
- 认识比例尺人教版课件
- 2022版义务教育(生物学)课程标准(附课标解读)
- 如何提升小学教学质量
- 陕西省西安市2023-2024学年六年级上学期期末数学试卷(A卷)
- 变电站模块化建设2.0版技术导则
评论
0/150
提交评论