Hi, I'm currently working on a Java trading card game, similar to the old Pokémon one. What I now want to do is to define all the cards in some way, but because there's a lot of fields that need to be initialized, I'm thinking of alternative ways, because a constructor will be very long and hardly readable for each card. I also have to initialize the attacks which means I have to basically create an anonymous inner class (is the term correct?) every time, like so:
/**
* Base set Abra 43/102
*/
public final class Abra extends Pokemon
{
public Abra()
{
super(
new ImageIcon("img/scans/base-set/43-abra.jpg"),
"Abra",
"Base Set Abra",
null,
Type.PSYCHIC,
Type.PSYCHIC,
Type.NONE,
30,
0
);
attack1 = new Attack("Psyshock", Type.NORMAL)
{
/**
* 10 damage. Flip a coin. If heads, the Defending Pokémon is now Paralyzed.
*/
public void doAttack()
{
damageApplyWeaknessAndResistance(10);
if (gui.frames.CoinFlipDialog.showCoinFlipFrame() == CoinFlip.COIN_HEADS)
{
Game.getOpponentPlayer().getActivePokemon().status = Status.Paralyzed;
}
}
};
attack2 = null;
}
}
So my second option is to make a hierarchy with interfaces and abstract classes, meaning that the values will not be stored in fields, but rather just returned by methods when needed:
public interface Card extends Cloneable, MouseListener, MouseMotionListener
{
public String getFullName();
public ImageIcon getSmallIcon();
public ImageIcon getFullIcon();
}
public interface Pokemon extends Card
{
public String getName();
public int getHPLeft();
public int getMaxHP();
public Type getType();
public Type getWeakness();
public Type getResistance();
public int getRetreatCost();
public Attack getAttack1();
public Attack getAttack2();
}
public class Abra extends AbstractPokemon
{
@Override
public Attack getAttack1()
{
return new Abra.PsyShock();
}
@Override
public Attack getAttack2()
{
return null;
}
@Override
public int getMaxHP()
{
return 30;
}
@Override
public String getName()
{
return "Base Set Abra";
} //etc...
So my question is: Is any of these methods preferred or is there even any better way?