0

だから私の最初の大きな python プロジェクトでは、テキスト ベースのゲームを構築しています。モジュール化されているため、実際のソース コードを少し編集するだけで、ストーリーやアイテムなどを編集および置換できます。基本的に、ユーザーコマンドは文字列として保存され、すぐにリストに分割されます。最初の要素は 'inspect' のようなアクションで、2 番目の要素は 'location' や 'item' のようなそのアクションの疑似引数です。コマンドが解釈された後、「item_or_loc」という実行モジュールに移動します。ここでエラーが発生します。誰でも助けることができますか?役立つ場合は、詳細情報またはソース コード全体を提供します。

コマンド モジュール:

    def item_or_loc(iolo):
        if iolo in items.items_f():
            print (items.iolo(1))
        elif iolo in locations.locations_f():
            print (locations.iolo(1))
        else:
            print ('Command not recognized, try again.')


    def location(loco):
        plo_l = PlayerClass #(player location object_location)
        if loco == 'location':
            plo_l.player_loc(0)


    def abort(abo):
        sys.exit()


    def inventory(invo):
        pio_i = PlayerClass #(player inventory object_inventory)
        if invo == 'inventory':
            pio_i.player_inv(0)

アイテム モジュール:

    patient_gown=('Patient gown', 'A light blue patient\'s gown.')
    wrench=('Wrench','')
    stick=('Stick','')
    prybar=('Prybar','')
    screwdriver=('Screwdriver','')
    scalpel=('Scalpel','')
    broken_tile=('Broken tile','')
    hatchet=('Hatchet','')
    janitor_suit=('Janitor suit','')

Locations モジュール: 基本的に Items モジュールと同じ

プレーヤー モジュール:

    import items
    import locations

    class PlayerClass:
        def player_inv(inv_index):
        pinventory = [items.patient_gown[inv_index]]
        print (pinventory)

    def player_loc(loc_index):
        ploc = [locations.cell[loc_index]]
        print (ploc)
4

1 に答える 1

4

からは何も返されませんitems.items_f。コンテナまたはシーケンスを返す必要があります。以下とは別のアプローチをお勧めしますが、少なくともそれは出発点です。

def items_f():
    patient_gown=('Patient gown','A light blue patient\'s gown.')
    wrench=('','')
    stick=('','')
    crowbar=('','')
    screwdriver=('','')
    scalpel=('','')
    broken_tile=('','')
    hatchet=('','')
    janitor_suit=('','')
    return (patient_gown, wrench, stick, crowbar, 
            screwdriver, scalpel, broken_tile, hatchet, janitor_suit)

説明すると、items_fはコンテナー自体ではなく、むしろ関数 (または、より正確には、オブジェクトに「付加された」関数として単純に考えることができるメソッド) です。関数は何も返す必要はありません、関数を呼び出すと、呼び出しの結果として得られる値は単純にNone.

のようなテストを行う場合if x in y:yはシーケンスまたはコンテナ タイプである必要があります。関数の結果をテストしているため、items_fその関数は上記で定義したとおりに返さNoneれるため、テストはエラーをスローします。

この状況を処理する最善の方法は、プログラムのより大きな構造によって異なります。正しい方向への第一歩は、次のようなものかもしれません。

def items_f():
    return (('Patient gown', 'A light blue patient\'s gown.'),
            ('Wrench', 'A crescent wrench.'),
            ('Stick', '...'))

しかし、それもおそらく最善の解決策ではありません。上記で追加した内容に基づく私の提案 (ちなみに、現在はitems_f機能がありません) は、アイテムを保持する何らかの種類のデータ構造を使用することです。簡単なアプローチは辞書です:

items = {'patient_gown':('Patient gown', 'A light blue patient\'s gown.'),
         'wrench':('Wrench', '...'),
          ...
        }

これにより、すべての可能な項目を含む辞書が作成されます。特定のアイテムが必要な場合は、次のように取得できます。

item = items['patient_gown']

この方法では、関数はまったく必要ありません。辞書全体に直接アクセスできます。

于 2012-04-13T21:43:25.917 に答える