C#编写游戏客户端的实现代码
作者:伊始不觉 发布时间:2021-08-28 06:24:58
标签:C#,游戏,客户端
一、连接客户端原理流程图
二、功能要求
1)连接成功后,可以将服务器发来的消息不停地显示在 listbox 中;
2) 客户端要发给服务器的数据,通过 textbox输入 或者点击button;
3) 能够播放背景音乐;
4) 每隔30秒,变换一次游戏背景图片。
三、代码实现
新建一个Windows窗体应用
下面是界面的布置,记得还有一个Timer,并且timer要使能,interval也要设置,这里3000为3秒
定义的变量
private NetworkStream stream;
private TcpClient tcpClient;
SoundPlayer player = new SoundPlayer("D:/新建文件夹 (2)/p3r68-cdx67/59tp0-mg2nx.wav");
//定义发送数据的套接字
Socket socket_send;
receiver_stream函数,功能是接收网络流并显示在listbox里显示,其中关于GBK的编码请参考这里
C# 中使用GB2312或GBK编码报错
/*
* 将字节流用GBK格式编码在listbox里显示
*/
void receive_stream()
{
byte[] receive_data = new byte[1024];
//定义编码格式
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);//为使用GB2312做准备
System.Text.Encoding GBK = System.Text.Encoding.GetEncoding("GBK");
if (stream.CanRead)
{
int len = stream.Read(receive_data, 0, receive_data.Length);
string msg = GBK.GetString(receive_data, 0, receive_data.Length);
string str = "\r\n";
char[] str1 = str.ToCharArray();
//乱码集合
string[] messy_code = { "??[2J ", "[5m", "[44m", "[37;0m", "[1;33m", "[1;32m", "[1;31m" };
string[] msg1 = msg.Split(str1);//以换行符为分隔符
for (int j = 0; j < msg1.Length; j++)//逐行显示
{
//过滤乱码
msg1[j] = msg1[j].Replace(messy_code[0], " ");
msg1[j] = msg1[j].Replace(messy_code[1], " ");
msg1[j] = msg1[j].Replace(messy_code[2], " ");
msg1[j] = msg1[j].Replace(messy_code[3], " ");
msg1[j] = msg1[j].Replace(messy_code[4], " ");
msg1[j] = msg1[j].Replace(messy_code[5], " ");
msg1[j] = msg1[j].Replace(messy_code[6], " ");
listBox1.Items.Add(msg1[j]);
}
}
}
send_stream函数,发送网络流的函数
void send_stream(string str)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);//为使用GB2312做准备
System.Text.Encoding GBK = System.Text.Encoding.GetEncoding("GBK");
byte[] buffer = GBK.GetBytes(str+"\n");
stream.Write(buffer, 0, buffer.Length);
}
连接客户端
private void start_game_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
//套接字建立连接
socket_send = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Parse("10.1.230.74"), 3900);
socket_send.Connect(point);
try
{
//向指定的IP地址的服务器发送连接请求
tcpClient.Connect("10.1.230.74", 3900);
listBox1.Items.Add("连接成功");
stream = tcpClient.GetStream();
receive_stream();//接收字节流并显示在屏幕上
}
catch
{
listBox1.Items.Add("服务器未启动");
}
}
退出游戏
private void end_game_Click(object sender, EventArgs e)
{
if (stream != null)//关闭连接,关闭流
{
stream.Close();
tcpClient.Close();
socket_send.Close();
}
listBox1.Items.Add("已经退出游戏");
}
获取textbox里的值并发送
private void send_msg_Click(object sender, EventArgs e)
{
if (tcpClient.Connected) {
string action = textBox1.Text.ToString();
listBox1.Items.Add("输入的信息为:" + action);
send_stream(action);
receive_stream();
}
else
{
listBox1.Items.Add("连接已断开");
}
}
播放音乐,这里的play好像就是在子线程播放,所以不用写新线程
private void play_Click(object sender, EventArgs e)
{
player.Load();
player.Play();
}
停止播放
private void stop_Click(object sender, EventArgs e)
{
player.Stop();
}
定时切换图片
private void timer1_Tick(object sender, EventArgs e)
{
Thread th = new Thread(play_pic);
th.IsBackground=true;
th.Start();
}
void play_pic()
{
flag++;
string picturePath = @"D:\testpic\" + flag + ".jpg";
pictureBox1.Image = Image.FromFile(picturePath);
if (flag == 5)
{
flag = 0;
}
}
效果
四、总结
C#做可视化界面很方便,比QT还简单,代码格式有点像Java,基本上可以直接上手了,搭建网络连接也很方便,不过有时候界面的设置不小心就看过了。这次还是遇到麻烦的,本来想用Windows media player来播放音乐,但因为电脑一直更新走的,版本不适配用不了,最后用的是自带的播放器,只能播放wav文件,直接改后缀还不行,需要转化一下。
五、参考
编写一个网游客户端
C# 中使用GB2312或GBK编码报错
来源:https://blog.csdn.net/junseven164/article/details/121481789


猜你喜欢
- Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他
- 本文介绍了Android 仿微信自定义数字键盘的实现代码,分享给大家,希望对大家有帮助最终效果:实现这个自定义键盘的思路很简单:要写出一个数
- 前言之前学习的顺序表查询非常快,时间复杂度为O(1),但是增删改效率非常低,因为每一次增删改都会元素的移动。可以使用另一种存储方式-链式存储
- 1 前言在 Springboot 中,异步任务和定时任务是经常遇到的处理问题方式,为了能够用好这两项配置,不干扰正常的业务,需要对其进行异步
- 问题描述1.可以访问同一个文件夹下面的success.jsp文件,如图:2、却不能访问同一个文件夹下面的 index.html文件,如图:问
- 第一次写上传图片的代码,碰到很多问题。昨天做了整整一天,终于在晚上的时候成功了。大声欢呼。但是,做完之后,还是有很多问题想不通。所以在这里也
- Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较
- 本文实例讲述了Java实现插入排序的方法。分享给大家供大家参考。具体实现方法如下:import java.util.Arrays; /**
- 前言在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。集合已修
- 目录1.C语音的字符串有两种1.1字符数组1.2字符指针2.字符串常用的方法2.1strcpy字符串拼接2.2strchr字符串中查找字符2
- 线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核
- 前言我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。
- 本文实例讲述了Android中WebView用法。分享给大家供大家参考,具体如下:WebView相当于一个迷你浏览器,采用WebKit内核,
- 今天在做项目学习的过程中,需要用到文件上传,启动项目正常,访问上传post请求突然报出了一个异常,特此记录一下。1、控制台异常org.spr
- Android 调用系统相机拍摄获取照片的两种方法实现实例在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的
- 此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!!一、多数据源应用场景:1.配置文件配置多数据源,如默认
- 项目效果实现代码using System;namespace 飞行棋项目{ class Program  
- 本文实例总结了C#配置文件Section节点处理方法。分享给大家供大家参考。具体如下:很多时候在项目开发中,我们都需要用配置文件来存储一些关
- 在C语言中,函数名可以当做函数指针传递给形参从而实现回调void f1() { printf("f1()\n"); }v
- 目录Shiro简介Shiro快速入门SpringBoot-Shiro整合(最后会附上完整代码)附上最后的完整代码Shiro整合mybatis