基于Python树的聊天机器人
我正在用Python开发一个基于文本的RPG,但我被NPC卡住了。 我需要像树一样的东西。例如: Bot: hello there. 1. Hi, what's your name? 2. Hi, Where do you live? > 2 Player: Where do you live? Bot: That's a creepy question. Why do you ask? 1. I was just curious. 2. Never mind. 3. Hide yo kids, hide yo wife > 1 Player: I was just curious. Bot: Okay. 1. Do you like cheese? 2. Bye. > 1 Player: Do you like cheese? Bot: Yes! I LOVE cheese. 机器人:你好。 1.嗨,你叫什么名字? 2.嗨,你住在哪里? > 2 玩家:你住在哪里? 机器人:这是个令人毛骨悚然的问题。你为什么这么问? 1.我只是好奇。 2.不要介意。 3.把孩子藏起来,把妻子藏起来 > 1 玩家:我只是好奇。 机器人:好的。 1.你喜欢奶酪吗? 2.再见。 > 1 玩家:你喜欢奶酪吗? 机器人:是的!我喜欢奶酪。 你所做的每一个选择都会转移到其他选择上,也就是说,如果用户对第一个问题回答了“1”,机器人会回答“我叫鲍勃,你叫什么?” 我的游戏的设计方式是,关卡编辑器不是不可能的(你可以访问的每个地方都作为一个键存储在字典中,然后是一个元组,包含其中的所有内容[我有一个商店类、一个敌人类、一个“门户”类,很快还有一个NPC类])。因此,我希望以某种方式创建它,这样我就可以将它保存在我的NPC类存储的变量中(而不是一堆“if”语句) 我只是想澄清一下,我不是要求别人为我写代码,我只是不确定如何解决这个问题基于Python树的聊天机器人,python,artificial-intelligence,Python,Artificial Intelligence,我正在用Python开发一个基于文本的RPG,但我被NPC卡住了。 我需要像树一样的东西。例如: Bot: hello there. 1. Hi, what's your name? 2. Hi, Where do you live? > 2 Player: Where do you live? Bot: That's a creepy question. Why do you ask? 1. I was just curious. 2. Never mind. 3. Hide yo kids,
我所需内容的简短描述: 一种树状结构,以一个字符串开始,由多个字符串“分支”而成 这些字符串中的每一个都有更多的“分支”
与此和元组元组的区别在于,它们需要有一个字符串来分支,而不是立即拆分。这与a密切相关,但玩家是做出选择的人,因此从AI的角度来看,它不是一个。您可以自己定义一个具有这些属性的数据结构 不过,这里的房产
class TreeNode:
def __init__(self,parent,children,overview_text,direction_text):
#... set the variables ...
# question_text is a string
def print_question(self):
print overview_text
for child in children:
print direction_text
# add some accessor methods
def add_child(self,child):
...
然后,你的NPC可以通过一个特定的树节点跟踪他们的状态——称之为当前的问题——整个对话都在树节点树中——称之为对话
class NPC:
def __init__(self,dialogue):
#... set the variables ...
self.current_question = None
def converse(self):
#.... do some stuff....
self.current_question = users_choice;
这样,您可以根据需要中断对话
请注意,TreeNode可能是一个误称,因为您可能希望对话表示一个图形,而不仅仅是一棵树。例如,很多RPG都有对话路径,可以循环重复信息。上面的数据结构无法做到这一点,因为概览文本(概念上是节点的一部分)和方向文本(概念上是边缘的一部分)被视为一个整体。您需要一个有向图,其中bot语句是节点,播放器响应是弧 您可能还希望ARC具有一些内置智能-根据玩家状态启用/禁用自身(即如果玩家没有蓝色钥匙,则“解锁蓝色门”不可用)
要遵循的示例代码。使用
dict
,其中键是用户响应(或用户响应的菜单选项和值是元组(或另一个dict
)其中包含NPC响应和用户响应列表。我知道我在这里进行坏死,但这看起来正是我所需要的。问题是我对此感到困惑:对于子对象中的子对象:打印方向\文本您不想打印所有子对象,对吗?您想根据用户输入打印一个。