Exercício: Implementando a Pokedex usando Collections
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
Você foi contratado para aprimorar o sistema do jogo Pokémon e deve implementar uma funcionalidade central: a Pokedex.
A Pokedex é responsável por registrar informações sobre todos os Pokémon encontrados e capturados por um treinador durante suas aventuras.
Além disso, o sistema já conta com as classes Treinador, Pokemon, Batalha e a interface Encontrável e Capturável.
Sua tarefa é implementar a classe Pokedex utilizando diferentes Collections e integrá-la ao sistema, garantindo que os registros sejam atualizados com base nos eventos das batalhas.
Requisitos Funcionais
classDiagram
class Jogo {
- Mapa mapa
- Treinador treinador
+ Jogo(String nomeTreinador)
+ iniciar()
}
class Mapa {
- char[][] layout
- final int largura
- final int altura
+ Mapa(int largura, int altura)
- inicializarMapa()
+ exibirMapa(int x, int y)
+ posicaoValida(int x, int y) boolean
+ moverTreinador(Treinador treinador, String direcao) void
+ encontrouPokemon(Treinador treinador) boolean
}
class Treinador {
- String nome
- int x
- int y
- Pokebolas[] pokebolas
- Pokedex pokedex
+ Treinador(String nome, Pokedex pokedex)
+ getNome() String
+ getX() int
+ getY() int
+ getPokedex() Pokedex
+ setPosicao(int x, int y)
+ mover(String direcao)
+ arremessarPokebola() Pokebola
+ temPokebola() boolean
}
class Pokedex {
+ listarCapturados() List~Pokemon~
+ listarVistos() List~EspeciePokemon~
+ contarCapturasPorEspecie(nome: EspeciePokemon) int
+ taxaDeSucesso(nome: String) double
}
class Pokemon {
- nome: String
- nivel: int
+ getNome(): String
}
class Batalha {
- Treinador treinador
- Pokemon pokemons
- terminou boolean
+ Batalha(Treinador treinador, Pokemon pokemon)
+ iniciar() void
+ proximoTurno() void
+ terminou() boolean
}
class MenuPokedex {
+ MenuPokedex(Pokedex pokedex)
+ listarCapturados(): void
+ listarVistos(): void
+ exibirDetalhes(pokemon: EspeciePokemon): void
}
class Registravel {
<<interface>>
+ registrarEncontro(pokemon: Pokemon) void
+ registrarCaptura(pokemon: Pokemon) void
}
class EspeciePokemon {
<<Enumeration>>
BULBASAUR,
IVYSAUR
...
}
class Pokebola {
+ capturar(Pokemon pokemon) boolean
+ getBonus() float
# getTaxaDeCaptura(Pokemon pokemon) float
}
class PokebolaAfetaTaxaCaptura {
<<Abstract>>
+ getBonus() float
}
class PokebolaAfetaPokemon {
<<Abstract>>
+ aplicarEfeito(Pokemon pokemon)
}
class GreatBall {
}
class UltraBall {
}
class FastBall {
}
class HeavyBall {
}
class MasterBall {
}
class HealBall {
}
Jogo "1" --> "1" Mapa : usa
Jogo "1" --> "1" MenuPokedex : usa
Jogo "1" --> "1" Treinador : possui
Mapa "1" --> "1" Treinador : controla
Jogo "1" --> "*" Batalha : possui
Treinador "1" --> "1" Pokedex: possui
Batalha "1" --* "1" Treinador: envolve
Batalha "1" --* "1" Pokemon: envolve
Pokedex "1" --> "0..n" Pokemon: armazena
Pokedex ..|> Registravel
MenuPokedex "1" --* "1" Pokedex: utiliza
Pokebola "1" ..> "1" Pokemon: captura
Pokebola <|-- PokebolaAfetaTaxaCaptura
Pokebola <|-- PokebolaAfetaPokemon
PokebolaAfetaPokemon <|-- HealBall
PokebolaAfetaTaxaCaptura <|-- GreatBall
PokebolaAfetaTaxaCaptura <|-- UltraBall
PokebolaAfetaTaxaCaptura <|-- FastBall
Pokebola <|-- MasterBall
Pokebola <|-- HeavyBall
1. Implementar a Classe Pokedex
Para implementar a classe Pokedex será necessário fazer o uso da interface Registravel.
- Funcionalidades:
- Armazenar Pokémon capturados
- Armazenar Pokémon vistos (mas não capturados)
- Contabilizar capturas por espécies
- Métodos
void registrarEncontro(Pokemon pokemon)- Registra um encontro com o Pokémon o adicionando na lista de pokemons vistos.
void registrarCaptura(Pokemon pokemon)- Registra a captura de um pokemon.
List<Pokemon> listarCapturados()- Retorna uma lista de Pokémon capturados, ordenada pelo número da espécie.
List<Pokemon> listarVistos()- Retorna uma lista de Pokémon vistos, ordenada pelo número da espécie.
int contarCapturasPorEspecie(String nome)- Retorna o número de capturas de uma espécie específica.
double taxaDeSucesso(String nome)- Calcula a taxa de sucesso de captura de uma espécie, considerando o número de capturas em relação ao número de encontros.
2. Integrar a Pokedex ao Sistema
Modifique a classe Batalha para que ela passe a atualizar pokedex do treinador.
3. Classe: MenuPokedex
Essa classe será responsável por gerenciar como o treinador interage com a Pokedex. Essa classe deve receber uma instância da Pokedex no construtor e usar os métodos da mesma para listar ou exibir detalhes.
Além disso, a cada interação, ela deve permitir que que o treinador visualize:
- Todos os Pokémon vistos.
- Todos os Pokémon capturados.
- Detalhes de um Pokémon específico
- Voltar ao mapa
Ela deve ler dados do teclado e reagir de acordo com a opção escolhida pelo usuário.
4. Classe Treinador
Modifique o construtor da classe Treinador para incluir uma instância da Pokedex.