2017-08-25 14 views
0

私はテキストベースのアドベンチャーゲームに取り組んできましたが、現在私は別のモジュールに入っている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に移動しようとしたとき、私は同様のエラーを受け取りますメソッドが実行されます。コードがすべて同じスクリプトに含まれている場合、これらのクラスインスタンスには問題なくアクセスできます。

+1

'location'変数は' main'に対してローカルです。 'Bag'クラスは直接アクセスすることはできませんし、試してはいけません。 – user2357112

+1

'場所 'は' gameworld'のどこにも定義されていません。ロケーションチェックが 'Bag'クラスの責任の範囲外であるため、クラス外にテストを移動することを検討する必要があります。 –

+0

あなたは 'main'からBag''にlocation' 'に渡す必要があり、あなたの' Bag'クラスは、あなたがそれを参照を与えることなくmain' 'に何があるかを見ることができません。 –

答えて

2

位置が定義されておらず、Bagクラスのスコープ内にないため、引数としてbag.check_takeを呼び出すときに、location変数を渡す必要があります。クラスメンバ関数を呼び出すときは、変数を他のオブジェクトに渡す必要があります。

1

Bagに、更新するインベントリ属性を設定している場合。

def add_to_inv(self, key): 
    self.inventory.append(location.room.roominv[key]) 
    del location.room.roominv[key] 

Nitpick:マネージャ機能へ場所の宿泊インベントリの突然変異を動かします。アイデアを得るには、以下の答えの残りを参照してください。

check_takeは、キー、バッグ、および場所をとる機能にすることができます。この機能をインポートして、キー、バッグ、および場所を適切に渡すことができます。

def check_take(key, bag, location=None): 
    if location.room.roominv and key in location.room.roominv: 
     bag.add_to_inv(key) 
    else: 
     bag.none_here(key) 
関連する問題