首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同类的函数中使用来自一个类的对象的信息

在不同类的函数中使用来自一个类的对象的信息
EN

Stack Overflow用户
提问于 2020-08-21 18:02:14
回答 1查看 27关注 0票数 0

因此,我是Python的新手,并试图通过YouTube和各种网站将它们拼凑在一起。对于我玩的一款FPS游戏,我正在尝试计算各种枪和它们的最佳弹药(bis)的DPS (伤害/秒)。我已经列出了每个弹药作为一个物体在弹药类下,以及每个武器作为一个物体在武器类。示例:

代码语言:javascript
复制
class Ammo:
    def __init__(self, name, damage, pen, cost, caliber, bis):
        self.name = name
        self.damage = damage
        self.pen = pen
        self.cost = cost
        self.caliber = caliber
        self.bis = bis

#   9x19 mm ammo    MP5/MPX/MP9

a7N31 = Ammo('7N31', 52, 39, 489, '9x19mm', True)
aAP63 = Ammo('AP 6.3', 52, 30, 327, '9x19mm', False)
a9GT = Ammo('Green Tracer', 58, 14, 70, '9x19mm', False)

#   12.7x55 mm ammo    ASh-12

aPS12 = Ammo('PS12', 115, 28, 361, "12.7x55mm", False)
aPS12A = Ammo('PS12A', 165, 10, 342, "12.7x55mm", False)
aPS12B = Ammo('PS12B', 102, 46, 603, "12.7x55mm", True)

#   7.62x51 mm ammo    SA-58/.308 MDR

aM62 = Ammo('M62', 79, 54, 469, "7.62x51mm", True)
aM80 = Ammo('M80', 80, 41, 200, "7.62x51mm", False)
aTPZ = Ammo('TPZ SP', 60, 36, 113, "7.62x51mm", False)


class Weapon:
    def __init__(self, name, rpm, caliber, gcost, bcost, recoil):
        self.name = name
        self.rpm = rpm
        self.caliber = caliber
        self.gcost = gcost
        self.bcost = bcost
        self.recoil = recoil

w0 = Weapon('ASh-12', 650, '12.7x55 mm', '~75,000 ₽', '~165,000 ₽', 128)
w1 = Weapon('MP9-N', 1100, '9x19 mm', '~23,000 ₽', '~101,000 ₽', 48)
w2 = Weapon('SA-58', 700, '7.62x51 mm', '~50,000 ₽', '~215,000 ₽', 63)

我不明白的是,如何制作一个函数,将标有最佳插槽(bis = True)的弹药的伤害乘以给定武器的每分钟轮数(rpm)除以60。理想情况下,此函数将考虑到武器口径,自动使用该口径的最佳弹药。我似乎找不到任何关于将一个类的对象的值用于另一个类的函数的信息(如果这就是这里所发生的事情),而且我真的不确定这是否是正确的方法。任何帮助都将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-21 21:02:48

代码:

代码语言:javascript
复制
class Ammo:
    def __init__(self, name, damage, pen, cost, caliber, bis):
        self.name = name
        self.damage = damage
        self.pen = pen
        self.cost = cost
        self.caliber = caliber
        self.bis = bis

#   9x19 mm ammo    MP5/MPX/MP9

a7N31 = Ammo('7N31', 52, 39, 489, '9x19mm', True)
aAP63 = Ammo('AP 6.3', 52, 30, 327, '9x19mm', False)
a9GT = Ammo('Green Tracer', 58, 14, 70, '9x19mm', False)

#   12.7x55 mm ammo    ASh-12

aPS12 = Ammo('PS12', 115, 28, 361, "12.7x55mm", False)
aPS12A = Ammo('PS12A', 165, 10, 342, "12.7x55mm", False)
aPS12B = Ammo('PS12B', 102, 46, 603, "12.7x55mm", True)

#   7.62x51 mm ammo    SA-58/.308 MDR

aM62 = Ammo('M62', 79, 54, 469, "7.62x51mm", True)
aM80 = Ammo('M80', 80, 41, 200, "7.62x51mm", False)
aTPZ = Ammo('TPZ SP', 60, 36, 113, "7.62x51mm", False)

class Weapon:
    def __init__(self, name, rpm, caliber, gcost, bcost, recoil):
        self.name = name
        self.rpm = rpm
        self.caliber = caliber
        self.gcost = gcost
        self.bcost = bcost
        self.recoil = recoil
    
    def find_bis(self, ammo_list):
        for ammo in ammo_list:
            if ammo.caliber == self.caliber and ammo.bis is True:
                return ammo
        return None
    
    def bis_rpm(self, ammo_list):
        bis = self.find_bis(ammo_list)
        if bis is None:
            return None
        return bis.damage * self.rpm / 60

w0 = Weapon('ASh-12', 650, '12.7x55mm', '~75,000 ₽', '~165,000 ₽', 128)
w1 = Weapon('MP9-N', 1100, '9x19mm', '~23,000 ₽', '~101,000 ₽', 48)
w2 = Weapon('SA-58', 700, '7.62x51mm', '~50,000 ₽', '~215,000 ₽', 63)

ammos = [a7N31, aAP63, a9GT, aPS12, aPS12A, aPS12B, aM62, aM80, aTPZ]

print(w0.find_bis(ammos).name, w0.bis_rpm(ammos))
print(w1.find_bis(ammos).name, w1.bis_rpm(ammos))
print(w2.find_bis(ammos).name, w2.bis_rpm(ammos))

输出:

代码语言:javascript
复制
PS12B 1105.0
7N31 953.3333333333334
M62 921.6666666666666

我把你所有的阿莫斯都列了一张清单。

有一些更聪明的方法可以打包它们(比如制作字典),但这只是为了向您展示一下想法。

我还修复了口径中的一个打字错误(在你的原始代码中,ammos和weapons不一样,有一个空格差异)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63520699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档