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

重构游戏的“命中”值

  •  1
  • crystalattice  · 技术社区  · 16 年前

    我最初认为我可以将这些技能组合成一个元组,并在元组上迭代,动态地创建每个命中数。但我不知道这是否真的可能,因为我现在已经把每个命中数分配给了它自己的变量。

    我还考虑为每个范围创建一个方法,并将元组作为参数传递。我可以用得到的值创建一个新的元组或列表,然后将它们赋给各个变量,但我不认为这样做比这样做更好,只是它看起来不像复制粘贴的那样。

    以下是我目前拥有的:

        def calcBaseHitNumbers(self, dict):
            """Calculate character's base hit numbers depending on skill level."""
    
            self.skill_dict = dict
    
            self.rifle = self.skill_dict.get('CRM', 0)
            self.pistol = self.skill_dict.get('PST', 0)
            self.big_gun = self.skill_dict.get('LCG', 0)
            self.heavy_weapon = self.skill_dict.get('HW', 0)
            self.bow = self.skill_dict.get('LB', 0)
            #self.skill_tuple = (self.rifle, self.pistol, self.big_gun, self.heavy_weapon,
            #    self.bow)
    
    #---Short range
    ##        for skill in self.skill_tuple:
    ##            self.base_hit_short = skill * 0.6
            self.charAttribs.bhCRM_short = self.rifle * 0.6
            self.charAttribs.bhPST_short = self.pistol * 0.6
            self.charAttribs.bhHW_short = self.heavy_weapon * 0.6
            self.charAttribs.bhLCG_short = self.big_gun * 0.6
            self.charAttribs.bhLB_short = self.bow * 0.6
    #---Med range
            self.charAttribs.bhCRM_med = self.rifle * 0.3
            self.charAttribs.bhPST_med = self.pistol * 0.3
            self.charAttribs.bhHW_med = self.heavy_weapon * 0.3
            self.charAttribs.bhLCG_med = self.big_gun * 0.3
            self.charAttribs.bhLB_med = self.bow * 0.3
    #---Long range
            self.charAttribs.bhCRM_long = self.rifle * 0.1
            self.charAttribs.bhPST_long = self.pistol * 0.1
            self.charAttribs.bhHW_long = self.heavy_weapon * 0.1
            self.charAttribs.bhLCG_long = self.big_gun * 0.1
            self.charAttribs.bhLB_long = self.bow * 0.1
    


    编辑: 我想我想做的是这样的事情:

    在我看来,这是有道理的。但当我真的想编码的时候,我就迷路了。问题是,我想,这是我写的第一个“真正的”程序;我以前所做的只是一些小脚本。

    这只是我程序的0.1版本,所以现在重构它并不重要。不过,手工做这件事似乎很不象话,我也想“证明未来”,以防事情在未来发生变化。

    5 回复  |  直到 16 年前
        1
  •  6
  •   James Bennett    16 年前

    感觉上你真正想要的是一个代表武器的类,它有处理基本值和计算命中值的属性以及各种修饰符。下面是一个简单的例子:

    SHORT_RANGE = 'S'
    MEDIUM_RANGE = 'M'
    LONG_RANGE = 'L'
    SHORT_RANGE_MODIFIER = 0.6
    MEDIUM_RANGE_MODIFIER = 0.3
    LONG_RANGE_MODIFIER = 0.1
    
    class Weapon(object):
        def __init__(self, code_name, full_name, base_hit_value,
                     short_range_modifier=None, medium_range_modifier=None,
                     long_range_modifier=None):
            self.code_name, self.full_name = code_name, full_name
            self.base_hit_value = base_hit_value
            self.range_modifiers = {
                SHORT_RANGE: short_range_modifier or SHORT_RANGE_MODIFIER,
                MEDIUM_RANGE: medium_range_modifier or MEDIUM_RANGE_MODIFIER,
                LONG_RANGE: long_range_modifier or LONG_RANGE_MODIFIER,
            }
    
        def hit_value(self, range, modifier=1):
            return self.base_hit_value * self.range_modifiers[range] * modifier
    

    从那里,你可以在你的角色对象中创建武器的实例,比如:

        self.rifle = Weapon('CRM', 'rifle', 5)
        self.pistol = Weapon('PST', 'pistol', 10)
    

    然后,如果,比方说,角色在短距离内发射手枪:

        hit_value = self.pistol.hit_value(SHORT_RANGE)
    

    hit_value()方法的额外参数可用于传入特定于字符或情况的修改。

    所有这些都是非常标准的,无聊的面向对象的设计过程,但是在很多情况下,这种思维方式会让你很快脱离实际,并提供至少一点基本的灵活性。

        2
  •  1
  •   Vincent Ramdhanie    16 年前

    你应该考虑使用策略设计。那就是创建一个具有命中点属性的武器超类。为来复枪、手枪、弓等创建子类武器。我确信武器之间的差异不仅仅是命中点。

    current_weapon * self.medium
    

    如果你决定以后添加更多武器,那么你不必编辑你的字符代码,因为你的字符可以处理任何武器。

    在伪Python中

    class Weapon
        hit = 1
        #other properties of weapon
    
    class Rifle(Weapon)
        #other properties of Rifle
    
    class Pistol(Weapon)
        #other properties of Pistol
    
    class Character
       weapon = Rifle()
       long=0.6
       def calcHit()
          return self.long*weapon.hit
    
    john = Character()
    john.weapon= Rifle()
    john.calcHit
    
        3
  •  0
  •   Jack Jack    16 年前

    @文科:也许做一个calcBaseHitNumbers,做一个“如果不是自己。calculatedBase:”的内部检查,如果以前做过,就不要做任何操作。也就是说,我看不出预先计算这些信息的迫切需要。但我不是Python性能专家。

        4
  •  0
  •   The Archetypal Paul    16 年前

    你是什么意思?有什么可能会有所不同-技能的数量,或权重因素,范围的数量(短,中,长)或所有这些?

    之后(例如)bhPST值会发生什么变化-它们会合并成一个数字吗?

    其中一件事是技能列表在代码中是硬连接的-我倾向于用一个方法替换bh变量

    所以(请考虑到我对Python一无所知:)

    def bh_short(self, key)
      skill = self.skill_dict.get(key, 0)
      return skill * 0.6
    

    现在你可以保留一个技能列表,这些技能有助于提高命中率,并且可以反复调用bh_short等。

    基本上,我们需要更多关于上下文的信息

        5
  •  0
  •   monopocalypse    16 年前

    我会有一个角色属性的类(所以你在角色类中没有很多东西)和一个武器属性的类:

    class WeaponAttribute(object):
    
        short_mod = 0.6
        med_mod = 0.3
        long_mod = 0.1
    
        def __init__(self, base):
            self.base = base
    
        @property
        def short(self):
            return self.base * self.short_mod
    
        @property
        def med(self):
            return self.base * self.med_mod
    
        @property
        def long(self):
            return self.base * self.long_mod
    
    
    class CharacterAttributes(object):
    
        def __init__(self, attributes):
            for weapon, base in attributes.items():
                setattr(self, weapon, WeaponAttribute(base))
    

    有一个 CharacterAttributes

    # Initialise
    self.charAttribs = CharacterAttributes(self.skill_dict)
    # Get some values
    print self.charAttribs.CRM.short
    print self.charAttribs.PST.med
    print self.charAttribs.LCG.long