-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasic-Dialogue-System-Template.cpp
More file actions
180 lines (147 loc) · 5.02 KB
/
Copy pathBasic-Dialogue-System-Template.cpp
File metadata and controls
180 lines (147 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <random>
#include <chrono>
class CuteCharacter {
private:
std::string name;
std::string personality; // 性格特点
int mood; // 心情值 0-100
// 对话库
std::map<std::string, std::vector<std::string>> dialogues;
public:
CuteCharacter(std::string name, std::string personality)
: name(name), personality(personality), mood(80) {}
// 添加对话选项
void addDialogue(std::string category, std::vector<std::string> lines) {
dialogues[category] = lines;
}
// 根据心情和情境获取对话
std::string speak(std::string situation) {
if (dialogues.find(situation) == dialogues.end()) {
return getRandomDefaultDialogue();
}
std::vector<std::string>& options = dialogues[situation];
// 根据心情选择不同的回应
int index;
if (mood > 70) { // 心情很好
index = 0; // 最积极的回应
} else if (mood > 40) { // 心情一般
index = 1 % options.size();
} else { // 心情不好
index = (options.size() - 1) % options.size(); // 较消极的回应
}
return options[index];
}
// 改变心情
void changeMood(int delta) {
mood += delta;
if (mood < 0) mood = 0;
if (mood > 100) mood = 100;
}
// 获取随机默认对话
std::string getRandomDefaultDialogue() {
std::vector<std::string> defaults = {
"喵~ 我不太明白呢~",
"唔... 这个要怎么回答呢?",
"(歪着头思考)",
"你能再说一遍吗?>_<"
};
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, defaults.size() - 1);
return defaults[dis(gen)];
}
// 获取角色信息
void displayInfo() {
std::cout << "✨ " << name << " ✨" << std::endl;
std::cout << "性格: " << personality << std::endl;
std::cout << "心情: " << getMoodEmoji() << " (" << mood << "/100)" << std::endl;
}
private:
std::string getMoodEmoji() {
if (mood > 80) return "😊";
if (mood > 60) return "🙂";
if (mood > 40) return "😐";
if (mood > 20) return "😕";
return "😢";
}
};
// 对话管理器
class DialogueManager {
private:
CuteCharacter* character;
public:
DialogueManager(CuteCharacter* character) : character(character) {}
// 开始对话
void startConversation() {
std::cout << "\n=== 对话开始 ===\n";
character->displayInfo();
std::string input;
while (true) {
std::cout << "\n输入对话主题(或输入'bye'退出): ";
std::getline(std::cin, input);
if (input == "bye") {
std::cout << character->speak("farewell") << std::endl;
break;
}
std::string response = character->speak(input);
std::cout << character->speak(input) << std::endl;
// 根据对话内容改变心情
updateMood(input);
}
}
private:
void updateMood(const std::string& topic) {
// 简单的情绪反应规则
if (topic.find("开心") != std::string::npos ||
topic.find("喜欢") != std::string::npos) {
character->changeMood(10);
} else if (topic.find("生气") != std::string::npos ||
topic.find("讨厌") != std::string::npos) {
character->changeMood(-10);
}
}
};
// 创建可爱角色
CuteCharacter createCuteCat() {
CuteCharacter cat("小猫咪", "傲娇又粘人");
// 添加各种情境的对话
cat.addDialogue("greeting", {
"喵呜~ 你来啦!我好想你呀~",
"(蹭蹭你的手)今天有带小鱼干吗?",
"哼!怎么现在才来!我都等了好久啦!"
});
cat.addDialogue("weather", {
"今天天气真好呢,适合晒太阳~",
"外面在下雨,我有点怕打雷...",
"喵~ 我想出去玩!"
});
cat.addDialogue("food", {
"小鱼干!小鱼干!最爱小鱼干了!",
"(眼睛发光)有零食吃吗?",
"唔... 有点饿了呢..."
});
cat.addDialogue("play", {
"要来玩毛线球吗?超有趣的!",
"(兴奋地摇尾巴)",
"陪我玩嘛~ 不要不理我嘛~"
});
cat.addDialogue("farewell", {
"这么快就要走了吗?我会想你的...",
"喵!记得明天还要来看我哦!",
"(挥手)再见啦~"
});
return cat;
}
int main() {
// 创建角色
CuteCharacter cat = createCuteCat();
// 创建对话管理器
DialogueManager manager(&cat);
// 开始对话
manager.startConversation();
return 0;
}