私はテキストベースのアドベンチャーゲームに取り組んできましたが、現在私は別のモジュールに入っている1つの大きなゲームスクリプトを分割しています。Python 3:名前 'クラスインスタンス'が定義されていません
これは、ゲームのロジックを含むゲームのメインモジュールです。私はクラス
以下from gameworld import *
def main():
player = Player("Jeff", 100)
bag = Bag([])
location = Location('introd')
command = ' '
while command != "":
command = input('>>> ')
if command in location.room.exits:
location.travel(command)
elif command == 'look':
location.room_desc()
elif command == '':
print('You have to say what it is you want to do!')
command = '#'
elif command == 'search':
location.search_room()
elif command.split()[0] == 'Take':
bag.check_take(command.split()[1])
elif command == 'Inventory':
bag.check_inv()
else:
print('Invalid command')
if __name__ == '__main__':
main()
のインスタンスを定義しているmain()
関数内gameworldモジュールからの抜粋です。それは私が難しかった機能を含んでいます。 Location.key_check
およびBag.check_take
の機能。
#gameworld.py
class Room:
def __init__(self, name, description, exits, actions, roominv, roomkey, lock):
self.name = name
self.description = description
self.exits = exits
self.actions = actions
self.roominv = roominv
self.roomkey = roomkey
self.lock = lock
class Location:
def __init__(self, room):
self.room = world[room]
def key_check(self, new_room_name):
if world[new_room_name].lock and world[new_room_name].roomkey not in bag.inventory:
self.no_key()
else:
world[new_room_name].lock = False
self.set_room(new_room_name)
self.room_desc()
class Bag():
def __init__(self, inventory):
self.inventory = inventory
def add_to_inv(self, key):
self.inventory.append(location.room.roominv[key])
del location.room.roominv[key]
def none_here(self, key):
print("You can't find a", key)
def check_take(self, key):
if location.room.roominv and key in location.room.roominv:
self.add_to_inv(key)
print('you take the', key)
else:
self.none_here(key)
私はゲームを実行して、アイテムを拾うしようとすると、私はこのトレースバックエラーが表示されます。
Traceback (most recent call last):
File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\FlubbosModuleTest.py", line 31, in <module>
main()
File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\FlubbosModuleTest.py", line 23, in main
bag.check_take(command.split()[1])
File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\gameworld.py", line 81, in check_take
if location.room.roominv and key in location.room.roominv:
NameError: name 'location' is not defined
密室とkey_check
に移動しようとしたとき、私は同様のエラーを受け取りますメソッドが実行されます。コードがすべて同じスクリプトに含まれている場合、これらのクラスインスタンスには問題なくアクセスできます。
'location'変数は' main'に対してローカルです。 'Bag'クラスは直接アクセスすることはできませんし、試してはいけません。 – user2357112
'場所 'は' gameworld'のどこにも定義されていません。ロケーションチェックが 'Bag'クラスの責任の範囲外であるため、クラス外にテストを移動することを検討する必要があります。 –
あなたは 'main'からBag''にlocation' 'に渡す必要があり、あなたの' Bag'クラスは、あなたがそれを参照を与えることなくmain' 'に何があるかを見ることができません。 –