0

我有一个对话系统的课程如下

class DIALOGUE(object):
    def __init__(self, place, who, sTime, eTime, isActive, mood, menuText, func, repeatable, num):
        self.place = place
        self.who = who
        self.sTime = sTime
        self.eTime = eTime
        self.isActive = isActive
        self.mood = mood
        self.menuText = menuText
        self.func = func
        self.repeatable = repeatable
        self.num = num

    @property
    def ACheck(self):
        global Date
        if self.sTime == "none":
            return True
        else:
            tHour,tMin = self.sTime.split(":")
            if tHour >= Date.Hour and tMin <= Date.Minute:
                tHour,tMin = self.eTime.split(":")
                if tHour < Date.Hour and tMin < Date.Minute:
                    return True
        return False

    @property
    def BCheck(self):
        global Act
        if self.who == Act:
            return True
        else:
            return False

    @property
    def CCheck(self):
        global Location
        if self.place == Location:
            return True
        if self.place == "none":
            return True
        return False

    @property
    def DCheck(self):
        if self.repeatable:
            return True
        else:
            if self.num > 0:
                return False
            else:
                return True

    @property
    def CanChat(self):
        if self.isActive and self.ACheck and self.BCheck and self.CCheck and self.DCheck:
            return True
        else:
            return False

    def SetActive(self):
        self.isActive = True

    def Do(self):
        self.num += 1
        renpy.call(self.func)

其中大部分应该是不言自明的,但我将 XML 文件解析为此类的实例列表。

根据用户所处的位置、一天中的什么时间以及他们选择的 NPC,向用户呈现可用对话列表。如果对话不可重复 DCheck 方法查看之前是否已完成对话,即如果对话不可重复并且self.num > 0该方法将返回False

本质上,它遍历所有对话并执行i.CanChat,如果该值返回 True,则将对话添加到菜单中

我遇到的问题是 Check 方法没有返回正确的值。具体来说,DCheck 一直返回 True,无论 Dialogue 是否可重复,并且忽略 Dialogue 的值self.num

该类在一个init python:块中创建,然后在一个单独的 python 块中解析 xml 文件,该块从开始标签内部调用

这可能很简单,但我无法弄清楚。

实例列表解析如下

Dialogues = []
    for j in Dialo:
        JPlace = j.find('Place').text
        JWho = j.find('Who').text
        JsTime = j.find('Start').text
        JeTime = j.find('End').text
        JMood = int(j.find('Mood').text)
        JText = j.find('Text').text
        JFunc = j.find('Func').text
        JRep = j.find('Rep').text
        if JRep == "True":
            Jrep = True
        else:
            Jrep = False
        Dialogues.append(DIALOGUE(JPlace, JWho, JsTime, JeTime, False, JMood, JText, JFunc, JRep, 0))

创建菜单的方法如下

def TalkCheck():
    talks = []
    talks.append(("Nevermind.", "none"))
    for i, q in enumerate(Dialogues):
        if q.CanChat:
            talks.append((q.menuText,i))
    renpy.say(None, "", interact=False)
    talkchoice = renpy.display_menu(talks)
    if talkchoice <> "none":
        talkchoice = int(talkchoice)
        Dialogues[talkchoice].Do()
4

1 回答 1

0

您的问题不完整 - 您没有发布 MCVE,我们不知道导致这种行为的“repeatble”和“num”的有效值,我们甚至不知道它是否使用 Python 2.x 或Python 3.x - 所以我们可以尝试和猜测。现在,既然您提到您“将 XML 文件解析为实例列表”,我强烈怀疑您正在运行 Python 2.x 并将这些值作为字符串而不是(分别)布尔值和 int 传递。在 Python 2 中,"-1"(string) 比较大于0(int) - 它在 Python 3.x 中引发 a TypeError- 并且在这两种情况下,非空字符串 evals 都True在布尔上下文 ( bool('False') == True) 中。由于您的方法实现中没有明显的逻辑错误,这是我能想到的唯一解释。

顺便说一句,表达式具有布尔值并return退出函数,因此您可以简化代码:

@property
def DCheck(self):
    if self.repeatable:
        return True
    return self.num > 0
于 2018-09-10T11:59:37.757 回答