我正在做一个游戏,其中一种方法会根据技能值来计算角色的基本命中数。该方法当前可以单独计算每个值,因为可以在短,中和长距离使用每种技能。

我本来以为可以将这些技能组合成一个元组并对其进行迭代,从而动态地创建每个命中数。但是我不知道这是否真的可能,因为我目前已将每个匹配编号分配给它自己的变量。

我还考虑过为每个范围创建一个方法,并将元组作为参数传递。我可以用结果值创建一个新的元组或列表,然后将它们分配给各个变量,但是我看不出它会比这种方式做的更好,只是它看起来不会如此复制和粘贴。

这是我目前拥有的:

    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


您将如何重构它,使其更具动态性?



编辑:我想我想做的是这样的:
创建一个元组(如我注释过的元组),并对其进行3次迭代,每次基于针对每个特定范围的修饰符(对于每种技能)创建一个新值。然后将结果值自动分配给它的相应变量。

在我看来,这是有道理的。但是,当我实际尝试编写代码时,我会迷路。我认为问题在于这是我编写的第一个“真实”程序。我之前所做的只是一些小脚本。

这只是我程序的0.1版本,因此现在重构它并不重要。但是,手动执行此操作似乎非常不符合Python规范,我还想对此进行“面向未来的开发”,以防万一事情发生变化。

最佳答案

感觉好像您真正想要的是一个代表武器的类,该类具有处理基本值和使用各种修改器计算命中值的属性。这是一个简单的例子:

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


从那里,您可以在Character对象内创建Weapon实例,如下所示:

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


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

    hit_value = self.pistol.hit_value(SHORT_RANGE)


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

当然,除此以外的下一步是将武器直接建模为武器的子类(也许分解为特定类型的武器,例如枪,弓,手榴弹等,每种都有各自的基本值)并添加一个清单。代表角色携带的武器的类。

所有这些都是非常标准的,无聊的面向对象的设计过程,但是在许多情况下,这种类型的思考将使您快速起步并至少提供一点点基本灵活性。

关于python - 重构游戏的“命中”值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/237876/

10-11 14:32