C#编写游戏客户端的实现代码

作者:伊始不觉 时间:2021-08-28 06:24:58 

一、连接客户端原理流程图

C#编写游戏客户端的实现代码

二、功能要求

1)连接成功后,可以将服务器发来的消息不停地显示在 listbox 中;
2) 客户端要发给服务器的数据,通过 textbox输入 或者点击button;
3) 能够播放背景音乐;
4) 每隔30秒,变换一次游戏背景图片。

三、代码实现

新建一个Windows窗体应用

C#编写游戏客户端的实现代码

下面是界面的布置,记得还有一个Timer,并且timer要使能,interval也要设置,这里3000为3秒

C#编写游戏客户端的实现代码

定义的变量


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#编写游戏客户端的实现代码

四、总结

C#做可视化界面很方便,比QT还简单,代码格式有点像Java,基本上可以直接上手了,搭建网络连接也很方便,不过有时候界面的设置不小心就看过了。这次还是遇到麻烦的,本来想用Windows media player来播放音乐,但因为电脑一直更新走的,版本不适配用不了,最后用的是自带的播放器,只能播放wav文件,直接改后缀还不行,需要转化一下。

五、参考

编写一个网游客户端

C# 中使用GB2312或GBK编码报错

来源:https://blog.csdn.net/junseven164/article/details/121481789

标签:C#,游戏,客户端
0
投稿

猜你喜欢

  • Java操作IO对象流进行数据的读写

    2021-08-25 03:33:49
  • JavaMail实现发送超文本(html)格式邮件的方法

    2022-09-22 17:11:15
  • Java SpringBoot拦截器详解

    2021-11-01 15:29:37
  • Mybatis源码解析之事务管理

    2023-01-14 10:59:34
  • Mybatis SqlSessionFactory与SqlSession详细讲解

    2021-12-24 22:42:56
  • android view实现横向滑动选择

    2022-04-26 11:28:48
  • 深入解析JVM之内存结构及字符串常量池(推荐)

    2023-01-02 19:48:20
  • 为什么阿里要慎重使用ArrayList中的subList方法

    2023-12-07 19:03:34
  • 不使用Math.random方法生成随机数(随机数生成器)

    2021-11-28 05:08:46
  • unity使用射线实现贴花系统

    2023-04-23 10:22:00
  • 自定义Android圆形进度条(附源码)

    2023-09-09 22:54:57
  • Android崩溃异常捕获方法

    2022-08-24 08:26:12
  • C#实现复杂XML的序列化与反序列化

    2023-12-19 05:09:45
  • Android WebView的使用方法总结

    2022-08-23 22:14:02
  • C#调用CMD命令实例

    2021-06-17 10:08:12
  • SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    2021-11-27 06:37:22
  • c#取得控制台应用程序根目录

    2023-06-16 14:25:44
  • android studio使用SQLiteOpenHelper()建立数据库的方法

    2023-10-28 12:50:35
  • C#调用VB进行简繁转换的方法

    2023-02-25 23:19:43
  • c# 剔除sql语句'尾巴'的五种方法

    2022-09-20 16:32:39
  • asp之家 软件编程 m.aspxhome.com