因此,我是Python的新手,并试图通过YouTube和各种网站将它们拼凑在一起。对于我玩的一款FPS游戏,我正在尝试计算各种枪和它们的最佳弹药(bis)的DPS (伤害/秒)。我已经列出了每个弹药作为一个物体在弹药类下,以及每个武器作为一个物体在武器类。示例:
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。理想情况下,此函数将考虑到武器口径,自动使用该口径的最佳弹药。我似乎找不到任何关于将一个类的对象的值用于另一个类的函数的信息(如果这就是这里所发生的事情),而且我真的不确定这是否是正确的方法。任何帮助都将不胜感激
发布于 2020-08-21 21:02:48
代码:
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))输出:
PS12B 1105.0
7N31 953.3333333333334
M62 921.6666666666666我把你所有的阿莫斯都列了一张清单。
有一些更聪明的方法可以打包它们(比如制作字典),但这只是为了向您展示一下想法。
我还修复了口径中的一个打字错误(在你的原始代码中,ammos和weapons不一样,有一个空格差异)。
https://stackoverflow.com/questions/63520699
复制相似问题