Trilhas
/
C#
C#
/
Exercícios
/
Magos e guerreiros
Magos e guerreiros

Magos e guerreiros

Exercício de aprendizagem

Introdução

Herança

Em C#, uma hierarquia de classes pode ser definida usando herança, que permite que uma classe derivada (Car) herde o comportamento e os dados da sua classe pai (Vehicle). Se nenhum pai for especificado, a classe herda da classe object.

As classes pai podem fornecer funcionalidade às classes derivadas de três formas:

  • Definir um método comum.
  • Definir um método virtual, que é como um método comum, mas que as classes derivadas podem alterar.
  • Definir um método abstract, que é um método sem implementação que as classes derivadas precisam implementar. Uma classe com métodos abstract também precisa ser marcada como abstract. Classes abstratas não podem ser instanciadas.

O modificador de acesso protected permite que um membro da classe pai seja acessado em uma classe derivada, mas bloqueia o acesso a partir de outras classes.

As classes derivadas podem acessar membros da classe pai por meio da palavra-chave base.

// Inherits from the 'object' class
abstract class Vehicle
{
    // Can be overridden
    public virtual void Drive()
    {
    }

    // Must be overridden
    protected abstract int Speed();
}

class Car : Vehicle
{
    public override void Drive()
    {
        // Override virtual method

        // Call parent implementation
        base.Drive();
    }

    protected override int Speed()
    {
        // Implement abstract method
    }
}

O construtor de uma classe derivada chama automaticamente o construtor da classe pai antes de executar a lógica do próprio construtor. É possível passar argumentos para o construtor de uma classe pai usando a palavra-chave base:

abstract class Vehicle
{
    protected Vehicle(int wheels)
    {
        Console.WriteLine("Called first");
    }
}

class Car : Vehicle
{
    public Car() : base(4)
    {
        Console.WriteLine("Called second");
    }
}

Quando mais de uma classe deriva de uma classe base, essas duas (ou mais) classes costumam implementar versões diferentes de um método da classe base. Esse é um princípio muito importante chamado polimorfismo. Por exemplo, em uma variação do exemplo acima, mostramos como um código que usa Vehicle pode mudar de comportamento dependendo do tipo de veículo que foi instanciado.

abstract class Vehicle
{
   public abstract string GetDescription();
}

class Car : Vehicle
{
   public Car()
   {
   }

   public override string GetDescription()
   {
      return "Runabout";
   }
}

class Rig : Vehicle
{
   public Rig()
   {
   }

   public override string GetDescription()
   {
      return "Big Rig";
   }
}

Vehicle v1 = new Car();
Vehicle v2 = new Rig();

v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig

Instruções

Neste exercício, você joga um jogo de RPG chamado "Wizard and Warriors", no qual pode jogar como um Wizard ou um Warrior.

Existem regras diferentes para Warriors e Wizards que determinam quantos pontos de dano eles causam.

Para um Warrior, as regras são:

  • Causar 6 pontos de dano se o personagem que está sendo atacado não for vulnerável
  • Causar 10 pontos de dano se o personagem que está sendo atacado for vulnerável

Para um Wizard, as regras são:

  • Causar 12 pontos de dano se o Wizard preparar uma magia com antecedência
  • Causar 3 pontos de dano se o Wizard não preparar uma magia com antecedência

Em geral, os personagens nunca são vulneráveis. No entanto, os Wizards são vulneráveis se não tiverem preparado uma magia.

Você tem seis tarefas que trabalham com personagens Warrior e Wizard.

1. Descreva um personagem

Sobrescreva o método ToString() da classe Character para retornar uma descrição do personagem, formatada como "Character is a <CHARACTER_TYPE>".

var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"

2. Deixe os personagens não vulneráveis por padrão

Garanta que o método Character.Vulnerable() sempre retorne false.

var warrior = new Warrior();
warrior.Vulnerable();
// => false

3. Permita que os Wizards preparem uma magia

Implemente o método Wizard.PrepareSpell() para permitir que um Wizard prepare uma magia com antecedência.

var wizard = new Wizard();
wizard.PrepareSpell();

4. Faça os Wizards ficarem vulneráveis quando não tiverem preparado uma magia

Garanta que o método Vulnerable() retorne true se o wizard não tiver preparado uma magia; caso contrário, retorne false.

var wizard = new Wizard();
wizard.Vulnerable();
// => true

5. Calcule os pontos de dano de um Wizard

Implemente o método Wizard.DamagePoints() para retornar os pontos de dano causados: 12 pontos de dano quando uma magia tiver sido preparada, 3 pontos de dano quando não.

var wizard = new Wizard();
var warrior = new Warrior();

wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12

6. Calcule os pontos de dano de um Warrior

Implemente o método Warrior.DamagePoints() para retornar os pontos de dano causados: 10 pontos de dano quando o alvo for vulnerável, 6 pontos de dano quando não.

var warrior = new Warrior();
var wizard = new Wizard();

warrior.DamagePoints(wizard);
// => 10
Editar via GitHub O link abre em uma nova janela ou aba
C# Exercism

Tudo pronto para começar Magos e guerreiros?

Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.