Разработка чистого / гибкого способа для «персонажа» разыгрывать различные заклинания в ролевой игре - PullRequest
11 голосов
/ 04 февраля 2010

Я создаю ролевую игру для развлечения и обучения. Я нахожусь в точке, где мой персонаж (волшебник) использует заклинания. Я использую шаблон стратегии, чтобы установить заклинание, которое они собираются разыграть, перед тем, как читать заклинание. Причина, по которой я выбрал этот подход, заключается в том, что я хочу иметь возможность добавлять различные типы заклинаний в дальнейшем без необходимости возиться с классом персонажа / волшебника.

Мой вопрос - это плохой дизайн? Есть ли лучший / чище / проще подход для этого?

Я стараюсь держаться подальше от того "парня", который старается, чтобы все вписывалось в шаблон дизайна. Но в этом случае я чувствую, что это приличная подгонка.

Вот как выглядит мой код с двумя заклинаниями

public class Wizard : Creature
{
   public List<Spell> Spells { get; set; }

   public void Cast(Spell spell, Creature targetCreature)
   {
      spell.Cast(this, targetCreature);
   }
}

public abstract class Spell
{
   public string Name { get; set; }
   public int ManaCost { get; set; }
   public Spell(string name, int manaCost)
   {
      Name = name;
      ManaCost = manaCost;
   }
   public void Cast(Creature caster, Creature targetCreature)
   {
      caster.SubtractMana(ManaCost);
      ApplySpell(caster, targetCreature);
   }
   public abstract void ApplySpell(Creature caster, Creature targetCreature);
}

// increases the target's armor by 4
public class MageArmor : Spell
{
   public MageArmor() : base("Mage Armor", 4);
   public override void ApplySpell(caster, targetCreature)
   {
      targetCreature.AddAC(4);
   }
}

// target takes 7 damage
public class FireBall : Spell
{
   public FireBall() : base("Fire Ball", 5);
   public override void ApplySpell(caster, targetCreature)
   {
      targetCreature.SubtractHealth(7);
   }
}

Теперь, чтобы разыграть заклинание, мы делаем что-то вроде этого:

Wizard wizard = new Wizard();
wizard.Cast(new Spell.MageArmor(), wizard); // i am buffing myself 

ОБНОВЛЕНИЕ: обновленный код с некоторыми предложениями из ответов ниже

Ответы [ 11 ]

0 голосов
/ 04 февраля 2010

Прежде всего: всегда есть лучший / чище / простой подход для всего.

Но, на мой взгляд, вы сделали достойную абстракцию своего вызова, которая может стать прочной основой для дальнейших улучшений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...