`
haouziwefe
  • 浏览: 128047 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

C#坦克大战网络版代码

阅读更多

   

简单C#坦克大战网络版代码





写完单机版 http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx游戏后

再写个网络版玩玩。

开发工具vs2008





网络版实现方法很简单

1.一个服务端,多个客户端

2.服务端开个端口监听,当一个客户端程序后连接到服务端后,服务端分配个编号给客户端作为他的坦克编号

3.当有新坦克创建,坦克移动,等操作时,客户端发送数据到服务端,服务端再把数据发送到所有的客户端来实现网络游戏的同步





具体实现代码

1.服务端开启服务代码

   public void Start()

   {

     //开启udp线程

     Thread t = new Thread(UDPThread);

     t.IsBackground = true;

     t.Start();

     //开启tcp服务

     TcpListener tl = new TcpListener(TCP_PORT);

     tl.Start();

     while (true)

     {

       TcpClient tc = tl.AcceptTcpClient();

       Stream ns = tc.GetStream();

       BinaryReader br = new BinaryReader(ns);

       int udpPort = br.ReadInt32();//br.Close();不能关闭br

       BinaryWriter bw = new BinaryWriter(ns);

       bw.Write(ID++);

       IPEndPoint rep = (IPEndPoint)tc.Client.RemoteEndPoint;

       Client c = new Client(rep.Address.ToString(), udpPort);

       clients.Add(c);

       Console.WriteLine("A Client TCP Connect! Addr- " + rep.Address.ToString() + ":" + rep.Port);

     }

   }

2.服务端udp数据接收转发代码

   private void UDPThread()

   {

     Console.WriteLine("UDP thread started at port :" + UDP_PORT);

     byte[] buf = new byte[1024];

     UdpClient uc = new UdpClient(UDP_PORT);//// 跟java有区别 如果这句话放到while外面 就不能接受第二个坦克连入

     IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);

     while (true)

     {

       buf = uc.Receive(ref ipep);

       Console.WriteLine("a udp packet received! from " + ipep.Address + ":" + ipep.Port);

       //把收到的数据转发给每一个客户端

       for (int i = 0; i < clients.Count; i++)

       {

         Client c = clients[i];

         UdpClient _uc = new UdpClient();

         _uc.Connect(c.ip, c.udpPort);

         _uc.Send(buf, buf.Length);

       }

     }

   }

3.客户端连接代码

   public void Connect(string ip, int port)

   {

     this.ip = ip;

     TcpClient client = new TcpClient();

     client.Connect(ip, port);

     Stream ns = client.GetStream();

     BinaryWriter bw = new BinaryWriter(ns);

     bw.Write(udpPort);

     BinaryReader br = new BinaryReader(ns);       //bw.Close();不能关闭bw

     //从服务器端取到服务器分配的坦克编号

     int id = br.ReadInt32();

     tc.myTank.ID = id;

     //编号为偶数的设置为坏蛋

     if (id % 2 == 0)

       tc.myTank.Good = false;

     else

       tc.myTank.Good = true;

     //可以在“输出窗口”看到下面的调试代码

     Debug.WriteLine("Connected to server! and server give me a ID:" + id);

     br.Close();

     ns.Close();

     client.Close();

     TankNewMsg msg = new TankNewMsg(tc.myTank);

     Send(msg);

     //开启接收线程

     Thread t = new Thread(UDPRecvThread);

     t.IsBackground = true;

     t.Start();

   }

4.坦克加入消息代码发送代码



   public void Send(UdpClient uc, string ip, int udpPort)

   {

     uc.Connect(ip, udpPort);

     //程序中用 | 来分割发送的内容

     string str = msgType + "|" + tank.ID + "|" + tank.x + "|" + tank.y + "|" + (int)tank.dir + "|" + tank.Good;

     uc.Send(Encoding.UTF32.GetBytes(str), Encoding.UTF32.GetBytes(str).Length);

   }

5.坦克加入消息解析代码

   public void Parse(byte[] b)

   {

     string str = Encoding.UTF32.GetString(b);

     string[] strs = str.Split('|');

     int id = Convert.ToInt32(strs[1]);

     //如果数据包里是自己的坦克不处理

     if (id == tc.myTank.ID)

     {

       return;

     }

     int x = Convert.ToInt32(strs[2]);

     int y = Convert.ToInt32(strs[3]);

     Direction dir = (Direction)Convert.ToInt32(strs[4]);

     bool good = Convert.ToBoolean(strs[5]);

     Boolean exist = false;

     for (int i = 0; i < tc.tanks.Count; i++)

     {

       Tank t = tc.tanks[i];

       if (t.ID == id)

       {

         exist = true;

         break;

       }

     }

     //如果坦克不存在就创建出来

     if (!exist)

     {

       TankNewMsg msg = new TankNewMsg(tc.myTank);

       tc.nc.Send(msg);

       //Tank t = new Tank(x, y, good, tc);//java中是这样写得Tank t = new Tank(x,y,good,dir,tc)

       Tank t = new Tank(x, y, good, dir, tc); //有可能是老坦克 给新坦克发包 所以要家dir参数

       t.ID = id;

       tc.tanks.Add(t);

     }

   }

6.坦克移动消息

   public void Send(UdpClient uc, string ip, int udpPort)

   {

     uc.Connect(ip, udpPort);

     //程序中用 | 来分割发送的内容

     string str = msgType + "|" + id + "|" + x + "|" + y + "|" + Convert.ToInt32(dir);

     uc.Send(Encoding.UTF32.GetBytes(str), Encoding.UTF32.GetBytes(str).Length);

   }



   public void Parse(byte[] b)

   {

     string str = Encoding.UTF32.GetString(b);

     string[] strs = str.Split('|');

     int id = Convert.ToInt32(strs[1]);

     //如果数据包里是自己的坦克不处理

     if (id == tc.myTank.ID)

     {

       return;

     }

     int x = Convert.ToInt32(strs[2]);

     int y = Convert.ToInt32(strs[3]);

     Direction dir = (Direction)Convert.ToInt32(strs[4]);

     for (int i = 0; i < tc.tanks.Count; i++)

     {

       Tank t = tc.tanks[i];

       if (t.ID == id)

       {

         t.dir = dir;

         t.x = x;

         t.y = y;

         break;

       }

     }

   }

7.子弹消息处理代码

   public void Send(UdpClient uc, string ip, int udpPort)

   {

     uc.Connect(ip, udpPort);

     //程序中用 | 来分割发送的内容

     string str = msgType + "|" + m.tankID + "|" + m.x + "|" + m.y + "|" + (int)m.dir + "|" + m.good;

     uc.Send(Encoding.UTF32.GetBytes(str), Encoding.UTF32.GetBytes(str).Length);

   }



   public void Parse(byte[] b)

   {

     string str = Encoding.UTF32.GetString(b);

     string[] strs = str.Split('|');

     int tankID = Convert.ToInt32(strs[1]);

     if (tankID == tc.myTank.ID)

     {

       return;

     }

     int x = Convert.ToInt32(strs[2]);

     int y = Convert.ToInt32(strs[3]);

     Direction dir = (Direction)Convert.ToInt32(strs[4]);

     bool good = Convert.ToBoolean(strs[5]);

     Missile m = new Missile(tankID, x, y, good, dir, tc);

     tc.missiles.Add(m);

   }







<img src="http://hi.csdn.net/attachment/201101/16/0_1295172842poHz.gif" alt="">



单机测试时 先运行服务端 再运行多个客户端就ok

多机联网游戏时修改下 nc.Connect("127.0.0.1", 8888);中的ip地址就可以在局域网内玩了

   private void Form1_Load(object sender, EventArgs e)

   {

     myTank = new Tank(50, 20, true, this);//放到前面 this不能用 //y轴比java的减少了30

     nc = new NetClient(this);

     nc.Connect("127.0.0.1", 8888);

     //nc.connect("192.168.1.168",8888);

     //nc.connect("10.10.10.1",8888);

   }



如果你发现有什么不合理的,需要改进的地方,<span style="font-family: 'lucida Grande',Verdana; font-size: 14px; line-height: 23px;">邮件联系328452421@qq.com(qq常年不在线,邮件联系)</span> 朱晓 (泰山学院)。相互交流 谢谢





下载地址 http://download.csdn.net/source/2986606









 
0
0
分享到:
评论

相关推荐

    C# 2008坦克大战网络版(完整工程)

    《C# 2008坦克大战网络版(完整工程)》是一款基于C#编程语言,利用Visual Studio 2008开发环境构建的多人在线对战游戏。这款游戏的源码详细展示了如何实现网络通信、游戏逻辑控制以及图形界面设计等关键知识点。...

    用c#编写的坦克大战(c#版)

    【标题】"用c#编写的坦克大战(c#版)"揭示了这是一个使用C#编程语言实现的经典游戏——坦克大战的复刻版本。在C#这种面向对象的语言环境下,开发者可能利用其强大的类库和面向对象特性来构建游戏逻辑。 【描述】...

    unity3d网络版坦克大战素材和源码

    Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作各种类型的游戏,包括网络版的坦克大战。本资源提供了完整的坦克大战素材和源码,对于初学者或者希望深入了解Unity网络游戏开发的人来说,是一个很好的学习资料...

    经典红白机坦克大战素材

    1. **源代码示例**:网络上有许多开源的坦克大战实现,可以通过阅读代码了解游戏逻辑。 2. **编程教程**:如Python、C#、Java等语言的入门教程,帮助理解游戏开发基础。 3. **图形与音频库**:如pygame(Python)、...

    Unity游戏项目源码 3d坦克大战 完整版.zip

    《Unity游戏项目源码 3D坦克大战 完整版》是一个基于Unity 3D引擎开发的游戏项目,它提供了一套完整的源代码供学习和参考。Unity 3D是目前非常流行的游戏开发平台,尤其在3D游戏领域,其强大的图形渲染能力、丰富的...

    坦克大战90源程序代码, 精确到象素级, 100%忠于原作BATTLECITY.

    但是毕业后十几年都没有编过程序,干的工作有抄水电表,网管,销售工作,最近发现人渐渐老去,有心愿未了,于是最近跟着网络视频教学,学习了一下VC++和面向对象编程,就自已小时候最爱玩的坦克大战为练习,来熟悉和...

    unity手机坦克大战

    在《坦克大战》这款游戏中,基础的编程语言是C#,这是Unity的主要脚本语言。开发者可以通过编写C#脚本来控制坦克的移动、射击、碰撞检测以及敌我识别等游戏逻辑。同时,Unity的组件式架构使得游戏对象(如坦克、炮弹...

    Tank_Tank_palacewgz_Unity简单案例-坦克大战_express5oc_

    《坦克大战Unity简单案例解析——Tank_Tank_palacewgz_Unity简单案例-坦克大战_express5oc_》 在游戏开发领域,Unity引擎因其强大的跨平台能力和丰富的资源库而备受青睐。本项目"Tank_Tank_palacewgz_Unity简单案例...

    Unity3D制作的90坦克大战

    《Unity3D构建坦克大战游戏解析》 Unity3D是一款强大的跨平台游戏开发工具,以其高效的游戏引擎和直观的可视化编辑界面,深受开发者喜爱。在本项目“Unity3D制作的90坦克大战”中,开发者利用Unity3D构建了一个经典...

    dotnet-坦克大战小霸王经典游戏

    《坦克大战:Unity3D与.NET开发的游戏编程之旅》 在技术日新月异的今天,我们有时会怀念起那些简单却充满乐趣的经典游戏。"dotnet-坦克大战小霸王经典游戏"就是一个将怀旧情怀与现代技术相结合的项目,它使用Unity...

    C#开发基于unity开发的3D坦克大战游戏成品源码.zip

    【描述】: "C#开发基于Unity开发的3D坦克大战游戏成品源码.zip" 提供了完成的源代码,开发者可以深入学习游戏逻辑、物理模拟、3D建模以及用户交互等方面的实现。Unity是一个跨平台的游戏开发工具,支持Windows、Mac...

    Unity坦克大战无尽地牢版源码(双人版) Unity完整项目

    《Unity坦克大战无尽地牢版源码》是一款基于Unity引擎开发的双人合作游戏项目,旨在提供一个学习和二次开发的平台。本项目涵盖了Unity3D游戏开发的多个核心知识点,包括游戏逻辑、场景构建、角色控制、碰撞检测、...

    wp8游戏开发源码--坦克大战

    本资源是一份关于坦克大战游戏的完整源代码,专为WP8系统设计。通过深入研究这份源码,开发者可以了解如何利用WP8的API和技术进行游戏开发。 坦克大战是一款经典的多人对战游戏,它融合了策略和动作元素,玩家需要...

    坦克大战Demo(转:作者:谭建冲)

    总的来说,坦克大战Demo集成了许多IT技术,包括但不限于游戏开发、图形编程、网络通信、数据管理等,体现了开发者谭建冲全面的IT技能和创新思维。这样的项目不仅提供了娱乐体验,也为其他开发者提供了学习和借鉴的...

    TankWar2.9_坦克大战_

    《坦克大战》是一款经典的街机游戏,源自1985年由日本南梦宫公司开发的《坦克战记》(Battle City)。本游戏以其简单的操作、趣味的策略性和丰富的关卡设计,深受玩家喜爱,历经多年仍具有较高的娱乐价值。在这个名...

Global site tag (gtag.js) - Google Analytics