Skip to main content
 首页 » 编程设计

python之重构游戏的 "to hit"值

2025年05月04日15Leo_wl

我正在制作一款游戏,其中一种方法根据技能值计算角色的基本命中数。该方法目前单独计算每个值,因为每个技能都可以在短距离、中距离和远距离使用。

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

我还考虑过为每个范围创建一个方法,并将元组作为参数传递。我可以用结果值创建一个新的元组或列表,然后将它们分配给各个变量,但我看不出它比这样做有什么好处,除了它看起来不会那么复制和粘贴.

这是我目前拥有的:

    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版本,所以现在重构它并不重要。然而,手动执行此操作似乎非常不符合 Pythonic,我也想“面向 future ”,以防万一事情发生变化。

请您参考如下方法:

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

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() 方法的额外参数可用于传递特定于字符或特定情况的修改。

当然,除此之外的下一步是直接将武器建模为 Weapon 的子类(可能分解为特定类型的武器,如枪支、弓箭、手榴弹等,每种都有自己的基础值)和添加一个 Inventory 类来表示角色携带的武器。

所有这些都是非常标准、枯燥的面向对象设计过程,但在很多情况下,这种类型的思维会让您快速起步,并至少提供一点基本的灵 active 。