簡體   English   中英

TypeError:“函數”對象不可下標。 從事基於文字的冒險游戲

[英]TypeError: 'function' object is not subscriptable. Working on text-based adventure game

我正在創建一個基於文本的冒險游戲作為一個愛好項目,當在游戲世界中實現一種可能的交互時遇到了這個問題

使用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!')

這是我定義了move變量的地方

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

在你gamehelp功能,您有沒有參數,但它希望move進行檢查。 您需要接受,然后將move作為參數傳遞給gamehelp(move)

將功能更改為

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

這應該可以解決該錯誤。 現在,我將提出一些不需要的代碼建議。 如果您願意,可以隨意忽略這些,但是我認為,如果您至少不注意它們,將會遇到很多問題。

首先,如果那是整個方法,那么gamehelp()方法就毫無意義。 如果要調用gamehelp ,則最好改為調用showInstructions() 您應該在運行方法並將其擴展到所有方法之前檢查是否正在調用gamehelp 如果您願意,我很樂意幫助您解決問題,但是您當前的方法將無法擴展,並且幾乎肯定會帶來bug,因為while循環中出現問題時,您必須檢查每個方法。

您的move函數也可以重構很多。 我也不建議您使用與方法名稱相同的變量,因為使用一流函數時,它可能會造成混淆。

我僅重構了move變量作為示例。 解釋如下:

您實際上並沒有添加到move變量,僅是用戶輸入了最后的內容。 如果確實要添加到move變量,請使用+ =運算符或字符串join()方法。 我猜這是您不知道的錯誤,否則看起來會有所不同。 無論如何,這只會做完全相同的事情,只是它只接受用戶輸入的第一件事。 您之前的操作方式還意味着用戶必須自己輸入空白行。 我認為,要使其實際執行任何操作,您還應該在大於號后留一個空格,以便用戶輸入時看起來更干凈。 現在您應該可以>go west而不是>go >west >

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

我可以預見,還有很多其他問題最終也會在您的代碼中實現。 例如,如果要命名走廊怎么辦? 然后這將失敗,因為它只是檢查currentRoom ,它是一個字符串。 您最好使用一個具有房間類型的類,甚至為每個房間使用不同類型的類(這可能是不必要的)。 然后,您可以執行currentRoom.type並且對房間的類型擁有零競爭。 這可能會延續玩家可以移動的方式,例如使用一種方法來檢查西邊是否為選項和/或他們是否具有鑰匙,和/或西邊是否為門...等等。

讓我們以球員清單為例。 如果您只是檢查它們是否有鑰匙,您將如何處理多個不同的鑰匙? 如果清單中出現鍵(因為它是字符串),或者與鍵絕對無關怎么辦? 答案是使用對象和數組。 使用他們的清單/狀態/等等進行玩家分類。 然后,您可以使它們的庫存變為數組/字典/使您的船浮起的任何東西,最后檢查它們是否具有特定的項目,而不僅僅是“鑰匙”。 通過從數組/ dict /任何內容中刪除密鑰,這也將允許您實際用完密鑰(您沒有這樣做,但是可能是故意的)。

除非您使用類似於類的內容,否則您將有很多重復的代碼或錯誤。 即使在這個簡短的摘要中,我也已經看到了問題或將來的問題。

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

PS:如果您願意,我非常樂意為您提供幫助。 我希望這會有所幫助:>

PPS除非您的目標是制作一個文本冒險引擎,否則您可能希望使用已經制作的引擎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM