Python基于树的聊天机器人

4
我正在使用Python制作一个基于文本的RPG游戏,但是我卡在了NPC上。我需要一些类似于树形结构的东西。例如:
Bot: 你好。 1. 嗨,你叫什么名字? 2. 嗨,你住在哪里? > 2 Player: 你住在哪里? Bot: 这是个奇怪的问题,你为什么问呢? 1. 我只是好奇。 2. 没事。 3. 躲起你的孩子,躲起你的妻子 > 1 Player: 我只是好奇。 Bot: 好吧。 1. 你喜欢奶酪吗? 2. 再见。 > 1 Player: 你喜欢奶酪吗? Bot: 是的!我爱奶酪。
每个选择都会分支到其他选择,也就是说,如果用户对第一个问题回答“1”,那么机器人会回答“我的名字是Bob,你呢?”
我的游戏设计方式不会使关卡编辑器成为不可能的任务(你可以将可以访问的每个地方存储为字典中的一个键,然后是包含其中所有内容的元组[我有一个商店类、一个敌人类、一个“传送门”类,很快还会有一个NPC类])。因此,我希望以一种可以将其全部存储在NPC类存储的变量中的方式来创建它(而不是一堆“if”语句)。
只是为了澄清,我并不是要求有人为我编写代码,我只是不确定如何解决这个问题。
精简后的需求描述:
树形结构从一个字符串开始,其中包含许多从它“分支出去”的字符串。
每个字符串都有更多的“分支”。
与元组的区别在于,需要有一个字符串作为他们分支的地方,而不是立即分裂。

使用 dict,其中键是用户响应(或用户响应的菜单选项),值是包含 NPC 响应和用户响应列表的元组(或另一个 dict)。 - Joel Cornett
2个回答

3

这与决策树密切相关,但玩家是做出选择的人,因此在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角色可以通过特定的TreeNode来跟踪它们的状态,称之为当前问题(current_question),整个对话过程构成了一个树形结构的TreeNodes,称之为对话(dialogue)。

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将具有可以循环以重复信息的对话路径。上面的数据结构无法做到这一点,因为概述文本(在概念上属于节点)和方向文本(在概念上属于边缘)被视为一体。

我知道我在这里回复已经很晚了,但这看起来正是我需要的。问题是我对这个有点困惑:for child in children: print direction_text 你不想打印所有的子项,对吧?你想要根据用户输入打印一个子项。 - Luke

0
你需要一个有向图,其中机器人语句是节点,玩家回应是弧。
你可能还希望这些弧具有一些内置智能 - 根据玩家状态启用/禁用自己(例如,如果玩家没有蓝钥匙,则“解锁蓝门”不是可用选项)。
以下是示例代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接