Exercício: Persistindo a Pokédex com Tratamento de Exceções

Objetivo

O objetivo deste exercício é praticar o uso de tratamento de exções e afim de:

  • Implementar um sistema de persistência da Pokédex usando um arquivo CSV.
  • Aplicar tratamento de exceções para garantir que o jogo funcione mesmo em caso de erros.

Descrição

No jogo Pokémon que estamos desenvolvendo, o treinador captura Pokémon ao longo de sua jornada. Para que essas informações não sejam perdidas ao fechar o jogo, você deve implementar um sistema para salvar e carregar a Pokédex usando um arquivo.

Além disso, o sistema deve ser robusto, ou seja, deve lidar corretamente com possíveis erros que podem ocorrer durante a leitura e escrita do arquivo.

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 PokedexManager {
        + salvarPokedex(Pokedex pokedex) void
        + carregarPokedex() Pokedex
    }

    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
    Jogo -- PokedexManager
    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
    PokedexManager -- Pokedex
    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.Criar a classe PokedexManager

Esta classe será responsável por salvar e carregar a Pokédex a partir de um arquivo JSON.

  • void salvarPokedex(Pokedx pokedex)
    • Deve converter a Pokekex para CSV e salvá-la em dois arquivos capturados.csv e vistos.csv
    • Se houver erro ao salvar, exibir uma mensagem amigável.
  • Pokedex carregarPokedex()
    • Deve carregar a Pokedex a partir dos arquivos csv - Se o arquivo não existir, retornar uma Pokédex vazia.
  • Se o arquivo estiver corrompido, exibir uma mensagem de erro e retornar uma Pokédex vazia.

2. Modificar a classe jogo

  • Ao iniciar o jogo, a Pokedex deve ser carregada automaticamente
  • Ao sair do jogo, a Pokedex deve ser salva imediatamente no arquivo

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