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.


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