首页 > 解决方案 > TypeError:“函数”对象不可下标。致力于基于文本的冒险游戏

问题描述

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

使用 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() 刚刚实现。

我期望的输出是当我在游戏中输入“帮助”时它会显示 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

标签: python

解决方案


在您的 gamehelp 函数中,您没有参数,但需要对其move进行检查。您需要接受并将 move 作为参数传递,例如 gamehelp(move)

随着功能更改为

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

这应该可以解决该错误。我现在将做一些未经请求的代码建议。如果您愿意,请随意忽略这些,但我认为如果您至少不注意它们,您将会遇到问题。

首先,gamehelp()如果这就是整个方法,那么该方法有点毫无意义。如果你打电话gamehelp,你也可以打电话showInstructions()。您应该gamehelp在运行该方法并将其扩展到所有内容之前检查您是否正在调用。如果您愿意,我很乐意帮助您尝试解决这个问题,但是您当前的方法不会扩展并且几乎肯定会带来错误,因为每当您的while循环中出现问题时,您都必须检查每个方法。

你的move函数也可以重构很多。我也不建议使用与方法同名的变量,因为当您使用第一类函数时它会让人感到困惑。

我只是重构了 move 变量作为示例。解释如下:

您实际上并没有添加到 move 变量中,它只是获取用户输入的最后一件事。如果确实要添加到移动变量,请使用 += 运算符或字符串 join() 方法。我猜这是一个你还不知道的错误,否则看起来会有所不同。无论如何,这完全一样,只是它只接受用户输入的第一件事。你之前的做法也意味着用户必须自己输入一个空行。我认为为了让它真正做任何事情你还应该在超过符号之后有一个空格,当用户打字时它看起来会更干净。现在你应该可以做>go west而不是>go >west >

def move():
    move = input('> ').lower().split()
...

我可以预见到许多其他问题最终也会在您的代码中实现。例如,如果你想要一个命名的走廊怎么办?那么这将失败,因为它只是检查currentRoom,这是一个字符串。您最好使用具有房间类型的课程,甚至每个房间都有不同类型的课程(这可能是不必要的)。然后,您可以currentRoom.type对它是什么类型的房间进行零争论。这可以延续到玩家可以移动的方式,比如有一个方法检查西是否是一个选项和/或他们是否有钥匙,和/或西是否是一扇门......等等。

让我们以玩家库存为例。如果您只是检查他们是否有密钥,您将如何处理多个不同的密钥?如果清单中出现了键(因为它是一个字符串),或者与键完全无关怎么办?答案是使用对象和数组。用他们的库存/状态/等创建一个玩家类。然后你可以让他们的库存成为一个数组/字典/任何漂浮在你船上的东西,最后检查他们是否有一个特定的项目,而不仅仅是“钥匙”。这也将允许您通过从数组/dict/whatever 中删除它来实际使用密钥(您没有这样做,但可能是故意的)。

除非您使用类似于类的东西,否则您将有很多重复的代码或错误。即使在这个简短的片段中,我也已经可以看到问题或未来的问题。

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

PS如果你愿意,我很乐意帮助你。我希望这会有所帮助:>

PPS 除非您的目标是制作文本冒险引擎,否则您可能希望使用已经制作好的引擎。


推荐阅读