Exercício: Usando diversos tipos de pokebola

Objetivo

O objetivo deste exercício é praticar o uso de classes abstratas, métodos abstratos e polimorfismo, além de aplicar conceitos de herança e encapsulamento. Para isso, você deverá implementar uma hierarquia de classes para diferentes tipos de Pokébolas, cada uma com suas características específicas.

Descrição

Nessa atividade você deverá alterar o programa para permitir o uso de diferentes Pokébolas para capturar Pokémon. A versão atual do pragrama utiliza a fórmula de captura do terceira geração do jogo que podemos observar a seguir:

Fórmula de Captura

A fórmula utilizada para calcular a taxa de captura modifacada, \(\alpha\) , de um Pokémon é a seguinte:

\[\alpha = \frac{3*HP_{max} - 2*HP_{atual}}{3*HP_{max}}*catch_{rate}*bonus_{ball}*bonus_{status}\]
  • \(HP_{max}\) : HP máximo do Pokémon.
  • \(HP_{atual}\) : HP atual do Pokémon.
  • \(catch_{rate}\) : Taxa de captura base do Pokémon, varia de acordo com a espécie de pokemon.
  • \(bonus_{ball}\) : É o multiplicador aplicado de acordo com o tipo de pokebola. Pokébolas neutras possuem o multiplicador igual 1.
  • \(bonus_{status}\) : É um multiplicador aplicado de acordo com o status do pokemon. Ex: Quando o pokemon está dormindo o bonus é igual 2.

O método getTaxaDeCaptura modificada deve retornar \(1 \leq \alpha \leq 255\).

O método capturar deve gerar um número aleatório entre 0 e 255. Se o valor de \(\alpha\) for menor ou igual ao número gerado, a captura é bem-sucedida.

Tipos de pokébolas

Existem diversos tipos de pokébolas, contudo podemos agrupá-las em dois grupos: aquelas que alteram a taxa de captura de acordo com características específicas do Pokémon e outras que aplicam efeitos adicionais no Pokémon capturado.

Você deve implementar uma hierarquia de classes para representar as Pokébolas e seus comportamentos, utilizando classes abstratas e métodos abstratos quando necessário.

Requisitos Funcionais

  1. Classe Base Pokeball:
    • Contém o método capturar(Pokemon pokemon), que realiza o processo de tentativa de captura.
    • Contém um método getTaxaDeCaptura(Pokemon pokemon) que aplica a fórmula de captura.
      • Este método deve ser o responsável por identificar o bonus aplicado pela pokébola.
  2. As seguintes pokébolas devem ser implementadas Pokébolas Específicas:
Tipo Geração Modificador de taxa de captura (bonus) Efeito aplicado
pokebola Pokeball 1 1x  
greatball Greatball 1 1.5x  
ultraball Ultraball 1 2x  
masterball Masterball 1 Faz com que a taxa de captura modificada seja 255 Captura garantida
fastdball Fastball 2 4x quando o pokémon alvo tem pelo menos 100 de velocidade. Caso constrário 1x  
heavyball Heavyball 2 \(f(p) = \begin{cases} -20 & \quad \text{Se } p \leq 99.9 \\ 0 & \quad \text{Se } 100 \geq p \geq 199.9 \\ +20 & \quad \text{Se } 200 \geq p \geq 299.9 \\ +30 & \quad \text{Se }p \geq 300 \\ \end{cases}\)  
friendball Friendball 2 1x Altera os pontos de amizade do pokemon capturado para 200
healball Healball 6 1x Restaura o HP, o PP e qualquer condição de status do pokemon capturado