代码之家  ›  专栏  ›  技术社区  ›  user3352686

在Python对象工厂中使用动态变量

  •  0
  • user3352686  · 技术社区  · 12 年前

    下面的代码是一个片段,用于接收集群大小(遭遇难度)、玩家所在游戏的行为以及玩家从数据库中选择敌人并创建它们。这呈现了假设玩家处于第1幕和第1级的测试用例,并使用了为测试目的编写的单个技能。

    EnemyDatabase={'1':{'1':{'Cultist':{'spawn':{'spawnrate':[0, 100], 'ClusterValue':2, 'EnemyLevelRange':(1, 3), 'HpPerLevel':20, 'XpPerLevel':2},
                                        'Fighter':{MaxHp:50, death_function:monster_death},
                                        'Skill':{'type' : 'low', 'TitanicOnslaught':(1, 1, .1, .2, 2)},
                                        'Corpse':{'DrainValue':None, 'XpValue':10, 'PreviouslyDrained':[False, False]},
                                        'AI':BasicMonster,
                                        'Object':{'name':'Cultist'}}}}}
    
    SkillDatabase={'TitanicOnslaught':{'function':CastTitanicOnslaught, 'flags':['melee']}}
    
    def GatherSpawnPool(PlayerLevel, EnemyDatabase):
        SpawnDict={}
        for key, value in EnemyDatabase[str(GameProgression.Act)]:
            if int(key)<=PlayerLevel:
                i=key
                for key, value in EnemyDatabase[str(GameProgression.Act)][i]:
                    SpawnDict.update({key:value})
        return SpawnDict
    
    def MobSelector(SpawnPool):
        #Select the enemies that will be spawned for this encounter from the spawn pool
        i=0
        EnemiesToSpawn=[]
        while i <= EncounterClusterSize:
            num=random.randrange(0.001, 100)
            for key in SpawnPool:
                if  num >= SpawnPool[key]['spawn']['spawnrate'][0] and num <= SpawnPool[key]['spawn']['spawnrate'][1]:
                    EnemiesToSpawn.append(key)
                    i+= SpawnPool[key]['spawn']['ClusterValue']
        return EnemiesToSpawn
    
    def DynamicVariable(VarName, Value):
        return exec Varname+Value
    
    def SkillFactory(SkillValues, SkillDatabase):
        if SkillValues['type']=='low':
            EntitySkills=[]
            for key, value in SkillValues:
                Flags=[]
                for x in SkillDatabase[key][flags]:
                    Flags.append(exec x+"=True")
                EntitySkills.append(exec key+"=Skill(function=SkillDatabase[key]['function'], arguments=value, flags=Flags, **SkillValues['other'])")
            SkillStuff=LowActorSkill(AvailableSkills=EntitySkills, Cooldowns=[0 **len(EntitySkills)])
            return SkillStuff
            exec ""
        elif SkillValues['type']=='high':
            pass
    
    def SpawnMobs(MobsToSpawn, SpawnPool, SkillDatabase):
        SpawnedEnemies=[]
        for enemy in MobsToSpawn:
            FighterComponent=Fighter(**SpawnPool[enemy]['Fighter'])
            CorpseComponent=Corpse(**SpawnPool[enemy]['Corpse'])
            SkillComponent=SkillFactory(SpawnPool[enemy]['Skill'], SkillDatabase)
            SpawnedEnemies.append(exec enemy + "=Object(ai=SpawnPool[enemy]['AI'], fighter=FighterComponent, corpse=CorpseComponent, skill=SkillComponent, **SpawnPool['enemy']['Object'])")
            return SpawnedEnemies
    
    def MobFactory():
        global player, SkillDatabase, EnemyDatabase
        SpawnPool=GatherSpawnPool(player.level, EnemyDatabase)
        MobsToSpawn=MobSelector(SpawnPool)
        SpawnedMobs=SpawnMobs(MobsToSpawnl, SpawnPool, SkillDatabase)
        #FUNCTION TO PICK SPOTS FOR THE ENEMIES TO GO AND EDIT THEIR MAPX AND MAPY GOES HERE
        return SpawnedMobs
    

    代码显然不起作用,因为我使用exec语句作为参数,但我无法找到解决方法。目标从数据库中选择的敌人获得信息,以创建字符串所指示的技能对象。我知道动态命名变量通常是不好的做法,但它们永远不会被显式引用。游戏AI模块将扫描轮到它的实体的所有可用能力(只有25种可能性),并根据其可用的操作运行适当的流程。我的问题是上面的代码如何将动态命名和创建的对象附加到列表中?我确信这段代码中还有一些其他的小错误,但我真的无法测试这些错误,直到我通过这一点。此外,我相信有很多方法可以加快或改进它,但现在我正在“让它工作,让它正确,让它快速”中的“让它运转”部分

    请随意编辑这个问题,因为我不是最擅长解释自己的人,同时也让它与社区更相关。

    1 回复  |  直到 12 年前
        1
  •  0
  •   jonrsharpe    11 年前

    每当你开始思考“动态命名变量”时,停止思考“字典”。如果你没有 需要 命名属性访问,列表通常也很好。例如,而不是重复 exec 创建每个 Object ,列出一个列表:

    new_objects = []
    for enemy in MobsToSpawn:
        ...
        new_objects.append(Object(ai=SpawnPool[enemy]['ai'], ...))
    

    在其他地方,似乎应该使用字典:

    for key, value in SkillValues.items(): # note .items()
        Flags={}
        for x in SkillDatabase[key][flags]: # where is flags from?
            Flags[x] = True