use rand::Rng;
use std::collections::HashMap;
use std::io;
/// 聊天机器人结构体,封装所有聊天相关功能
struct ChatBot {
// 存储关键词与对应回复的映射
responses: HashMap<String, Vec<String>>,
// 默认回复,当没有匹配的关键词时使用
default_responses: Vec<String>,
// 机器人名称
name: String,
}
impl ChatBot {
/// 创建一个新的聊天机器人实例
fn new(name: &str) -> Self {
let mut responses = HashMap::new();
// 初始化关键词回复
responses.insert(
"你好".to_string(),
vec![
"你好呀!很高兴见到你~",
"嗨!有什么可以帮你的吗?",
"你好~ 今天过得怎么样?",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"再见".to_string(),
vec![
"再见啦!欢迎下次再来~",
"拜拜~ 祝你有愉快的一天!",
"下次见!记得想我哦~",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"你叫什么名字".to_string(),
vec![
"我叫{}哦~",
"你可以叫我{}",
"我的名字是{},很高兴认识你",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"天气".to_string(),
vec![
"今天天气看起来不错呢!",
"听说今天会下雨,记得带伞哦~",
"天气晴朗,适合出去走走!",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"爱好".to_string(),
vec![
"我喜欢和你聊天呀~",
"我的爱好是回答你的各种问题!",
"我最喜欢的事情就是听你分享生活~",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
// 初始化默认回复
let default_responses = vec![
"不好意思,我没太听懂你的意思...",
"能再说一遍吗?我有点没明白~",
"这个问题有点难倒我了呢...",
"我们换个话题聊聊吧?",
"嗯... 你是在说什么呀?",
]
.into_iter()
.map(|s| s.to_string())
.collect();
ChatBot {
responses,
default_responses,
name: name.to_string(),
}
}
/// 生成回复消息
fn generate_response(&self, input: &str) -> String {
let input = input.trim().to_lowercase();
// 检查是否有匹配的关键词
for (keyword, responses) in &self.responses {
if input.contains(keyword.to_lowercase().as_str()) {
let mut rng = rand::thread_rng();
let index = rng.gen_range(0..responses.len());
let response = &responses[index];
// 如果回复中包含占位符,替换为机器人名称
return if response.contains("{}") {
response.replace("{}", &self.name)
} else {
response.clone()
};
}
}
// 如果没有匹配的关键词,返回随机默认回复
let mut rng = rand::thread_rng();
let index = rng.gen_range(0..self.default_responses.len());
self.default_responses[index].clone()
}
/// 启动聊天程序
fn start_chat(&self) {
println!("欢迎来到聊天对话框!");
println!("你可以和{}聊天啦~ 输入 '退出' 结束聊天", self.name);
println!("----------------------------------------");
loop {
// 获取用户输入
print!("你: ");
io::Write::flush(&mut io::stdout()).unwrap();
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("无法读取输入");
let input = input.trim();
// 检查是否退出
if input.eq_ignore_ascii_case("退出") {
println!("{}: 再见啦!下次见~", self.name);
break;
}
// 生成并显示回复
let response = self.generate_response(input);
println!("{}: {}", self.name, response);
println!("----------------------------------------");
}
}
}
fn main() {
// 创建聊天机器人实例并启动聊天
let chat_bot = ChatBot::new("小R");
chat_bot.start_chat();
}
在当今数字化时代,命令行工具依然有着不可替代的地位。本文将带您使用 Rust 语言实现一个简单但功能完整的命令行聊天对话框小游戏,通过这个项目,我们不仅能学习 Rust 的基础语法,还能掌握输入输出处理、字符串操作等实用技能。
项目介绍
这个聊天对话框小游戏模拟了一个简单的对话系统,用户可以与程序进行交互聊天。程序会根据用户输入的关键词做出不同回应,包含预设的对话逻辑和随机回复功能,让聊天过程更加生动有趣。
技术要点
- Rust 基本语法与数据类型
- 标准输入输出处理
- 字符串操作与匹配
- 随机数生成
- 循环控制流程
- 结构体与方法的使用
完整代码实现
下面是完整的 Rust 代码实现,我们将所有功能封装在一个结构体中,确保代码的封装性和可维护性:
rust
use rand::Rng;
use std::collections::HashMap;
use std::io;
/// 聊天机器人结构体,封装所有聊天相关功能
struct ChatBot {
// 存储关键词与对应回复的映射
responses: HashMap<String, Vec<String>>,
// 默认回复,当没有匹配的关键词时使用
default_responses: Vec<String>,
// 机器人名称
name: String,
}
impl ChatBot {
/// 创建一个新的聊天机器人实例
fn new(name: &str) -> Self {
let mut responses = HashMap::new();
// 初始化关键词回复
responses.insert(
"你好".to_string(),
vec![
"你好呀!很高兴见到你~",
"嗨!有什么可以帮你的吗?",
"你好~ 今天过得怎么样?",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"再见".to_string(),
vec![
"再见啦!欢迎下次再来~",
"拜拜~ 祝你有愉快的一天!",
"下次见!记得想我哦~",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"你叫什么名字".to_string(),
vec![
"我叫{}哦~",
"你可以叫我{}",
"我的名字是{},很高兴认识你",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"天气".to_string(),
vec![
"今天天气看起来不错呢!",
"听说今天会下雨,记得带伞哦~",
"天气晴朗,适合出去走走!",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
responses.insert(
"爱好".to_string(),
vec![
"我喜欢和你聊天呀~",
"我的爱好是回答你的各种问题!",
"我最喜欢的事情就是听你分享生活~",
]
.into_iter()
.map(|s| s.to_string())
.collect(),
);
// 初始化默认回复
let default_responses = vec![
"不好意思,我没太听懂你的意思...",
"能再说一遍吗?我有点没明白~",
"这个问题有点难倒我了呢...",
"我们换个话题聊聊吧?",
"嗯... 你是在说什么呀?",
]
.into_iter()
.map(|s| s.to_string())
.collect();
ChatBot {
responses,
default_responses,
name: name.to_string(),
}
}
/// 生成回复消息
fn generate_response(&self, input: &str) -> String {
let input = input.trim().to_lowercase();
// 检查是否有匹配的关键词
for (keyword, responses) in &self.responses {
if input.contains(keyword.to_lowercase().as_str()) {
let mut rng = rand::thread_rng();
let index = rng.gen_range(0..responses.len());
let response = &responses[index];
// 如果回复中包含占位符,替换为机器人名称
return if response.contains("{}") {
response.replace("{}", &self.name)
} else {
response.clone()
};
}
}
// 如果没有匹配的关键词,返回随机默认回复
let mut rng = rand::thread_rng();
let index = rng.gen_range(0..self.default_responses.len());
self.default_responses[index].clone()
}
/// 启动聊天程序
fn start_chat(&self) {
println!("欢迎来到聊天对话框!");
println!("你可以和{}聊天啦~ 输入 '退出' 结束聊天", self.name);
println!("----------------------------------------");
loop {
// 获取用户输入
print!("你: ");
io::Write::flush(&mut io::stdout()).unwrap();
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("无法读取输入");
let input = input.trim();
// 检查是否退出
if input.eq_ignore_ascii_case("退出") {
println!("{}: 再见啦!下次见~", self.name);
break;
}
// 生成并显示回复
let response = self.generate_response(input);
println!("{}: {}", self.name, response);
println!("----------------------------------------");
}
}
}
fn main() {
// 创建聊天机器人实例并启动聊天
let chat_bot = ChatBot::new("小R");
chat_bot.start_chat();
}
代码解析
结构体设计
我们定义了 ChatBot 结构体作为核心,包含三个字段:
-
responses: 一个哈希映射,存储关键词与对应回复集合的关系 -
default_responses: 当没有匹配的关键词时使用的默认回复集合 -
name: 聊天机器人的名称
初始化方法
new 方法负责初始化聊天机器人,设置预设的关键词回复和默认回复。我们为常见的对话场景(如问候、告别、询问名字等)设置了相应的回复,使机器人能应对基本的聊天需求。
回复生成逻辑
generate_response 方法实现了核心的回复生成功能:
- 先将用户输入转换为小写,实现不区分大小写的匹配
- 检查输入中是否包含预设的关键词
- 如果找到匹配的关键词,从对应的回复集合中随机选择一条回复
- 如果回复中包含占位符
{}, 则替换为机器人的名字 - 如果没有匹配的关键词,则从默认回复集合中随机选择一条
聊天启动流程
start_chat 方法实现了聊天的主循环:
- 显示欢迎信息和使用说明
- 循环读取用户输入
- 检查用户是否输入 "退出",如果是则结束聊天
- 生成回复并显示
- 继续等待下一次输入
如何运行
- 首先确保您的系统中安装了 Rust 环境,如果没有可以通过 rustup 安装
- 创建一个新的 Rust 项目:
cargo new chat_bot - 进入项目目录:
cd chat_bot - 编辑
Cargo.toml文件,添加随机数依赖:toml
[dependencies] rand = "0.8" - 将上面的代码复制到
src/main.rs文件中 - 运行程序:
cargo run
功能扩展思路
这个基础版本的聊天机器人可以通过以下方式进行扩展:
- 增加更多关键词和回复:丰富对话内容,让机器人能应对更多话题
- 添加对话状态管理:使机器人能记住之前的对话内容,实现上下文关联的回复
- 实现更复杂的匹配算法:使用模糊匹配或正则表达式,提高关键词识别的灵活性
- 添加学习功能:让机器人能记录新的对话模式,不断 "学习" 新的回复
- 支持多语言:扩展为支持多种语言的聊天机器人
- 添加游戏元素:引入问答游戏、猜谜等互动小游戏
总结
通过这个项目,我们学习了如何使用 Rust 实现一个简单的命令行聊天程序。这个项目虽然简单,但涵盖了 Rust 编程中的多个重要概念,包括结构体、方法、哈希映射、输入输出处理和随机数生成等。
Rust 的所有权系统和类型安全特性确保了我们的程序具有良好的内存安全性和稳定性。同时,Rust 标准库提供的丰富功能让我们能够轻松实现命令行交互等功能。
这个聊天机器人可以作为进一步学习 Rust 的基础,您可以根据自己的兴趣和需求对其进行扩展和改进,探索更多 Rust 编程的可能性。无论是开发更复杂的聊天系统,还是其他类型的命令行工具,这个项目中用到的技术和思想都具有参考价值。
希望这个小项目能帮助您更好地理解 Rust 编程,并激发您对 Rust 开发的兴趣。如果您有任何想法或改进建议,欢迎在实际使用中进行尝试和探索!