Exercício: Capturando Pokémon com Herança

Objetivo

Implementar a funcionalidade de captura de Pokémon no jogo. A lógica de movimentação no mapa já está funcionando, e a classe Pokemon está disponível. Sua tarefa é implementar as classes relacionadas às Pokébolas, que serão usadas pelo treinador para tentar capturar os Pokémon encontrados para isso utilizaremos Herança já que existem diversos tipos Pokebolas.

Descrição

Neste exercício você irá criar novas classes Batalha, Pokebola, GreatBall, UltraBall e MaterBall. Além disso será necessário alterar a classe Mapa.

classDiagram
    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
        - Pokemon[] pokemons
        - Pokebolas[] pokebolas
        + Treinador(String nome)
        + getNome() String
        + getX() int
        + getY() int
        + setPosicao(int x, int y)
		+ mover(String direcao)
		+ listar()
		+ capturar(Pokemon p) boolean
       + arremessarPokebola() Pokebola
		+ temPokebola() boolean

    }

    class Jogo {
        - Mapa mapa
        - Treinador treinador
        + Jogo(String nomeTreinador)
        + iniciar()
    }

    class Batalha {
        - Treinador treinador
        - Pokemon pokemons
        - terminou boolean
        + Batalha(Treinador treinador, Pokemon pokemon)
        + iniciar() void
        + proximoTurno() void
        + terminou() boolean
    }

    class Pokemon {
        + nome String
        + nivel int
        + Pokemon(String nome)
        + getNome() String
        + getNivel() String
    }

    class Pokebola {
        - float taxaBase
        - String nome
        Pokebola(float taxaBase)
        - getTaxaDeCaptura(Pokemon pokemon) float
        + capturar(Pokemon pokemon) boolean
    }

    class GreatBall {

    }

    class UltraBall {

    }

    class MasterBall {

    }


    %% Relações
    Jogo "1" --> "1" Mapa : usa
    Jogo "1" --> "1" Treinador : possui
    Mapa "1" --> "1" Treinador : controla
    Jogo "1" --> "*" Batalha : possui
    Treinador "1" --> "1..6" Pokemon: treina
    Treinador "1" --> "1..6" Pokebola: possui
    Batalha "1" --> "1" Treinador: envolve
    Batalha "1" --> "1" Pokemon: envolve
    Pokebola "1" ..> "1" Pokemon: captura
    Pokebola <|-- GreatBall
    Pokebola <|-- UltraBall
    Pokebola <|-- MasterBall

Mapa:

  • Métodos:
    • encontrouPokemon: esse deve indicicar se o treinador encontrou um pokemon a sua localização atual.
      • A cada movimento, há 50% de chance de encontrar um Pokémon.
      • No entanto, apenas em locais sinalizados com ‘ w ‘ um pokemon pode ser encontrado.

Treinador:

  • Atributos:
    • pokebolas: Esse atributo deve armazenar as pokebolas de um treinador.
  • Métodos:
    • arremesarPokebola: Este método recuperar a pokebola que será utilizada na captura.
      • Uma pokebola só pode ser utilizada uma única vez.
    • temPokebola: Indica se o treinador ainda tem pokebolas.

Batalha:

  • Essa classe controla a interação entre Treinador e Pokemon simulando uma Batalha.
  • Na versão atual, devem existir duas opções, tentar captura um pokemon ou sair.
  • Atributos:
    • Treinador: representa o treinador em batalha
    • Pokemon: representa o treinador em batalha
    • terminou: inidica se a batalha terminou
  • Métodos:
    • iniciar: Inicia a batalha mostrando as opções
    • proximoTurno: Inicia um novo turna da batalha
    • terminou: Indica que a batalha terminou

Fluxo de uma batalha:

stateDiagram-v2
    direction LR
    inicio: Pokemon apresentado
    usuario: Esperando decisão
    pokebola:  Escolha de pokebola
    state decisao <<choice>>
    state capturou <<choice>>
    [*] --> inicio
    inicio --> usuario: Treinador escolhe o que fazer
    usuario --> decisao
    decisao --> [*]: Sair
    decisao --> pokebola: Capturar
    pokebola --> capturou: Arremessa pokebola
    capturou --> [*]: Pokebola foi quebrada e acabaram as pokebolas
    capturou --> usuario: Pokebola foi quebrada, mas o treinador tem mais pokebolas
    capturou --> [*]: Pokemon foi capturado

Pokebola:

  • Atributos:
    • nome: Nome da Pokébola.
    • taxaBase: Taxa base de captura (entre 0.0 e 1.0).
  • Métodos:
    • Construtor que inicializa os atributos.
    • getTaxaDeCaptura: para um dado pokemon, calcula a a chance de capturá-lo
      • Utilize a seguinte formula:
        • \(taxaBase - taxaBase * \cfrac{nivelPokemon}{nivelMaximo}\) + 0.05
    • capturar: Implementação específica para cada tipo de Pokébola.
      • Sorteia um número aleatório entre 0 e 1. Se ele for menor que chance o pokemon é capturado
      • Retorne true se a captura for bem-sucedida, false caso contrário.

Classes Derivadas de Pokebola:

  • Pokébola: Taxa base = 0.4.
  • Crie as seguintes subclasses de Pokebola:
    • Great Ball: Taxa base = 0.6.
    • Ultra Ball: Taxa base = 0.8.
    • Master Ball: Taxa base = 1, mas sempre caputra

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