描述:
有两个战士在战斗,每个人每回合攻击一次,直到其中一人的血量<=0。写一个方法来返回胜利者的名字。现有一个Fighter类,如下:
public class Fighter {
public string Name;
public int Health, DamagePerAttack;
public Fighter(string name, int health, int damagePerAttack) {
this.Name = name;
this.Health = health;
this.DamagePerAttack = damagePerAttack;
}
}
例如:
declareWinner(new Fighter(“佐助”, 10, 2), new Fighter(“鸣人”, 5, 4), “佐助”) => “佐助”
佐助攻击鸣人; 鸣人剩余三点血.
鸣人攻击佐助; 佐助剩余六点血.
佐助攻击鸣人; 鸣人剩余一点血.
鸣人攻击佐助; 佐助剩余二点血.
佐助攻击鸣人: 鸣人血量为-1,已死亡. 佐助胜出.
MyCode:
public class Kata {
public static string declareWinner(Fighter fighter1, Fighter fighter2, string firstAttacker)
{
int h1 = fighter1.Health,h2 = fighter2.Health;
int a1 = fighter1.DamagePerAttack,a2 = fighter2.DamagePerAttack;
while(h1 > 0 && h2 > 0)
{
if(fighter1.Name == firstAttacker)
{
h2 = h2 - a1;
firstAttacker = fighter2.Name;
}
else
{
h1 = h1 - a2;
firstAttacker = fighter1.Name;
}
}
return h1 <= 0 ? fighter2.Name : fighter1.Name;
}
}
CodeWar:
using System.Linq;
public class Kata
{
public static string declareWinner(Fighter fighter1, Fighter fighter2, string firstAttacker)
{
var fighters = new [] { fighter1, fighter2 };
var Attacker = fighters.Single(f => f.Name == firstAttacker);
var Defender = fighters.Single(f => f.Name != firstAttacker);
Defender.Health -= Attacker.DamagePerAttack;
if(Defender.Health <= 0)
{
return Attacker.Name;
}
return declareWinner(fighter1, fighter2, Defender.Name);
}
}