Galera, sou iniciante em java, aprendi recentemente os conceitos de classes abstratas, polimorfismo, etc. Resolvi fazer esse modelo básico de um jogo. Queria saber o que vocês que são mais experientes acham. Estes códigos que fiz estão bem feitos? O que pode ser melhorado? O que está errado? Qualquer dica é bem vinda, pois fiz no intuito de aprender mais. Agradeço desde já quem poder ajudar e peço desculpas pelo tamanho que ficou o tópico.
package model_chars;
import model_equips.AbstractEquipamento;
public abstract class AbstractPersonagem {
private final String nome;
private double atack;
private double def;
private int hp;
private int mp;
public AbstractPersonagem(String nome, int hp, int mp, double atack, double def) {
this.hp = hp;
this.mp = mp;
this.atack = atack;
this.def = def;
this.nome = nome;
}
public abstract void atacar(AbstractPersonagem p);
public abstract boolean canUse(AbstractEquipamento equipamento);
public final double getAtack() {
return this.atack;
}
public final double getDef() {
return this.def;
}
public final int getHp() {
return this.hp;
}
public final int getMp() {
return this.mp;
}
public final void setAtack(double atack) {
this.atack = atack;
}
public final void setDef(double def) {
this.def = def;
}
public final void setHp(int hp) {
this.hp = hp;
}
public final void setMp(int mp) {
this.mp = mp;
}
public final String getNome() {
return this.nome;
}
}
package model_chars.jogador;
import model_chars.AbstractPersonagem;
import model_chars.jogador.classes.Guerreiro;
import model_chars.jogador.classes.Mago;
import model_equips.AbstractEquipamento;
import model_equips.arma.AbstractArma;
import model_equips.arma.classes.Faca;
import model_equips.armadura.AbstractArmadura;
import model_equips.armadura.classes.ArmaduraSimples;
import exceptions.LevelLimitException;
public abstract class AbstractJogador extends AbstractPersonagem{
private static final int max_lv = 30;
private int level;
private AbstractArma arma;
private AbstractArmadura armadura;
private final Class<AbstractJogador> jogadorClass;
public AbstractJogador(String nome, Class jogadorClass){
super(nome, 400, 200, 10, 5);
this.level = 1;
this.arma = new Faca();
this.armadura = new ArmaduraSimples();
this.jogadorClass = jogadorClass;
}
public abstract void redefineStatus();
public final void levelUp() throws LevelLimitException{
if (this.getLevel() == max_lv){
throw new LevelLimitException();
}
this.level++;
this.redefineStatus();
}
@Override
public boolean canUse(AbstractEquipamento equipamento) {
Class[] restrict_cls = equipamento.getRestrictClass();
for (Class classe : restrict_cls){
if (classe.equals(this.getJogadorClass())){
return true;
}
}
return false;
}
private Class getJogadorClass() {
return this.jogadorClass;
}
@Override
public final void atacar(AbstractPersonagem monstro){
}
public final int getLevel() {
return this.level;
}
public final AbstractArma getArma(){
return this.arma;
}
public final void setArma(AbstractArma arma){
this.arma = arma;
}
public final AbstractArmadura getArmadura(){
return this.armadura;
}
public final void setArmadura(AbstractArmadura armadura){
this.armadura = armadura;
}
public final double mostraAtaque(){
if (this.arma != null){
return this.arma.getAtack() + this.getAtack();
}
return this.getAtack();
}
public final double mostraDefesa(){
if (this.armadura != null){
return this.armadura.getDef() + this.getDef();
}
return this.getDef();
}
}
package model_chars.jogador.classes;
import model_chars.jogador.AbstractJogador;
public class Guerreiro extends AbstractJogador{
public Guerreiro(String nome) {
super(nome, Guerreiro.class);
}
@Override
public void redefineStatus() {
int lv = this.getLevel();
this.setAtack(this.getAtack() + Math.pow(lv, 0.7));
this.setDef(this.getDef() + Math.pow(lv, 0.9));
this.setHp(this.getHp() + (int)Math.pow(lv, 0.9));
this.setMp(this.getMp() + (int)Math.pow(lv, 0.4));
}
}
[code]
package model_chars.jogador.classes;
import model_chars.jogador.AbstractJogador;
public class Mago extends AbstractJogador{
public Mago(String nome) {
super(nome, Mago.class);
}
@Override
public void redefineStatus() {
int lv = this.getLevel();
this.setAtack(this.getAtack() + Math.pow(lv, 0.9));
this.setDef(this.getDef() + Math.pow(lv, 0.5));
this.setHp(this.getHp() + (int)Math.pow(lv, 0.7));
this.setMp(this.getMp() + (int)Math.pow(lv, 0.8));
}
}[/code]
[code]package model_equips;
public abstract class AbstractEquipamento {
private final String nome;
private final int lv_min;
private final String description;
private final Class[] restrict_cls;
public AbstractEquipamento(String nome, int lv_min, String description, Class[] restrict_cls){
this.lv_min = lv_min;
this.description = description;
this.restrict_cls = restrict_cls;
this.nome = nome;
}
public final int getLv_min(){
return this.lv_min;
}
public final String getDescription(){
return this.description;
}
public final String getNome(){
return this.nome;
}
public final Class[] getRestrictClass(){
return this.restrict_cls;
}
}[/code]
[code]
package model_equips.arma;
import model_equips.AbstractEquipamento;
public abstract class AbstractArma extends AbstractEquipamento{
private final double atack;
public AbstractArma(String nome, int lv_min, String description, double atack, Class[] restrict_cls){
super(nome, lv_min, description, restrict_cls);
this.atack = atack;
}
public final double getAtack(){
return this.atack;
}
}[/code]
[code]
package model_equips.armadura;
import model_equips.AbstractEquipamento;
public abstract class AbstractArmadura extends AbstractEquipamento{
private final double def;
public AbstractArmadura(String nome, int lv_min, String description, Class[] restrict_cls, double def) {
super(nome, lv_min, description, restrict_cls);
this.def = def;
}
public double getDef(){
return this.def;
}
}[/code]
[code]
package model_equips.arma.classes;
import model_chars.jogador.classes.Guerreiro;
import model_chars.jogador.classes.Mago;
import model_equips.arma.AbstractArma;
public class Faca extends AbstractArma{
private static final String nome = “Faca”;
private static final String description = “Uma faca simples, não é muito perigosa”;
private static final int lv_min = 1;
private static final Class[] restrict_cls = {Mago.class, Guerreiro.class};
private static final double atack = 10;
public Faca() {
super(nome, lv_min, description, atack, restrict_cls);
}
}[/code]
[code]
package model_equips.arma.classes;
import model_chars.jogador.classes.Guerreiro;
import model_equips.arma.AbstractArma;
public class Machado extends AbstractArma{
private static final String nome = “Machado”;
private static final String description = “Um machado velho, parece ainda funcionar bem”;
private static final int lv_min = 5;
private static final Class[] restrict_cls = {Guerreiro.class};
private static final double atack = 42.4;
public Machado() {
super(nome, lv_min, description, atack, restrict_cls);
}
}[/code]
[code]
package model_equips.armadura.classes;
import model_chars.jogador.classes.Guerreiro;
import model_chars.jogador.classes.Mago;
import model_equips.armadura.AbstractArmadura;
public class ArmaduraSimples extends AbstractArmadura{
private static final int lv_min = 1;
private static final String description = “Uma armadura simples feita de couro, não é muito forte”;
private static final int def = 8;
private static final Class[] restrict_cls = {Mago.class, Guerreiro.class};
private static final String nome = “Armadura de couro”;
public ArmaduraSimples() {
super(nome, lv_min, description, restrict_cls, def);
}
}[/code]