引言:为什么用 Rust 写小游戏?

作为一门以「安全、高效、优雅」著称的语言,Rust 不仅适合系统编程,也能用来开发轻量级小游戏。CMD 对话框游戏无需复杂的图形界面,核心在于场景逻辑、用户交互、状态管理,而 Rust 的结构体、枚举、模式匹配等特性恰好能完美支撑这些需求。本文将带大家从零开始,实现一款「攻略女神」主题的 CMD 小游戏,全程单类封装,代码简洁易懂,同时兼顾游戏趣味性和 Rust 语法实践。

一、游戏核心设计思路
1. 游戏定位与玩法

这是一款「文字冒险 + 选择分支」类游戏,玩家通过在不同场景中做出选择,提升女神的好感度,最终达成「告白成功」结局。核心玩法:

  • 场景递进:从「初遇」到「告白」,共 5 个连贯场景,每个场景的选择影响好感度;
  • 好感度机制:初始 30 分,≥80 分告白成功,反之失败;
  • 交互方式:CMD 中输入数字选择行动,搭配打字机效果增强沉浸感。
2. 核心功能模块

用 GoddessGame 结构体封装所有游戏逻辑,避免全局变量,符合 Rust 的封装理念:

模块 功能描述 实现方式
状态管理 好感度、当前场景、游戏是否结束 结构体字段(favorabilitycurrent_scene等)
场景逻辑 5 个核心场景 + 2 个结局,按流程递进 枚举Scene+ 模式匹配match
用户交互 选项展示、输入读取、合法性校验 print_options+get_user_choice
视觉增强 文字逐字输出(打字机效果) print_with_typewriter+ 线程休眠
3. 女神人设与场景设计

为了让游戏更有代入感,设计了「林晚晴」这一角色:

  • 人设:温柔内敛、喜欢文学(加缪)、慢热、注重细节、讨厌敷衍;
  • 场景设计逻辑:遵循「陌生人→熟悉→暧昧→告白」的情感递进,每个场景都贴合现实社交场景(图书馆初遇、雨天送伞、生日送礼等),选择项对应「真诚」「敷衍」「中立」三种态度,让玩家有代入感。
二、Rust 语法核心应用
use std::io;
use std::thread;
use std::time::Duration;

fn main() {
    // 游戏核心数据(极简:仅好感度)
    let mut favor = 30; // 初始好感度
    let goddess = "林晚晴";

    // 开场
    println!("=== 攻略女神:遇见{} ===", goddess);
    println!("目标:好感度≥60 即可成功!\n");
    thread::sleep(Duration::from_secs(1));

    // 情节1:第一次相遇
    println!("【情节1:图书馆偶遇】");
    println!("你撞到了{},她的书掉了一地~", goddess);
    println!("1. 道歉+帮捡书+聊她喜欢的作家");
    println!("2. 只说“不好意思”就走");
    print!("选1或2:");
    let choice1 = get_simple_choice();

    // 处理情节1选择
    match choice1 {
        1 => {
            println!("\n{}眼睛一亮:“你也喜欢加缪?太巧了!”", goddess);
            favor += 25; // 好感度+25
        }
        2 => {
            println!("\n{}轻声说“没关系”,有点失落", goddess);
            favor -= 5; // 好感度-5
        }
        _ => {
            println!("\n输入错啦,默认选2~");
            favor -= 5;
        }
    }
    println!("❤️ 当前好感度:{}", favor);
    thread::sleep(Duration::from_secs(2));

    // 情节2:邀请约会
    println!("\n【情节2:邀请她喝咖啡】");
    println!("告别时,你想邀请{}下次见面~", goddess);
    println!("1. 认真说:“下周有咖啡沙龙,一起去?”");
    println!("2. 不说,直接走");
    print!("选1或2:");
    let choice2 = get_simple_choice();

    // 处理情节2选择
    match choice2 {
        1 => {
            println!("\n{}笑着答应:“好呀!”", goddess);
            favor += 20; // 好感度+20
        }
        2 => {
            println!("\n你没邀请,{}慢慢忘了你", goddess);
            favor += 0; // 好感度不变
        }
        _ => {
            println!("\n输入错啦,默认选2~");
            favor += 0;
        }
    }
    println!("❤️ 最终好感度:{}", favor);
    thread::sleep(Duration::from_secs(1));

    // 结局
    println!("\n===== 结局 =====");
    if favor >= 60 {
        println!("🎉 攻略成功!{}答应和你正式交往~", goddess);
    } else {
        println!("💔 攻略失败~ 下次多主动一点呀!");
    }
}

