【问题标题】:Python tree-based chat bot基于 Python 树的聊天机器人
【发布时间】:2012-05-13 19:03:44
【问题描述】:

我正在使用 Python 开发基于文本的 RPG,但我被 NPC 困住了。 我需要一些有点像树的东西。例如:

博特:你好。 1. 你好,你叫什么名字? 2. 你好,你住在哪里? > 2 玩家:你住在哪里? Bot:这是一个令人毛骨悚然的问题。你为什么要问? 1. 我只是好奇。 2. 没关系。 3.隐藏你的孩子,隐藏你的妻子 > 1 玩家:我只是好奇。 博特:好的。 1. 你喜欢奶酪吗? 2.再见。 > 1 玩家:你喜欢奶酪吗? 博特:是的!我爱奶酪。

你做出的每一个选择都会衍生出其他选择,A.K.A.如果用户对第一个问题的回答是“1”,那么机器人会回答“我的名字是 Bob。你的名字是什么?”

我的游戏被设计成一个关卡编辑器不是不可能的前景(你可以访问的每个地方都作为一个键存储在字典中,然后是一个包含所有内容的元组[我有一个商店类,一个敌人类,一个“门户”类,很快又是一个 NPC 类])。所以我希望以某种方式创建它,这样我就可以将它全部保存在我的 NPC 类存储的变量中(而不是一堆“if”语句)

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


正是我需要的简短描述:

树状结构,以一个字符串开头,后面有多个“分支”字符串

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

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

【问题讨论】:

  • 使用dict,其中键是用户响应(或用户响应的菜单选项,值是包含NPC响应的元组(或另一个dict),以及用户响应列表。

标签: python artificial-intelligence


【解决方案1】:

这与decision tree 密切相关,但玩家是做出选择的人,所以在人工智能的意义上它并不完全是一个。您可以自己定义具有这些的数据结构 属性,虽然

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 可以通过特定的 TreeNode 跟踪他们的状态 - 称之为 current_question - 并且整个对话都在 TreeNodes 树中 - 称之为对话。

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 将具有可以循环重复信息的对话路径。上面的数据结构不能这样做,因为overview_text(概念上是节点的一部分)和direction_text(概念上是边的一部分)被视为一个。

【讨论】:

  • 我知道我在这里死了,但这看起来正是我需要的。问题是我对此感到困惑: for child in children: print direction_text 你不想打印所有的孩子,对吧?您想根据用户输入打印一个。
【解决方案2】:

您需要一个有向图,其中机器人语句是节点,玩家响应是弧线。

您可能还希望弧具有一些内置智能 - 根据玩家状态启用/禁用自身(即,如果玩家没有蓝色钥匙,则“解锁蓝色门”不是可用选项)。

要遵循的示例代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2017-03-05
    • 2016-07-21
    相关资源
    最近更新 更多