当前位置:  开发笔记 > 编程语言 > 正文

重构"击中"游戏的值

如何解决《重构"击中"游戏的值》经验,为你挑选了1个好方法。

我正在制作游戏,其中一种方法根据技能值计算角色的基本命中数.该方法当前单独计算每个值,因为每种技能可以在短,中和长范围内使用.

我原本以为我可以将技能组合成一个元组并迭代它,动态创建每个命中数.但我不知道它是否真的有可能,因为我目前每个命中数都分配给它自己的变量.

我还想过为每个范围创建一个方法,并将元组作为参数传递.我可以使用结果值创建一个新的元组或列表,然后将它们分配给各个变量,但我不知道它是如何以这种方式更好,除了它看起来不那么复制和粘贴.

这是我现在拥有的:

    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,我也希望"面向未来",以防万一事情发生变化.



1> James Bennet..:

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

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

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

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

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有