/// 极简输入处理:只认1和2,其他返回0
fn get_simple_choice() -> i32 {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    // 只解析1或2,其他返回0(默认处理)
    match input.trim().parse() {
        Ok(1) => 1,
        Ok(2) => 2,
        _ => 0,
    }
}
1. 结构体 + 枚举:封装状态与场景
1. 初始化游戏(new 方法)

设定初始状态:好感度 30 分,初始场景为「初遇」,游戏未结束,同时初始化女神人设:

三、完整实现步骤拆解

2. 测试用例(成功结局路径)

选择以下选项,可触发成功结局:

五、优化与扩展方向

六、总结:Rust 小游戏开发的核心心得

这款游戏虽然简单,但涵盖了 Rust 开发的核心语法和设计思想。通过实践,你不仅能写出一款有趣的小游戏,还能加深对结构体、枚举、模式匹配、输入输出等知识点的理解。如果想进一步扩展,还可以尝试添加图形界面(用 ratatui 库)或网络功能(多人联机攻略),让游戏更具可玩性。

最后,祝大家都能在代码中「攻略女神」,也能在 Rust 学习中不断进步!🚀

  • 结构体 GoddessGame:存储游戏状态(好感度、当前场景)和女神人设,实现「单类封装」;
  • 枚举 Scene:定义所有场景和结局,用模式匹配match处理场景切换,逻辑清晰:
    三、完整实现步骤拆解
    1. 初始化游戏(new 方法)

    设定初始状态:好感度 30 分,初始场景为「初遇」,游戏未结束,同时初始化女神人设:

    2. 交互逻辑:输入输出处理

    Rust 标准库 std::io 模块处理 CMD 输入输出,关键优化:

  • 输入合法性校验:用 parse 解析输入,判断是否为 1-3 的数字,避免无效输入崩溃;
  • 打字机效果:逐字符打印文字,搭配 std::time::Duration 休眠,模拟真实聊天节奏:
  • 正向选择(真诚、用心):好感度 + 15~30 分;
  • 负向选择(敷衍、冷漠):好感度 - 5~20 分;
  • 结局判断:告白场景中根据好感度是否≥80 分,切换「成功」或「失败」结局。
    3. 状态更新:好感度机制

    好感度是游戏的核心驱动,每个选择对应不同的好感度变化,最终决定结局:三、完整实现步骤拆解

  • 1. 初始化游戏(new 方法)

    设定初始状态:好感度 30 分,初始场景为「初遇」,游戏未结束,同时初始化女神人设:

    三、完整实现步骤拆解
    1. 初始化游戏(new 方法)

    设定初始状态:好感度 30 分,初始场景为「初遇」,游戏未结束,同时初始化女神人设:

    四、游戏运行与测试
    1. 环境准备
  • 安装 Rust 环境(官网教程);
  • 创建项目:cargo new goddess_game,将上述代码替换 src/main.rs
  • 运行游戏:cargo run,即可在 CMD 中开始游戏。
  • 初遇:选择「1. 慌忙道歉,帮她捡书,问喜欢的作家」(+15→45);
  • 邀请咖啡:选择「1. 认真说咖啡沙龙邀请」(+20→65);
  • 雨天偶遇:选择「1. 主动送她回家」(+25→90);
  • 生日送礼:选择「1. 送加缪签名版《局外人》」(+30→120);
  • 告白:选择「1. 真诚告白」(好感度≥80→成功)。
  • 增加更多场景:比如「共同旅行」「见朋友」等,丰富剧情分支;
  • 加入随机事件:比如女神生病、工作受挫,增加游戏不确定性;
  • 保存 / 读取进度:用 serde 库将游戏状态序列化到文件,支持续玩;
  • 多结局设计:除了「成功 / 失败」,可增加「朋友之上恋人未满」等中间结局。
  • 单类封装逻辑:用结构体将状态和方法绑定,避免全局变量,符合 Rust 的「所有权」思想;
  • 模式匹配的威力:枚举 +match 让场景切换逻辑清晰,比 if-else 更易维护;
  • 细节决定体验:打字机效果、好感度实时显示等小细节,能大幅提升玩家沉浸感;
  • 输入输出容错:必须处理无效输入,避免游戏崩溃,体现 Rust 的「安全」特性。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