Rust专项——Rust实战案例:王语嫣大战游坦之(王语嫣客户端与游坦之客户端)

Rust探索之旅・开发者技术创作征文活动 10w+人浏览 724人参与

本节将详细讲解王语嫣客户端(client_yuyang)与(client_tanzhi)的实现,配合服务器端和游坦之客户端,可本地或局域网回合对战。


连接成功
在这里插入图片描述
在这里插入图片描述

1. 客户端概述

  • 通过TCP连接服务器,自动分配角色为“王语嫣”
  • 实时接收并打印服务器广播的状态、指令与结果
  • 每当轮到自己时,会自动提示输入(attack/skill/defend),并发送指令给服务器,等待对方操作
  • 断线或胜负后,给出总结输出

2. 架构与交互流程

  • 建议项目结构
    • client_yuyang/
      • Cargo.toml
      • src/
        • main.rs(下方给出)
  • 网络目标地址设为本地127.0.0.1:6123,便于本机实验
  • 只需运行服务器与两个客户端,即可回合对战

3. 完整客户端代码(main.rs)

use std::io::{self, BufRead, BufReader, Write};
use std::net::TcpStream;

fn main() {
    let mut stream = TcpStream::connect("127.0.0.1:6123").expect("无法连接服务器");
    let mut reader = BufReader::new(stream.try_clone().unwrap());

    let mut welcome = String::new();
    reader.read_line(&mut welcome).unwrap();
    print!("{}", welcome);

    loop {
        let mut server_msg = String::new();
        if reader.read_line(&mut server_msg).is_err() || server_msg.is_empty() {
            println!("服务器已断开"); break;
        }
        print!("{}", server_msg);

        if server_msg.contains("请输入") || server_msg.contains("请选择") {
            print!("> ");  // ***增加手动操作符提示符
            io::stdout().flush().unwrap();

            let mut input = String::new();
            if let Ok(_) = io::stdin().read_line(&mut input) {
                stream.write_all(input.as_bytes()).unwrap();
                stream.flush().unwrap();
            } else {
                println!("输入读取失败,请直接键入英文attack/skill/defend并回车");
            }
        }
        if server_msg.contains("胜利") {
            println!("游戏结束。");
            break;
        }
    }
}

4. 启动与调试方法

  • 建议使用VSCode终端或多窗口cmd分别运行服务器和两个客户端
  • 保证服务器先开启:cargo run 启动wang_vs_you
  • 随后分别进入client_yuyang和另一个客户端目录,均用cargo run启动
  • 按屏幕提示输入 attack/skill/defend…

5. 调试与扩展建议

  • 若本地实测发现断线、显示乱码,可尝试更换终端或补充错误处理
  • 客户端设计解耦,便于增加图形化、外挂AI(自动出招)
  • 扩展支持:服务器IP/端口在启动参数里自定义,更贴合实际分布式部署

本案例适合 Rust 并发、网络、命令行工程入门及实践训练。配合服务器端和游坦之客户端一同使用体验最佳!

1. 客户端功能说明

  • 以TCP方式连接服务器(本地 127.0.0.1:6123),被分配为游坦之角色
  • 实时接收服务器所有的“回合状态”、“轮到你操作”、回合结算/胜负信息
  • 每当服务器通知“轮到你”时,自主输入(attack/skill/defend),发送操作给服务器
  • 游戏结束或断线时自动退出循环

2. 项目结构建议

建议如下目录:

  • client_tanzhi/
    • Cargo.toml
    • src/
      • main.rs(如下代码)

启动与王语嫣、服务器对应,无需特殊区分,体验上完全独立。


3. 完整客户端代码(main.rs)

use std::io::{self, BufRead, BufReader, Write};
use std::net::TcpStream;

fn main() {
    let mut stream = TcpStream::connect("127.0.0.1:6123").expect("无法连接服务器");
    let mut reader = BufReader::new(stream.try_clone().unwrap());

    let mut welcome = String::new();
    reader.read_line(&mut welcome).unwrap();
    print!("{}", welcome);

    loop {
        let mut server_msg = String::new();
        if reader.read_line(&mut server_msg).is_err() || server_msg.is_empty() {
            println!("服务器已断开"); break;
        }
        print!("{}", server_msg);

        if server_msg.contains("请输入") || server_msg.contains("请选择") {
            print!("> ");  // ***增加手动操作符提示符
            io::stdout().flush().unwrap();

            let mut input = String::new();
            if let Ok(_) = io::stdin().read_line(&mut input) {
                stream.write_all(input.as_bytes()).unwrap();
                stream.flush().unwrap();
            } else {
                println!("输入读取失败,请直接键入英文attack/skill/defend并回车");
            }
        }
        if server_msg.contains("胜利") {
            println!("游戏结束。");
            break;
        }
    }
}

4. 启动与联调说明

  • 启动顺序:建议先开服务器,再分别运行两个客户端
  • 每个客户端可单独终端,可支持本地或局域网回合对战
  • 按提示输入操作(attack/skill/defend),观战效果实时反馈

5. 扩展建议

  • 加入AI托管、GUI或网络参数可选、重连机制等
  • 通用框架便于团队扩展多角色/多人协作等场景

本客户端适合与服务器端、王语嫣端一同组合训练网络与并发、项目拆解与工程化能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红目香薰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值