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
- Classe base
Pokebola:- Contém o método
capturar(Pokemon pokemon), que realiza o processo de tentativa de captura.capturarcontinua sendofinal: 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
Randomusado no sorteio.
- Contém o método
- As seguintes pokébolas devem ser implementadas:
| Tipo | Geração | Modificador de taxa de captura (bônus) | Efeito aplicado |
|---|---|---|---|
Pokebola | 1 | 1x | |
GreatBall | 1 | 1.5x | |
UltraBall | 1 | 2x | |
MasterBall | 1 | Faz com que a taxa de captura modificada seja 255 | Captura garantida |
FastBall | 2 | 4x quando o pokémon alvo tem pelo menos 100 de velocidade. Caso contrário, 1x | |
HeavyBall | 2 | 1x, mas altera a taxa da espécie de acordo com o peso (veja abaixo) | |
FriendBall | 2 | 1x | Altera os pontos de amizade do pokémon capturado para 200 |
HealBall | 4 | 1x | Restaura todo o HP do pokémon capturado |
-
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.
-
Efeitos: o efeito de uma pokébola só deve ser aplicado quando a captura for bem-sucedida.
-
TreinadoreJogo: o treinador passa a poder carregar até 8 pokébolas e começa o jogo com uma de cada tipo.