TypeError:“函数”对象不可下标。从事基于文字的冒险游戏

时间:2019-08-05 14:56:07

标签: python

我正在创建一个基于文本的冒险游戏作为一个爱好项目,当在游戏世界中实现一种可能的交互时遇到了这个问题

其他使用move [0]事物的函数如下所示工作,但在这里似乎根本不想工作。

def gamehelp():
  if move[0] == 'help':
    showInstructions()

这是错误所指的

def move():
  move = ''
  while move == '':  
    move = input('>')

  move = move.lower().split()

  if move[0] == 'go':
    global currentRoom
    if move[1] in rooms[currentRoom]:
      if currentRoom == 'Corridor' and move[1] == 'west' and not 'key' in str(inventory):
        print('This Door is Locked!')
      else:
        currentRoom = rooms[currentRoom][move[1]]
    else:
        print('You can\'t go that way!')

在这里我定义了移动变量

while True:

  showStatus()
  move()
  gamehelp()
  itemPickup()
  look()

在这里,我将调用不同的函数,其中刚刚实现了gamehelp()和look()。

我期望的输出是当我在游戏中输入“ help”时显示showInstructions()函数,但它会返回此错误

Traceback (most recent call last):
  File "main.py", line 139, in <module>
    gamehelp()
  File "main.py", line 72, in gamehelp
    if move[0] == 'help':
TypeError: 'function' object is not subscriptable

1 个答案:

答案 0 :(得分:0)

在您的gamehelp函数中,没有任何参数,但是期望检查move。您将需要接受,并将move作为参数传递给 gamehelp(move)

将功能更改为

def gamehelp(param):
    if param[0] == 'help':
        showInstructions()

这应该可以解决该错误。现在,我将提出一些不需要的代码建议。如果您愿意,可以随意忽略这些,但是我认为如果您至少不注意它们,将会遇到很多问题。

首先,如果gamehelp()方法是整个方法,那么它就毫无意义。如果您要致电gamehelp,则最好也致电showInstructions()。您应该在运行方法并将其扩展到所有方法之前检查是否正在调用gamehelp。如果您愿意,我们很乐意帮助您解决问题,但是您当前的方法将无法扩展,并且几乎肯定会带来错误,因为{{1}出现问题时,您必须检查每个方法}循环。

您的while函数也可以重构。我也不建议使用与方法名称相同的变量,因为在使用一流函数时,它会引起混淆。

我仅重构了move变量作为示例。以下说明:

您实际上并没有在move变量中添加内容,仅是用户输入了最后的内容。如果确实要添加到move变量,请使用+ =运算符或字符串join()方法。我猜这是您不知道的错误,否则看起来会有所不同。无论如何,这只会做完全相同的事情,只是它只接受用户输入的第一件事。您之前的操作方式还意味着用户必须自己输入空白行。我认为,要使其实际执行任何操作,您还应该在大于号后留一个空格,以便用户输入时看起来更干净。现在您应该可以执行move而不是>go west

>go >west >

我可以预见,还有很多其他问题最终也会在您的代码中实现。例如,如果要命名走廊怎么办?然后这将失败,因为它只是检查def move(): move = input('> ').lower().split() ... ,它是一个字符串。您最好使用一个具有房间类型的类,甚至为每个房间使用不同类型的类(这可能是不必要的)。然后,您可以进行currentRoom并在房间类型上拥有零争用。这样可以延续玩家可以移动的方式,例如使用一种方法来检查西是否为选项和/或他们是否具有钥匙,和/或西是否为门...等。

以球员清单为例。如果您只是检查它们是否有钥匙,您将如何处理多个不同的钥匙?如果清单中出现键(因为它是字符串),或者与键绝对无关怎么办?答案是使用对象和数组。使用他们的清单/状态/等等进行玩家分类。然后,您可以使它们的库存变为数组/字典/使您的船浮起的任何东西,最后检查它们是否具有特定的项目,而不仅仅是“钥匙”。通过从数组/ dict /任何内容中删除键,这也将允许您实际用完键(您没有使用键,但可能是故意的)。

除非您使用类似于类的内容,否则您将有很多重复的代码或错误。即使在这个简短的摘要中,我也已经看到了问题或将来的问题。

TL; DR:使用OOP。班是你的朋友。

P.S。如果您愿意,我很乐意为您提供帮助。我希望这会有所帮助:>

P.P.S。除非您的目标是制作一个文本冒险引擎,否则您可能想要使用已经制作的引擎。