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.
- encontrouPokemon: esse deve indicicar se o treinador encontrou um pokemon a sua localização atual.
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.
- arremesarPokebola: Este método recuperar a pokebola que será utilizada na captura.
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
- Utilize a seguinte formula:
- 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
truese a captura for bem-sucedida,falsecaso 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