每天开心一点

Python: 每日一题 50

2017-11-27 13:37:00    六月    624    来源: http://bbs.fishc.com/thread-87461-1-1.html

在学习python的过程中,对于我这种完完全全的零基础门外汉而言,我觉得类是比较难理解的一个概念。小甲鱼给了我们一个乌龟和鱼的游戏。

虽然我也知道大佬都比较偏爱算法一类以思考为主的题目,但是毕竟这个系列总体是偏向比较基础的题库。

所以今天我也给各位出个游戏题,这样可以给各位和我一样的新手更多的参考。如果你熟悉类,这题不会很难,如果你不熟悉类,可以通过这题来熟悉。Let's go.

写一个小游戏的程序:两名武士决斗,返回出胜利者的名字。

要求:两名武士轮流攻击对方,先杀死对方的胜者。而死亡取决于其health, health<=0时死亡。

每个武士为一个Fighter实例。(需要有名字(name),生命值(health),伤害(damage_per_attack))

主函数为:declare_winner(武士1,武士2,先攻击者)
返回值为:获胜者。

示例:
  1. declare_winner(Fighter("Lew", 10, 2), Fighter("Harry", 5, 4), "Lew") => "Lew"                # 此处函数中最后一个参数为先攻击者,而返回值为胜利者。

  2.   Lew attacks Harry; Harry now has 3 health.                # 这里是整个游戏的攻击过程,这也需要体现出来。
  3.   Harry attacks Lew; Lew now has 6 health.
  4.   Lew attacks Harry; Harry now has 1 health.
  5.   Harry attacks Lew; Lew now has 2 health.
  6.   Lew attacks Harry: Harry now has -1 health and is dead. Lew wins.

好了,如果有说的不清楚的地方,请留言。


  1. class Fighter(object):
  2.     def __init__(self, name, health, damage_per_attack):
  3.         self.name = name
  4.         self.health = health
  5.         self.damage_per_attack = damage_per_attack


  6. def attack(attacker, defender):
  7.     defender.health -= attacker.damage_per_attack
  8.     if defender.health > 0:
  9.         print('{0} attacks {1}; {2} now has {3} health.'.format(attacker.name, defender.name, defender.name, defender.health))
  10.     else:
  11.         print('{0} attacks {1}; {2} now has {3} health and is dead.{4} is wins.'.format(attacker.name, defender.name,  defender.name, defender.health, attacker.name))
  12.         return attacker.name


  13. def declare_winner(fighter1, fighter2, first_attacker):
  14.     if fighter1.name == first_attacker:
  15.         attacker = fighter1
  16.         defender = fighter2
  17.     else:
  18.         attacker = fighter2
  19.         defender = fighter1
  20.     while fighter1.health > 0 and fighter2.health > 0:
  21.         result = attack(attacker, defender)
  22.         if result:
  23.             return result
  24.         attacker, defender = defender, attacker