2016-07-05 4 views
0

私が取り組んでいるゲームのインベントリシステムに取り組んでいます。グローバル関数を使わずにシステムを動作させたいのですが、グローバル関数を使わないでください。グローバル関数を使用せずにコード全体でローカル変数を参照するにはどうすればいいですか?

while not done: 
    global inventory 
    pygame.mouse.set_visible(False) 
    #Event processing 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
    elif event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_i: 
      inv_sys.inventory = True 
      inv_sys.inventory_u() 

import pygame 
import Constants 

clock = pygame.time.Clock() 
screen = pygame.display.set_mode(Constants.screen_size) 
inv = pygame.image.load("inv.png").convert() 
test = False 

def uninventory(): 
    global inventory 
    inventory = False 

def inventory_u(): 

    while inventory: 
     pygame.mouse.set_visible(True) 
     screen.blit(inv,(0,0)) 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       pygame.quit 
      elif event.type == pygame.KEYDOWN:  
       if event.key == pygame.K_i: 
        uninventory() 

     pygame.display.update() 
     clock.tick(60) 

ありがとうございました!

答えて

0

なぜ、多くの関数間でローカル変数を共有したいのですか? もっと良い方法は、単純にクラスを作成することです。ここでは、inventoryなどの記述的なものがオブジェクト変数として使用されます。

class MyGame: 
    def __init__(): 
     # something 
     self.inventory = True 
    # some code 
    def unEquip(): 
     self.inventory = False 
2

私はあなたが私はあなたが誤解したと思う[グローバルステートメント]

の使用を避ける必要があることを読んだので。 globalキーワードはそれ自身では悪くありません。代わりに、の実装でglobalキーワードを使用する必要がある場合は、実装が不良です(ほとんどの場合例外があります)。グローバルスコープの変数でコードを書くのではなく、関数に変数を渡そうとするべきです。クラスを使用してのPatNowakの提案@

def main(): 
    eels = 42 
    start_hovercraft(eels) 

def start_hovercraft(number_of_eels): 
    if number_of_eels > 3: 
     raise Exception("My hovercraft is full of eels!") 

も問題を回避する良い方法ですが、問題の要点は、それが不正なコードにつながるので、あなたがglobal可能な限りを避けるべきであるということです。

1

一般的に、値が一度割り当てられていて変更されていない変数を頻繁に参照する場合は、ファイル上部のモジュールスコープでPEP 8 style guideに従って定義してください。インポート文は、ファイルの先頭にもなければなりません。

global inventoryのように、プログラム内で参照してプログラムの状態を変更するためのものであれば、それは(おそらくそれを参照するメソッドも)クラス定義の一部であるはずです。 PatNowakが説明しているように、変数としての変数です。これらのメソッドは、クラスの内側または外側(それぞれselfまたはclassインスタンスを使用)で参照できますが、プロパティ自体は直接クラス内でのみ変更する必要があります。そうしないと、コードがすぐにデバッグまたは書き換えできなくなります。

グローバルキーワードには用途がありますが、他の2つの方法のいずれかの代わりに使用する理由はありませんでした。

関連する問題