文明/文明 IV/Modding/教程/Python 教程/调试
如果有人能帮我检查一下这一节,我会很感激,因为我不确定它是否完全准确,而且由于我接下来的几个月要离开电脑,所以无法测试它。
当脚本无法正常运行时,每个人都必须进行调试,因为犯一个小错误很容易,导致整个代码毫无意义。调试的第一步是打开游戏内的调试选项。为此,打开 Civilization4.ini 文件(确保备份),并将以下条目更改为以下值
HidePythonExceptions = 0 ShowPythonDebugMsgs = 1 LoggingEnabled = 1 MessageLog = 1
这将启用游戏内的 Python 弹出窗口,并将所有错误和消息打印到您的我的文档/我的游戏/文明 4/日志目录中。调试时需要查找的三个重要日志文件是 PythonDbg、PythonErr 和 PythonErr2。
在日志中,错误通常会有一个回溯。这个回溯列出了所有受错误影响的文件以及发生错误的行号。最后一行通常是您感兴趣的那一行,因为这是发生错误的那一行。有时您需要回溯几步,因为错误不会出现在最后一行,但通常它就在那里!
这些主要是打字错误 - 遗漏的 ":"、不正确的空格或错误的括号。游戏通常会在您加载游戏时发现这些错误。错误日志应该显示您语法错误的确切位置,并在其下方用一个小的 "^" 符号标记出来。
如果您尝试将一个为指针设计的函数用于整数,则会得到一个类型错误。转到指定的行,检查您正在使用的函数是否有效。通常它会说明它期望的函数类型以及您提供的函数类型。注意:有些类在函数中需要 "()",有些不需要。如果您遇到类型错误,这可能是原因。
当您传递给函数的参数过多或过少时,这些错误就会发生。您必须确保传递给函数的参数数量与函数接收的参数数量匹配,否则当您尝试运行该函数时,该函数会抛出一个错误。
这意味着您尝试使用游戏不知道是什么的东西。例如,如果您要输入 a = b,但没有先声明 b 是什么,那么计算机就无法为 a 设置值。请记住,a=b 与 b=a 的作用不同。此外,请确保您没有在需要 " =" 的地方使用 " == ",反之亦然。
有时您会得到 "Argument referenced before assignment"。我不知道这是否与名称错误有关,或者它是否需要自己的类别,但基本上它就像名称错误,但是您在代码的后面定义了 "a"。
当您尝试引用列表、元组或字典中不存在的索引时,就会发生这种情况。这个错误可能很难解决,您可能需要使用本节下一部分中描述的方法来查看究竟发生了什么错误。
以上是我现在能想到的所有错误消息。我相当确定我遗漏了一两个 - 如果您发现任何错误,请随时询问,我会将它们包含在这里。正如我在开头所说,我对这些错误的准确性不是 100% 确定,但它们应该是可以的。
所以你写了你的代码。它运行起来没有错误......但它并没有真正产生你希望它在游戏中产生的结果。这可能有几个原因。
首先,如果您认为一段代码应该在游戏中产生影响,请确保它是通过检查 API 来查看它是否是 VOID 函数。在刚开始学习时,经常会使用其他函数,以为它们会做某事,但实际上它们只是检索信息。
其次,如果一切看起来都正确,您需要开始在代码中添加调试信息。这部分内容会将您带回到 Python 编程的最初阶段,当时您告诉计算机打印 "hello world"。您需要做的是让计算机打印一条消息,告诉您代码中某个点的特定值的具体内容,并将它与您认为应该的值进行比较。例如,以下代码将在调试日志中打印 "a=b",如果 a=b,否则打印 a 和 b 的值。
if a == b: print "a=b" else: print a print b
在调试日志中解读这些信息可能比较困难(通常会有很多很多数字),因此您可以使用更高级的消息
if a == b: print "a = b, a and b are %d, and %d"%(a,b)) else: print("a = %d"%(a)) print("b = %d"%(b))
其中 %d 将引用 "" 外面的数字,紧随在 % 之后。如果您想在那里放置一个字符串,您必须使用 %s。这可以为您提供有关代码内部情况的详细信息,希望您能够从中找出问题所在。