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

Nesta atividade você deverá alterar o programa para permitir o uso de novos tipos de Pokébolas na captura de Pokémon. O ponto de partida é a tag v0.3 do repositório.

A versão atual do programa calcula a chance de captura a partir do nível do Pokémon. Nesta atividade, ela será substituída por uma versão simplificada da fórmula da terceira geração do jogo, que leva em conta a espécie do Pokémon, o HP que lhe resta e a Pokébola utilizada.

Será necessário alterar as classes Pokemon, GeradorDePokemon, Pokebola e suas subclasses, Treinador e Jogo, além dos testes que dependem delas.

Fórmula de Captura

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

\[\alpha = \cfrac{3 \cdot HP_{max} - 2 \cdot HP_{atual}}{3 \cdot HP_{max}} \cdot taxa_{especie} \cdot bonus_{ball}\]
  • \(HP_{max}\): HP máximo do Pokémon.
  • \(HP_{atual}\): HP atual do Pokémon.
  • \(taxa_{especie}\): taxa de captura base do Pokémon, que varia de acordo com a espécie (de 1 a 255).
  • \(bonus_{ball}\): multiplicador aplicado de acordo com o tipo de Pokébola. Pokébolas neutras possuem multiplicador igual a 1.

O método getTaxaDeCaptura continua devolvendo um double, mas agora deve retornar \(1 \leq \alpha \leq 255\): valores menores que 1 viram 1 e valores maiores que 255 viram 255. Declare esses limites como constantes.

O método capturar deve usar o atributo random para sortear um número inteiro entre 0 e 255 (inclusive). Se o número sorteado for menor ou igual a \(\alpha\), a captura é bem-sucedida.

  • Exemplo: um Pikachu (\(taxa_{especie} = 190\)) com o HP cheio, diante de uma Pokébola comum, tem \(\alpha = \frac{1}{3} \cdot 190 \cdot 1 \approx 63{,}3\). A captura acontece para os números sorteados de 0 a 63, ou seja, em 25% das vezes.
  • O nível do Pokémon deixa de influenciar diretamente a captura. Ele continua definindo o HP máximo.
  • No jogo, os Pokémon selvagens têm sempre o HP cheio, e por isso o primeiro fator vale sempre \(\frac{1}{3}\). Para verificar o efeito do HP, escreva testes que usem setHp.

Pokemon

A fórmula e as novas Pokébolas dependem de características que a classe Pokemon ainda não possui. Acrescente:

  • taxaDaEspecie: taxa de captura base da espécie (de 1 a 255). Não muda depois que o Pokémon é criado.
  • velocidade: velocidade do Pokémon. Não muda depois que o Pokémon é criado.
  • peso: peso do Pokémon, em kg. Não muda depois que o Pokémon é criado.
  • amizade: pontos de amizade do Pokémon (de 0 a 255). Todo Pokémon começa com 70 pontos.

Crie os métodos de acesso necessários, incluindo getHpMax. Apenas a amizade pode ser alterada, e somente para valores entre 0 e 255.

O GeradorDePokemon deve passar a criar os Pokémon selvagens com as características da sua espécie, de acordo com a tabela abaixo. Inclua na lista as espécies que ainda não estiverem nela.

Espécie Taxa da espécie Velocidade Peso (kg)
Mewtwo 3 130 122.0
Mew 45 100 4.0
Zapdos 3 100 52.6
Articuno 3 85 55.4
Moltres 3 90 60.0
Bellsprout 255 40 4.0
Pikachu 190 90 6.0
Eevee 45 55 6.5
Onix 45 70 210.0
Snorlax 25 30 460.0

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 Pokebola:
    • Contém o método capturar(Pokemon pokemon), que realiza o processo de tentativa de captura.
      • capturar continua sendo final: nenhuma subclasse pode sobrescrevê-lo.
    • Contém o método getTaxaDeCaptura(Pokemon pokemon), que aplica a fórmula de captura.
      • Este método deve ser o responsável por obter o bônus aplicado pela pokébola.
    • Assim como na atividade anterior, toda pokébola tem dois construtores: um público, sem parâmetros, e um sem modificador de acesso, que recebe o Random usado no sorteio.
  2. As seguintes pokébolas devem ser implementadas:
Tipo Geração Modificador de taxa de captura (bônus) Efeito aplicado
pokeball Pokebola 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
fastball FastBall 2 4x quando o pokémon alvo tem pelo menos 100 de velocidade. Caso contrário, 1x  
heavyball HeavyBall 2 1x, mas altera a taxa da espécie de acordo com o peso (veja abaixo)  
friendball FriendBall 2 1x Altera os pontos de amizade do pokémon capturado para 200
healball HealBall 4 1x Restaura todo o HP do pokémon capturado
  1. HeavyBall: em vez de multiplicar, ela soma um valor à taxa da espécie antes de a fórmula ser aplicada. O valor depende do peso \(p\) do Pokémon, em kg:

    • \(p < 100\): \(-20\)
    • \(100 \leq p < 200\): \(0\)
    • \(200 \leq p < 300\): \(+20\)
    • \(p \geq 300\): \(+30\)

    Se o resultado da soma for menor que 1, utilize 1.

  2. Efeitos: o efeito de uma pokébola só deve ser aplicado quando a captura for bem-sucedida.

  3. Treinador e Jogo: o treinador passa a poder carregar até 8 pokébolas e começa o jogo com uma de cada tipo.


This site uses Just the Docs, a documentation theme for Jekyll.