我正在用Python开发一个基于文本的RPG游戏,但在NPC方面遇到了困难。我需要一种类似于树形结构的东西。例如:
Bot: hello there.1. Hi, what's your name?2. Hi, Where do you live?> 2Player: 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> 1Player: I was just curious.Bot: Okay.1. Do you like cheese?2. Bye.> 1Player: Do you like cheese?Bot: Yes! I LOVE cheese.
你所做的每一个选择都会分支出其他选择,也就是说,如果用户在第一个问题上选择了’1’,机器人会回答“我的名字是Bob。你叫什么名字?”
我的游戏设计方式使得创建一个关卡编辑器并非不可能(你可以访问的每个地方都存储为字典中的一个键,然后是一个包含其中所有内容的元组[我有一个商店类,一个敌人类,一个’传送门’类,很快还会有NPC类])。所以我希望这种结构能够以一种方式创建,使我可以将其存储在NPC类的一个变量中(而不是一堆’if’语句)
只是为了澄清,我并不是在请求别人为我编写代码,我只是不确定如何解决这个问题。
简要描述我确切需要什么:
一种树状结构,从一个字符串开始,并有多个字符串从中分支出来
这些字符串中的每一个都有更多的分支
这与元组的元组不同之处在于,需要有一个字符串作为分支点,而不是立即分裂。
回答:
这与决策树密切相关,但玩家是做出选择的一方,所以在AI意义上它并不完全是一个决策树。你可以自己定义一个具有这些属性的数据结构,
class TreeNode: def __init__(self,parent,children,overview_text,direction_text): #... 设置变量 ... # question_text 是一个字符串 def print_question(self): print overview_text for child in children: print direction_text # 添加一些访问方法 def add_child(self,child): ...
然后你的NPC可以通过特定的TreeNode跟踪它们的状态 – 称之为current_question – 而整个对话则是在TreeNode的树中 – 称之为对话。
class NPC: def __init__(self,dialogue): #... 设置变量 ... self.current_question = None def converse(self): #.... 做一些事情.... self.current_question = users_choice;
这样你就可以根据需要中断对话了。
请注意,TreeNode可能是一个误称,因为你可能希望对话代表一个图而不是仅仅是一个树。许多RPG游戏会有可以循环以重复信息的对话路径,例如。上述数据结构无法做到这一点,因为overview_text(概念上是节点的一部分)和direction_text(概念上是边的部分)被视为一个整体。