游戏客户端编程

实验要求

连接成功后,可以将服务器发来的消息不停地显示在 listbox 中;

  1. 客户端要发给服务器的数据,通过 textbox输入 或者点击button;

  2. 能够播放背景音乐;

  3. 每隔30秒,变换一次游戏背景图片。

实现代码

创建新项目,取名为game
在这里插入图片描述
界面布置:
在这里插入图片描述
定义的变量:

 private NetworkStream stream;
        private TcpClient tcpClient;

        SoundPlayer player = new SoundPlayer("D:\下载\jtbw.wav");
        //定义发送数据的套接字
        Socket socket_send;

receiver_stream函数,功能是接收网络流并显示在listbox里显示
/*
* 将字节流用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;
            }
        }

效果:
在这里插入图片描述
参考文献:https://blog.csdn.net/junseven164/article/details/121481789?spm=1001.2014.3001.5501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络游戏编程客户代码的具体实现方式会因不同游戏引擎和编程语言而有所不同,下面是一个简单的示例代码,供参考: ```c++ #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { // 初始化 Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "WSAStartup failed: " << WSAGetLastError() << std::endl; return 1; } // 创建 socket SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { std::cerr << "socket failed: " << WSAGetLastError() << std::endl; WSACleanup(); return 1; } // 连接服务器 SOCKADDR_IN serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器 IP 地址 serverAddr.sin_port = htons(12345); // 服务器口号 if (connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "connect failed: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } // 发送数据 std::string message = "Hello, server!"; if (send(sock, message.c_str(), message.length(), 0) == SOCKET_ERROR) { std::cerr << "send failed: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } // 接收数据 char buffer[1024]; int bytesReceived = recv(sock, buffer, sizeof(buffer), 0); if (bytesReceived == SOCKET_ERROR) { std::cerr << "recv failed: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } buffer[bytesReceived] = '\0'; std::cout << "Received message from server: " << buffer << std::endl; // 关闭 socket closesocket(sock); // 清理 Winsock WSACleanup(); return 0; } ``` 该示例代码使用了 Windows 平台下的 Winsock API,通过创建 socket 连接服务器,并发送和接收数据。在使用时需要注意正确填写服务器 IP 地址和口号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值