有能口袋妖怪日月联网对战的飞行棋吗,就是可以和人对战的

public&class&Network
&&&&&&&&private&static&Network&_
&&&&&&&&private&const&int&Port&=&100;
&&&&&&&&public&static&UdpClient&UdpC
&&&&&&&&private&static&&Encoding&encoding&=&Encoding.GetEncoding("gb2312");
&&&&&&&&public&static&string&HostN
&&&&&&&&public&static&IPAddress&IpA
&&&&&&&&private&static&Thread&
&&&&&&&&public&event&EventHandler&GameMsg&&ReceivedM
&&&&&&&&public&static&Network&Instance
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(_instace&==&null)&
&&&&&&&&&&&&&&&&&&&&_instace&=&new&Network();
&&&&&&&&&&&&&&&&return&_
&&&&&&&&&&&&}
&&&&&&&&private&Network()
&&&&&&&&&&&&UdpClient&=&new&UdpClient(Port);
&&&&&&&&&&&&HostName&=&Dns.GetHostName();
&&&&&&&&&&&&foreach&(IPAddress&ip&in&Dns.GetHostAddresses(HostName))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(ip.AddressFamily&==&AddressFamily.InterNetwork)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&IpAddress&=&
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&//局域网内广播,在上线时调用,通知其它Client有人上线了
&&&&&&&&public&void&Broadcast(GameMsg&msg)
&&&&&&&&&&&&IPEndPoint&ipEndPoint&=&new&IPEndPoint(IPAddress.Broadcast,&Port);
&&&&&&&&&&&&byte[]&bytes&=&Tools.Serialize(msg);
&&&&&&&&&&&&UdpClient.Send(bytes,&bytes.Length,&ipEndPoint);
&&&&&&&&//接收消息线程入口,收到消息后触发各类事件
&&&&&&&&public&void&ReceiveMsg()
&&&&&&&&&&&&IPEndPoint&ipEndPoint&=&new&IPEndPoint(IPAddress.Broadcast,&Port);
&&&&&&&&&&&&while&(true)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&byte[]&bytes&=&null;
&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bytes&=&UdpClient.Receive(ref&ipEndPoint);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&catch&(SocketException&ex)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&GameMsg&msg&=&(GameMsg)Tools.Deserialize(bytes);
&&&&&&&&&&&&&&&&if&(ReceivedMsg&!=&null&&&&!msg.IpAddress.Equals(IpAddress))
&&&&&&&&&&&&&&&&&&&&ReceivedMsg(this,&msg);
&&&&&&&&&&&&}
&&&&&&&&//向某IP定向发送消息
&&&&&&&&public&void&Send(IPAddress&ip,&GameMsg&msg)
&&&&&&&&&&&&IPEndPoint&ipEndPoint&=&new&IPEndPoint(ip,&Port);
&&&&&&&&&&&&byte[]&bytes&=&Tools.Serialize(msg);
&&&&&&&&&&&&UdpClient.Send(bytes,&bytes.Length,&ipEndPoint);
&&&&&&&&//向一些IP定向发送消息
&&&&&&&&public&void&Send(IPAddress[]&ips,&GameMsg&msg)
&&&&&&&&&&&&foreach&(IPAddress&ipAddress&in&ips)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(!ipAddress.Equals(IpAddress))
&&&&&&&&&&&&&&&&&&&&Send(ipAddress,&msg);
&&&&&&&&&&&&}
下面是游戏中,Client之间需要交互的一些消息体定义。GameMsg是消息体,里面包含消息类型,IP地址,消息内容,消息内容有可能是LandGameMsg对象,也有可能是CreateGameMsg对象...
[Serializable]
&&&&public&class&GameMsg&:&EventArgs
&&&&&&&&public&MsgTypeEnum&MsgT&&&
&&&&&&&&public&IPAddress&IpA
&&&&&&&&public&object&MsgC
&&&&[Serializable]
&&&&public&class&LandGameMsg&&&&//OnlineReply,&Hello
&&&&&&&&public&string&HostN
&&&&&&&&public&string&UserN
&&&&[Serializable]
&&&&public&class&CreateGameMsg
&&&&&&&&public&string&CreaterHostN
&&&&&&&&public&string&CreaterUserN
&&&&&&&&public&IPAddress[]&SelectedIpA
&&&&&&&&public&string[]&SelectedHostN
在主界面中,有些对接收到的消息共同的处理逻辑,在这里也列出来给大家看一下吧。
public&partial&class&MainForm&:&Form
&&&&&&&&public&static&Thread&Listener&=&new&Thread(new&ThreadStart(Network.Instance.ReceiveMsg))&{&Name&=&"receiveMsg",&Priority&=&ThreadPriority.Highest&};
&&&&&&&&public&static&CurrStatEnum&CurrStat&=&CurrStatEnum.I
&&&&&&&&private&static&readonly&MsgTypeEnum[]&interestMsgTypes&=&new&MsgTypeEnum[]&{&MsgTypeEnum.QuitGame&};
& &&& &&&public&MainForm()
&&&&&&&&&&&&Listener.Start();
&&&&&&&&&&&&Network.Instance.ReceivedMsg&+=&new&EventHandler&GameMsg&(_network_ReceivedMsg);
&&&&&&&&&&&&Network.Instance.Broadcast(new&GameMsg()&{&MsgType&=&MsgTypeEnum.LandGame,&IpAddress&=&Network.IpAddress,&MsgContent&=&new&LandGameMsg()&{&HostName&=&Network.HostName&}&});
& &&& &&&private&delegate&void&Delegate_ReceivedMsg(GameMsg&msg);
&&&&&&&&void&_network_ReceivedMsg(object&sender,&GameMsg&e)
&&&&&&&&&&&&Delegate_ReceivedMsg&myDelegate&=&new&Delegate_ReceivedMsg(handleReceivedMsg);
&&&&&&&&&&&&if&(interestMsgTypes.Contains(e.MsgType))
&&&&&&&&&&&&&&&&Invoke(myDelegate,&e);
&&&&&&&&void&handleReceivedMsg(GameMsg&msg)
&&&&&&&&&&&&switch&(msg.MsgType)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&case&MsgTypeEnum.QuitGame:&&&&//收到某人退出游戏请求
&&&&&&&&&&&&&&&&&&&&MessageBox.Show("有小伙伴要求退出游戏");
&&&&&&&&&&&&&&&&&&&&ucUsersInGame_QuitGame(null,&null);
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&}
如上所示,在主界面中主要是对用户退出游戏请求做出一些逻辑处理,这里的线程监控网络发来的所有消息,但只对退出游戏请求感兴趣,提示用户,本局游戏结束。
在其它界面也是类似的过程,下面再列出邀请好友界面里的,对其它游戏者的反馈信息做出逻辑处理的代码段。
public&partial&class&InviteOthers&:&Form
&&&&&&&&private&static&readonly&MsgTypeEnum[]&interestMsgTypes&=&new&MsgTypeEnum[]&{&MsgTypeEnum.OnlineReply&};
&&&&&&&&public&List&GameMsg&&OnlineReplys&=&new&List&GameMsg&();
& &&& & void&_network_ReceivedMsg(object&sender,&GameMsg&msg)
&&&&&&&&&&&&if&(interestMsgTypes.Contains(msg.MsgType))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&switch&(msg.MsgType)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&case&MsgTypeEnum.OnlineReply:
& & & & & & & & & & & &&OnlineReplys.Add(msg);
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
游戏引擎,游戏逻辑处理在这里就不多列了,那是在单机飞行棋里的实现了的。
游戏的基本功能实现了后,还实现了一些添喜的功能,比如隐藏到桌面上方、下方、旁边,就是你可以把游戏窗口拖动到屏幕的最上方,然后松鼠标,游戏会缩到屏幕上方,当你再把鼠标移动到屏幕上方时,它还会出来,就跟挂QQ的功能一样。它是这样实现的,在主界面中添加3个Windows.Forms.Timer,timer1的Enabled=True,Interval=100;timer2、timer3的Enabled=False,Interval=1,再各自添加如下事件处理逻辑。
&&&&&&&&///&监控鼠标和窗口位置
&&&&&&&&private&void&timer1_Tick(object&sender,&EventArgs&e)
&&&&&&&&&&&&int&mouse_x&=&Cursor.Position.X,&mouse_y&=&Cursor.Position.Y;
&&&&&&&&&&&&int&window_x&=&this.Location.X,&window_y&=&this.Location.Y;
&&&&&&&&&&&&int&window_width&=&this.Size.Width,&window_height&=&this.Size.H
&&&&&&&&&&&&if&(isHiding&==&false&&&&window_y&==&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(window_x&-&mouse_x&&&10&||&mouse_x&-&window_x&-&window_width&&&10
&&&&&&&&&&&&&&&&&&&&||&mouse_y&-&window_y&-&window_height&&&10)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&timer1.Enabled&=&false;
&&&&&&&&&&&&&&&&&&&&timer2.Enabled&=&true;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(isHiding&==&true&&&&mouse_y&&=&1&&&&mouse_x&&&window_x&&&
&&&&&&&&&&&&&&&&mouse_x&&&window_x&+&window_width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&timer1.Enabled&=&false;
&&&&&&&&&&&&&&&&timer3.Enabled&=&true;
&&&&&&&&&&&&}
&&&&&&&&///&隐藏界面
&&&&&&&&private&void&timer2_Tick(object&sender,&EventArgs&e)
&&&&&&&&&&&&int&window_height&=&this.Size.H
&&&&&&&&&&&&startY&+=&window_height&/&8;
&&&&&&&&&&&&if&(startY&&&window_height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.Location&=&new&Point(this.Location.X,&-startY);
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.Location&=&new&Point(this.Location.X,&1&-&window_height);
&&&&&&&&&&&&&&&&isHiding&=&true;
&&&&&&&&&&&&&&&&timer2.Enabled&=&false;
&&&&&&&&&&&&&&&&timer1.Enabled&=&true;
&&&&&&&&&&&&}
&&&&&&&&///&显示界面
&&&&&&&&private&void&timer3_Tick(object&sender,&EventArgs&e)
&&&&&&&&&&&&int&window_height&=&this.Size.H
&&&&&&&&&&&&startY&-=&window_height&/&8;
&&&&&&&&&&&&if&(startY&&&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.Location&=&new&Point(this.Location.X,&-startY);
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.Location&=&new&Point(this.Location.X,&0);
&&&&&&&&&&&&&&&&isHiding&=&false;
&&&&&&&&&&&&&&&&timer3.Enabled&=&false;
&&&&&&&&&&&&&&&&timer1.Enabled&=&true;
&&&&&&&&&&&&}
就这样把局域网多人对战飞行棋给实现了,回看这次的编程设计经历,觉得这种P2P式的,无Server式的游戏设计是个问题。这种设计影响到游戏编码方式,使得游戏编码杂乱无章,没有一个主心骨来对游戏步骤进行统一管理,这样如若数据在网络中丢失,很容易导致多客户端不同步的现象。应该在选取完游戏伙伴创建新游戏时,自主选择一个Server来处理游戏逻辑,这样,8个人、10个人、更多的人同时在线都可以自组织游戏平台了,不同步也可以避免了。
其它的一些收获:
1、System.Windows.Forms.Application.DoEvents();可以督促主线程处理当前在消息队列中的所有Windows消息。
2、朋友机器上的操作系统是WinXP,自带的没有.net4.0,自带.net3.0,刚开始运行不起来,后来全部换到.net3.0调试、改代码,才运行得起来。
3、做完后,在家里跟老婆两个人打对战,玩了一晚上这个游戏都不累,还挺好玩的。
好久没来博客园更新博客了,最近新项目来了。新项目做完,又有好多新知识可以总结喽!
标签:&&&&&&&&&&&&&&&&&&原文:/wgp13x/p/3800030.html
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!怎么 联网 和人 对战 啊?_哥特舰队吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,000贴子:
怎么 联网 和人 对战 啊?
贴吧热议榜
使用签名档&&
保存至快速回贴

我要回帖

更多关于 街机联网对战平台 的文章

 

随机推荐