0

最近ゲームを作っていますが、問題があります。敵に当たったものを計算するには、可変のを使用します。

この時点で、プレイヤーは剣を購入したかどうかは不明です。そのため、「変数が宣言されていません」というエラーが表示されます。まだ宣言されていない変数を回避する方法はありますか?

4

5 に答える 5

8

2つのオプションがあります。

1つ目は、プレーヤーが常にsword変数を持っていることを確認することです。プレイヤーが剣を手に入れる前に設定しNone、プレイヤーが剣を持っているかどうかを知る必要がある場合は、変数がNone次のようになっているかどうかを確認します。

 sword = None

 # do lots of stuff here

 if sword is None:
    print 'Hey, no sword!'
 else:
    print 'Chop, chop, chop!'

剣を空の文字列または整数値0にすることが許可されていない場合に、これを記述する別の方法は次のとおりです。

 if sword:
    print 'Chop, chop, chop.'

2番目のオプションは、sword変数へのすべての参照をtryブロックでラップし、発生する可能性のあるNameErrorを飲み込むことです。

 try:
    if sword == 10:
        print 'Choppity chop chop chop.'
 except NameError:
    pass

最初の解決策は(はるかに)優れています。

于 2012-05-08T01:26:29.297 に答える
1

いくつかのオプションがあります。wimが提供するものは問題ありませんが、変数が実際にdictのキーである場合は、次のように短縮できます。

has_sword = my_items.get('sword', False)

メソッドの2番目の値は、get()ソードキーが存在しない場合のデフォルト値です。

プロのヒント:globals()とlocals()は、それぞれグローバルスコープと関数で宣言された変数への直接アクセスを提供します。つまりglobals().get('sword', False)、グローバルに宣言した変数に対して有効である必要があります。

最後に、wimが示唆しているように、これは実際には正しい方法ではありません。よりPython的なアプローチは、次のようなクラスを使用することです。

class Player():
  def __init__(self)
    self.sword = None

player = Player()
if player.sword:
  print "Off with his head!"
于 2012-05-08T01:26:04.863 に答える
1

あなたのコードをもっと見ることなく、「まだ宣言されていない変数を許す」ための通常の方法は、NameError例外の可能性を処理することだと思います。

try: 
  # variable sword may or may not exist here..
  sword
except NameError:
  # handle this
于 2012-05-08T01:23:30.167 に答える
1

あなたのゲームの全貌はわかりません。「剣」はプレイヤー キャラクターが持ち運べる唯一のアイテムですか、それとも無限の暗黙のインベントリですか? (例: プレイヤー キャラクターはサックまたはバックパックを持っており、ゲームのプレイ中にアイテムを拾うことができます。)

キャラクターにインベントリを与えたい場合は、単純なリストを使用できます。または、すべてのアイテムが一意である場合 (つまり、キャラクターが一度に 1 つの剣しか持てない場合)、セットが適切です。

class Player(object):
    def __init__(self):
        self.inventory = set( )

    @property
    def has_sword(self):
        return ('sword' in self.inventory)

me = Player( )
me.inventory.add('sword')
if me.has_sword:
    print "swish!"
于 2012-05-08T03:17:54.530 に答える
0

変数がグローバルまたはローカルのdictに存在するかどうかを確認するか、次を使用できます。

try:
    a = b
except NameError:
    a = b = 1 
于 2012-05-08T01:29:50.743 に答える