<p>我已经用一种黑客的方式修改了你下面的代码。<a href="https://repl.it/@NotAnAmbiTurner/WhichHoneydewWebsite" rel="nofollow noreferrer">Working example here</a>。注意事项:</p>
<ul>
<li>你的<code>__str__</code>方法过于复杂,使用不当(实际上永远不应该直接<code>print</code>)</li>
<li>我怀疑(但不知道)这是家庭作业。如果你依赖作业来获得答案,你就不会在作业上取得好成绩。。。即使我在下面提供给你的不是我认为的“好”,而是“更好”。如果我真的想解决问题,我会去HackerRank或类似的网站,而不是为别人做家庭作业。你知道吗</li>
<li>你错过了“打击”和“战斗”之间的逻辑分界,而这正是我所做的</li>
<li>你用第一架战斗机的命中方法对两架战斗机进行命中,这对我来说很奇怪/反模式。这样做的好处是(有一个<code>Fighters.hit()</code>方法)你可以给不同的战斗机分配不同的伤害数组,理论上代码应该仍然像预期的那样工作。你知道吗</li>
<li>对我来说,一个fighter实例的<code>startTheFight</code>方法被用来在两个实例之间创建一个争斗(这本身并没有错,但我个人更希望startFight是一个类方法)。你知道吗</li>
<li>如果可以的话,您应该使用<code>f"{var_name}"</code>(仅在python3.6+中),并且您应该确保您的string方法是有意义的——与在整个函数中使用一堆随机语句给出输出相比,“构建”最终输出(要打印的string、list、dict等)通常更容易/更明智/更容易阅读。你知道吗</li>
<li>最后,你是不是希望战斗结束后血量恢复到满的?你知道吗</li>
</ul>
<p>代码:</p>
<pre><code>import random
class Fighters:
def __init__(self, name):
self.name = name
self.health = 100
self.damage = [5, 10, 15, 20]
def __str__(self):
return self.name
def hit(attacking_fighter, defending_fighter):
attack_damage = random.choice(attacking_fighter.damage)
defending_fighter.health -= attack_damage
if defending_fighter.health > 0:
print_str = f"{attacking_fighter} attacks {defending_fighter}!"
else:
print_str = f"{attacking_fighter} killed {defending_fighter}! {attacking_fighter} wins the fight!"
print_str += f" Hit for {attack_damage} damage | {defending_fighter}'s Health: {defending_fighter.health}hp"
print(print_str, end="\n\n")
return
def startTheFight(self, otherFighter):
while otherFighter.health > 0 and self.health > 0:
self.hit(otherFighter)
if otherFighter.health <= 0 or self.health <= 0:
break
otherFighter.hit(self)
Goku = Fighters("Goku")
Konan = Fighters("Konan")
#print(Goku)
#print(Konan)
Goku.startTheFight(Konan)
</code></pre>
<p>输出示例:</p>
<pre><code>Goku attacks Konan! Hit for 10 damage | Konan's Health: 90hp
Konan attacks Goku! Hit for 10 damage | Goku's Health: 90hp
Goku attacks Konan! Hit for 5 damage | Konan's Health: 85hp
Konan attacks Goku! Hit for 10 damage | Goku's Health: 80hp
Goku attacks Konan! Hit for 5 damage | Konan's Health: 80hp
Konan attacks Goku! Hit for 20 damage | Goku's Health: 60hp
Goku attacks Konan! Hit for 10 damage | Konan's Health: 70hp
Konan attacks Goku! Hit for 15 damage | Goku's Health: 45hp
Goku attacks Konan! Hit for 10 damage | Konan's Health: 60hp
Konan attacks Goku! Hit for 20 damage | Goku's Health: 25hp
Goku attacks Konan! Hit for 5 damage | Konan's Health: 55hp
Konan attacks Goku! Hit for 10 damage | Goku's Health: 15hp
Goku attacks Konan! Hit for 10 damage | Konan's Health: 45hp
Konan killed Goku! Konan wins the fight! Hit for 15 damage | Goku's Health: 0hp
</code></pre>