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编码报错

到此这篇关于C#编写游戏客户端的文章就介绍到这了,更多相关C#编写游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#十五子游戏编写代码

    本文实例为大家分享了C#十五子游戏的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;

  • 利用C#编写扫雷游戏(附源码)

    前言 翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windows系统下的扫雷小游戏. 首先讲下扫雷小游戏的玩法: (1)扫雷就是要把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败. (2)当点开的格子不是地雷区域的时候,该格子会显示一个数字,该数字表示的含义就是该格子周边有多少个地雷. (3)同时点开的如果非地雷的格子,周边连贯的非地雷区域都会自动被

  • C#编写控制台程序纸牌游戏

    本文实例为大家分享了C#编写纸牌游戏的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication2 { class Game { string[] str = new string[52]; int[] number = new int[52]; int i = 0; int[] a

  • c# 编写的简单飞行棋游戏

    目录 项目效果 实现代码 基于winform制作的图形界面程序 效果 代码 项目效果 实现代码 using System; namespace 飞行棋项目 { class Program { ///1.画游戏头 ///2.初始化地图 ///把整数数组中数字编程控制台中显示的特殊字符显示的过程,就是初始化地图 ///3.画地图 ///4.玩游戏 //我们用静态数组用来模拟全局变量,这个数组代表地图长度以及地图坐标 public static int[] Maps = new int[100]; /

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

    一.连接客户端原理流程图 二.功能要求 1)连接成功后,可以将服务器发来的消息不停地显示在 listbox 中: 2) 客户端要发给服务器的数据,通过 textbox输入 或者点击button: 3) 能够播放背景音乐; 4) 每隔30秒,变换一次游戏背景图片. 三.代码实现 新建一个Windows窗体应用 下面是界面的布置,记得还有一个Timer,并且timer要使能,interval也要设置,这里3000为3秒 定义的变量 private NetworkStream stream; priv

  • C++编写的WebSocket服务端客户端实现示例代码

    目录 使用过标准的libwebsockets服务端库测试过,主要是短小精悍,相对于libwebsockets不需要依赖zlib和openssl 以及其他库,直接make就可以使用了,linux跟windows都可以使用. 测试用例: #include "easywsclient.hpp" #include <assert.h> #include <stdio.h> #include <string> using easywsclient::WebSo

  • Java thrift服务器和客户端创建实例代码

    Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的.高效的服务. Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器.thrift允许你定义一个简单的定义文

  • java fastdfs客户端使用实例代码

    本文研究的主要是java fastdfs客户端使用实例的相关内容,具体实现如下. 什么是FastDFS? FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务. FastDFS架构 FastDFS架构包括 Tracker server和Storage server.客户端请求Tracker server进行文件

  • C#基于TCP实现简单游戏客户端的完整实例

    目录 一.界面 二.代码 1.播放音频 2.播放图片 3.登录和退出游戏 4.命令交互 5.信息展示 6.最终代码 三.效果 四.总结 五.参考 一.界面 左上方播放音频按钮和停止播放下面是图片展示再下面是进入游戏以及退出游戏最后是命令输入框右边是消息框 二.代码 1.播放音频 需要用到WindowsMediaPlayer组件,在常规组件的选择项里面可以找到. 实现代码 private void start_Click(object sender, EventArgs e) { //新建线程打开

  • Java实现断点下载服务端与客户端的示例代码

    目录 原理 扩展-大文件快速下载思路 代码 服务端 客户端 最近在研究断点下载(下载续传)的功能,此功能需要服务端和客户端进行对接编写,本篇也是记录一下关于贴上关于实现服务端(Spring Boot)与客户端(Android)是如何实现下载续传功能 断点下载功能(下载续传)解释: 客户端由于突然性网络中断等原因,导致的下载失败,这个时候重新下载,可以继续从上次的地方进行下载,而不是重新下载 原理 首先,我们先说明了断点续传的功能,实际上的原理比较简单 客户端和服务端规定好一个规则,客户端传递一个

  • C语言实现24点游戏计算器的示例代码

    目录 前言 一.项目的创建标 二.项目的编写 三.项目的调试结果 前言 24点游戏计算器的规则如下 24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,它能在游戏中提高人们的心算能力. 24点通常是使用扑克牌来进行游戏的,一副牌中抽去大小王后还剩下52张(如果初练也可只用1-10这40张牌),任意抽取4张牌(称为牌组),用加.减.乘.除(可加括号)把牌面上的数算成24.每张牌必须只能用一次,如

  • 如何编写一个过滤掉HTML代码的函数?

    如何编写一个过滤掉HTML代码的函数?<%Function Filterhtml(strToFilter)  Dim strTemp  strTemp = strToFilter  While Instr(1,strTemp,"<") AND Instr(1, strTemp, ">")    strTemp = Left(strTemp, Instr(1, strTemp, "<")-1) & Right(str

  • 如何利用Promises编写更优雅的JavaScript代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. Promises 易于阅读 比如说我们想从 HipsterJesus 的API中抓取一些数据并将这些数据添加到我们的页面中.这些 API 的响应数据形式如下: { "text": "<p>Lorem ipsum...<

  • 编写针对IE的JS代码两种编写方法

    有些时候我们需要针对某些IE下的兼容性写单独的JS处理代码.有多种做法: 1.通过检测navigation.userAgent来判断是否是IE,再编写IE分支的处理代码: 2.通过声明@cc_on 语句可以在脚本的注释内启用条件编译功能,这样对于非IE浏览器就会将识别为注释而忽略(实测,这种方式在IE6-9将适用!): 复制代码 代码如下: /*@cc_on @if (@_jscript) alert("hello world"); @end @*/

随机推荐