最近ゲームを作っていますが、問題があります。敵に当たったものを計算するには、可変の剣を使用します。
この時点で、プレイヤーは剣を購入したかどうかは不明です。そのため、「変数が宣言されていません」というエラーが表示されます。まだ宣言されていない変数を回避する方法はありますか?
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
最初の解決策は(はるかに)優れています。
いくつかのオプションがあります。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!"
あなたのコードをもっと見ることなく、「まだ宣言されていない変数を許す」ための通常の方法は、NameError
例外の可能性を処理することだと思います。
try:
# variable sword may or may not exist here..
sword
except NameError:
# handle this
あなたのゲームの全貌はわかりません。「剣」はプレイヤー キャラクターが持ち運べる唯一のアイテムですか、それとも無限の暗黙のインベントリですか? (例: プレイヤー キャラクターはサックまたはバックパックを持っており、ゲームのプレイ中にアイテムを拾うことができます。)
キャラクターにインベントリを与えたい場合は、単純なリストを使用できます。または、すべてのアイテムが一意である場合 (つまり、キャラクターが一度に 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!"
変数がグローバルまたはローカルのdictに存在するかどうかを確認するか、次を使用できます。
try:
a = b
except NameError:
a = b = 1