基于Python树的聊天机器人

基于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,

我正在用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”语句)

我只是想澄清一下,我不是要求别人为我写代码,我只是不确定如何解决这个问题


我所需内容的简短描述: 一种树状结构,以一个字符串开始,由多个字符串“分支”而成

这些字符串中的每一个都有更多的“分支”


与此和元组元组的区别在于,它们需要有一个字符串来分支,而不是立即拆分。

这与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响应和用户响应列表。我知道我在这里进行坏死,但这看起来正是我所需要的。问题是我对此感到困惑:对于子对象中的子对象:打印方向\文本您不想打印所有子对象,对吗?您想根据用户输入打印一个。