2017-01-29 11 views
0

現在、私はPygameの可能性を模索しており、簡単なゲームを作成しています。私は関数内で作ったクラスを使って新しいオブジェクトを定義しようとしています。関数内のクラスオブジェクトの作成(Python)

これは私が試したものです:私はオブジェクトenemy1を使用しようとすると

def CreateEnemy(): 
    enemy1 = Enemies() 
    enemy2 = Enemies() 
    enemy3 = Enemies() 
    enemy1.getInstructions() 
    enemy2.getInstructions() 
    enemy3.getInstructions() 

は、しかし、それは、それが定義されていないという。私が知っているところから、オブジェクトは関数内でローカルなだけかもしれません。これはどういうわけかreturn関数を使わなければならないということですか?

+0

Enemiesが定義されているコードスニペットをお願いしますか?多分問題があるかもしれません。 – Alex

答えて

0

私の例でわかるように、より良い答えを得ることができるようにいくつかのコードを含めてください。返信関数を書く必要はありません。

class Enemies: 
    def getInstructions(self): 
     print("Instructions") 

def createEnemy(): 
    global allEnemy 
    allEnemy.append(Enemies()) 

allEnemy = [] 
createEnemy() 
createEnemy() 

for enemy in allEnemy : 
    enemy.getInstructions() 
+0

しかし、これは 'enemy1'と' enemy2'をローカルにしているので、関数の外ではアクセスできません。それらをグローバルにするか返すかのどちらかです。 –

+0

彼の質問ははっきりしていませんでした。私はそれを得て、@gipsyの答えの代わりに答えを更新しました。 – Harry

1

私はあなたが

class Enemies: 
    def getInstructions(): 
    return "instructions" 

は今の方法が

def create_enemies(num_of_enemies): 
    enemies = [] 
    for i in range(num_of_enemies): 
    enemies.append(enemy) 
    return enemies 

敵インスタンスの束を作成し、上記の方法を使用したいの下のようなクラスと呼ばれる敵の何かを持っていると仮定していますこのような敵を作成する:

enemy1, enemy2 , enemy3 = create_enemies(3) 
+0

ありがとう私はこれにこれを実装するだろう私はこれについて疑問に思っていた –

0
class Ins_Normal(): 
    def getInstructions(self, *args): 
    return "GetInstructions_Normal" 

class Ins_Agressive(): 
    def getInstructions(self, *args): 
    return "GetInstructions_Agressive" 


class Enemies(object): 
    def __init__(self, behaivor = 'Ins_Normal', mode = True, *args): 
    self.behaivor = behaivor 
    self.mode = mode 

    def getInstructions(self, *args): 
    #create instance based on behaivor 
    try: 
     ins = globals()[self.behaivor]() # same like ins = Ins_Agressive() 
    except KeyError as e: 
     raise NotImplementedError(e) 
    # return getInstructions() init value behaivor 
    return ins.getInstructions() 

    def xyz(self, *args): 
    # if True return worldspace position (eg) 
    if self.mode: 
     return "xyz" 
    return 'com_xyz' 

def CreateEnemy(enemy = 0, behaivor = 'Ins_Normal', mode =True): 
    # wrapper function to collect Enemies 
    # create dict, so no hardcoded variabels, scalable.... 
    data = dict((_id, Enemies(behaivor, mode)) for _id in range(enemy)) 
    return data 

# create groups of enemies 
enemies_com_normal = CreateEnemy(3, 'Ins_Normal') #com 
enemies_user_normal = CreateEnemy(3, 'Ins_Normal', True) #interactive 
enemies_com_agressive = CreateEnemy(5, 'Ins_Agressive', True) #interactive 

print enemies_com_normal 
# we get dict of Enemy instances with id(int) as key 
#>>> {0: <Enemies object at 0x7f2d8cfe5b10>, 1: <Enemies object at 0x7f2d8cfe5b50>, 2: <Enemies object at 0x7f2d8cfe5b90>} 

#lets print some infos of the agents 
print enemies_com_normal[0].xyz() 
#>>>xyz 
print enemies_com_normal[0].getInstructions() 
#>>>GetInstructions_Normal 
print enemies_com_agressive[2].getInstructions() 
#>>>GetInstructions_Agressive 

enemies_com_hgd = CreateEnemy(5, 'Ins_HGD', True) #interactive 
print enemies_com_hgd[0].getInstructions() 

#Traceback (most recent call last): 
# File "python", line 56, in <module> 
# File "python", line 21, in getInstructions 
#NotImplementedError: 'Ins_HGD' <<<<< no Instruction Implemented for Ins_HGD 
関連する問題