- 浏览: 126943 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (145)
- java (145)
- Java网络编程 (1)
- SWT 文本框Text通过GC重绘改变边框颜色 (1)
- tomcat部署web工程的两种方法 (1)
- JAX-RS 从傻逼到牛叉 1:REST 基础知识 (1)
- FreyjaJdbcTemplate 大致上完工了,想请人重构。。 (1)
- 开始认识自己 (1)
- 设计模式-Abstract Factory 模式 (1)
- 数据库中主键的设计原则 (1)
- JNI中jstring类型与c语言中的字符串的转换 (1)
- mac环境变量 (1)
- STC单片机ADC转换的例子 (1)
- myeclipse 8下安装Ibator . (1)
- OSGI与Android结合 (1)
- CSDN BLOG EXPERT (1)
- Java中网络操作的开源库CommonsNet (1)
- Apache License Version 2.0 英文内容及中文翻译 (1)
- JTest (1)
- GeoCon 用C#编写的开源的地理信息数据转换工具 (1)
- ERP简易教程 (1)
- 提高站点在搜索引擎上的排名 (1)
- Wifi (1)
- 腾讯Q+开放平台,相信又是一次成功的模仿 (1)
- C#坦克大战网络版代码 (1)
- Problem16 (1)
- Ajax 应该变成 Ajaj (关于JSON 与 XML 的比较) (1)
- ava框架数据库连接池比较(c3p0 (1)
- dbcp和proxool)bonecp (1)
- 继续向成熟男人靠拢 (1)
- Qt4.7中 默认的构造函数 (1)
- xml CDATA (1)
- 只针对中英文混合分词的中文分词器 (1)
- 典型相关分析及其适用范围和spss操作(转) (1)
- llvm (1)
- java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access (1)
最新评论
-
xm3530:
什么鬼?都没法看,发出来干嘛
Android中利用App实现消息推送机制的代码实例 -
lvtenglongxiaohei:
太经典了!
学习一下!
ERP简易教程 -
lvtenglongxiaohei:
<br> 一天中午,丈 ...
ERP简易教程 -
hzw2312:
加油~~~!!!
开始认识自己 -
123048591:
显示乱码
tomcat部署web工程的两种方法
简单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
发表评论
-
java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access
2012-02-08 14:17 1054<div>Java数据库连接(JDBC)由 ... -
llvm
2012-02-07 16:29 875llvm ... -
典型相关分析及其适用范围和spss操作(转)
2012-02-07 15:43 1575看文章《科学学研 ... -
只针对中英文混合分词的中文分词器
2012-02-03 10:39 1005该版本说明 1、只针对中英文混合分词 需要一些中文和 ... -
xml CDATA
2012-02-03 08:45 1203<h2 style="font-si ... -
Qt4.7中 默认的构造函数
2012-02-01 09:14 1081<p><span style=&qu ... -
继续向成熟男人靠拢
2012-01-11 17:04 878转自徒儿的人人。 ... -
ava框架数据库连接池比较(c3p0,dbcp和proxool)bonecp
2012-01-11 14:13 1128<h1 style="text ... -
Ajax 应该变成 Ajaj (关于JSON 与 XML 的比较)
2011-12-28 15:23 958<span style="font- ... -
Problem16
2011-12-28 12:53 661package com.shui.mu.yao.io. ... -
腾讯Q+开放平台,相信又是一次成功的模仿
2011-12-20 10:44 856今天看到两则新 ... -
Wifi
2011-12-19 13:14 1081. Confirm if Wifi is On ... -
提高站点在搜索引擎上的排名
2011-12-19 12:04 932对于拥有网站的各位站长来说,都希望自己的站点能够在各种 ... -
ERP简易教程
2011-12-16 16:47 916注明:下面的帖子 ... -
GeoCon 用C#编写的开源的地理信息数据转换工具
2011-12-14 12:29 954<p class="MsoNorma ... -
JTest
2011-12-14 09:00 1027接到parasoft公司一位先生打来的电话,说下个月第 ... -
Apache License Version 2.0 英文内容及中文翻译
2011-12-13 12:59 2326</span> <p class= ... -
Java中网络操作的开源库CommonsNet
2011-12-13 12:39 813<p class="MsoNorma ... -
CSDN BLOG EXPERT
2011-12-13 08:59 1090<img src="http://p. ... -
OSGI与Android结合
2011-12-12 12:09 874将当前最优秀的OSGI框架,与当前最火热的Androi ...
相关推荐
《C# 2008坦克大战网络版(完整工程)》是一款基于C#编程语言,利用Visual Studio 2008开发环境构建的多人在线对战游戏。这款游戏的源码详细展示了如何实现网络通信、游戏逻辑控制以及图形界面设计等关键知识点。...
【标题】"用c#编写的坦克大战(c#版)"揭示了这是一个使用C#编程语言实现的经典游戏——坦克大战的复刻版本。在C#这种面向对象的语言环境下,开发者可能利用其强大的类库和面向对象特性来构建游戏逻辑。 【描述】...
Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作各种类型的游戏,包括网络版的坦克大战。本资源提供了完整的坦克大战素材和源码,对于初学者或者希望深入了解Unity网络游戏开发的人来说,是一个很好的学习资料...
1. **源代码示例**:网络上有许多开源的坦克大战实现,可以通过阅读代码了解游戏逻辑。 2. **编程教程**:如Python、C#、Java等语言的入门教程,帮助理解游戏开发基础。 3. **图形与音频库**:如pygame(Python)、...
《Unity游戏项目源码 3D坦克大战 完整版》是一个基于Unity 3D引擎开发的游戏项目,它提供了一套完整的源代码供学习和参考。Unity 3D是目前非常流行的游戏开发平台,尤其在3D游戏领域,其强大的图形渲染能力、丰富的...
但是毕业后十几年都没有编过程序,干的工作有抄水电表,网管,销售工作,最近发现人渐渐老去,有心愿未了,于是最近跟着网络视频教学,学习了一下VC++和面向对象编程,就自已小时候最爱玩的坦克大战为练习,来熟悉和...
在《坦克大战》这款游戏中,基础的编程语言是C#,这是Unity的主要脚本语言。开发者可以通过编写C#脚本来控制坦克的移动、射击、碰撞检测以及敌我识别等游戏逻辑。同时,Unity的组件式架构使得游戏对象(如坦克、炮弹...
《坦克大战Unity简单案例解析——Tank_Tank_palacewgz_Unity简单案例-坦克大战_express5oc_》 在游戏开发领域,Unity引擎因其强大的跨平台能力和丰富的资源库而备受青睐。本项目"Tank_Tank_palacewgz_Unity简单案例...
《Unity3D构建坦克大战游戏解析》 Unity3D是一款强大的跨平台游戏开发工具,以其高效的游戏引擎和直观的可视化编辑界面,深受开发者喜爱。在本项目“Unity3D制作的90坦克大战”中,开发者利用Unity3D构建了一个经典...
《坦克大战:Unity3D与.NET开发的游戏编程之旅》 在技术日新月异的今天,我们有时会怀念起那些简单却充满乐趣的经典游戏。"dotnet-坦克大战小霸王经典游戏"就是一个将怀旧情怀与现代技术相结合的项目,它使用Unity...
【描述】: "C#开发基于Unity开发的3D坦克大战游戏成品源码.zip" 提供了完成的源代码,开发者可以深入学习游戏逻辑、物理模拟、3D建模以及用户交互等方面的实现。Unity是一个跨平台的游戏开发工具,支持Windows、Mac...
《Unity坦克大战无尽地牢版源码》是一款基于Unity引擎开发的双人合作游戏项目,旨在提供一个学习和二次开发的平台。本项目涵盖了Unity3D游戏开发的多个核心知识点,包括游戏逻辑、场景构建、角色控制、碰撞检测、...
本资源是一份关于坦克大战游戏的完整源代码,专为WP8系统设计。通过深入研究这份源码,开发者可以了解如何利用WP8的API和技术进行游戏开发。 坦克大战是一款经典的多人对战游戏,它融合了策略和动作元素,玩家需要...
总的来说,坦克大战Demo集成了许多IT技术,包括但不限于游戏开发、图形编程、网络通信、数据管理等,体现了开发者谭建冲全面的IT技能和创新思维。这样的项目不仅提供了娱乐体验,也为其他开发者提供了学习和借鉴的...
《坦克大战》是一款经典的街机游戏,源自1985年由日本南梦宫公司开发的《坦克战记》(Battle City)。本游戏以其简单的操作、趣味的策略性和丰富的关卡设计,深受玩家喜爱,历经多年仍具有较高的娱乐价值。在这个名...