#8 SVKSuli
takže...
1) ta třída "pridatArmu" je spatne, nevim sice co přesně obsahuje, ale názem je úplně špatně, rozhodně by neměla začínat malým písmenem a mělo by to být podstatné jméno (to same pro vyhodnocenie)
2) je videt, ze s OOP si moc nepřišel do styku, javascript je hnusnej jazyk, protože ti dovoli prakticky všechno a většinou to i projde, je potřeba vytvořit více objektů, pro každej reálnej předmět, by měla vzniknout speciální třída
Nejprve než začneš bušit do klávesnice, tak by sis měl promyslet, co všechno budeš potřebovat vytvořit, jinak se dostaneš do toho stavu, že všechno bude v jedné třídě nebo potom toho bude tolik, že refactor bude celkem vopruz
3) máš tam generování vzhledu - tomu se bohužel moc dobře nevyhneš a bylo by potřeba to udělat jinak, měl by vzniknout speciální Frame, kterej bude sloužit na konkrétní účel - Frame na boj, na info o postavě třeba nebo na další prvky.. potom samozřejmě hlavní Frame, který to bude všechno řídit.
Tímhle se vyhneš přeplácání.. jinými slovy by Frame měl sloužit POUZE pro vykreslení dat, logika by měla být oddělená
4) koukám, že ta metoda jednotky() je taková "hurá akce", sám si psal, že bude víc druhý jednotek, ok.. proč neudělat třídu "Jednotka" a od ní nepodědit další speciální jednotky? Všechny jednotky budou mít určité vlastností sdílené (pokud všechny, tak řešit přes enum)
// definovane typy jednotek
enum TypJednotky
{
KOSTLIVEC("Kostlivec", Kostlivec.class),
FANATIK("Fanatik", Fanatik.class);
private String nazev;
private Class<? extends Jednotka> clazz;
private TypJednotky(String nazev, Class<? extends Jednotka> clazz)
{
this.nazev = nazev;
this.clazz = clazz;
}
public String getNazev()
{
return nazev;
}
// vytvori instanci jednotky.. POZOR - jednotky musi mit vzdy bezparametricky konstruktor
@SuppressWarnings("unchecked")
public <T extends Jednotka> T vytvor()
{
try {
return (T) clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
return null;
}
}
// prepsanim metody toString() docileme, ze vypis bude nas "getNazev()" a ne puvodni "name()"
@Override
public String toString()
{
return nazev;
}
}
// KAZDA jednotka MUSI vychazet z teto tridy,
// protoze zakladni vlastnosti budou mit vsechny jednotky stejny
abstract class Jednotka
{
// nutno nastavit ve vsech potomcich a tento typ se nikdy menit nebude - proto final
private final TypJednotky typ;
protected int zivoty;
protected float utok;
public Jednotka(TypJednotky typ)
{
this.typ = typ;
zivoty = 100; // vychozi pocet zivotu pro vsechny jednotky
utok = 0; // to same jen utok
}
// typ nesmi mit setter !! (nedava to smysl)
public TypJednotky getTyp()
{
return typ;
}
public int getZivoty()
{
return zivoty;
}
public void setZivoty(int zivoty)
{
this.zivoty = zivoty;
}
public float getUtok()
{
return utok;
}
public void setUtok(float utok)
{
this.utok = utok;
}
// vlastni vypis jednotky pres toString()
@Override
public String toString()
{
return String.format("%s (%s Zivotu, %s Utok)", typ, zivoty, utok);
}
}
// specialni jednotka Kostlivce
// muze definovat dalsi vlastnosti, ktery se budou tykat POUZE kostlivce
class Kostlivec extends Jednotka
{
public Kostlivec()
{
super(TypJednotky.KOSTLIVEC);
zivoty = 250;
utok = 5.2f;
}
}
// to same jako pro kostlivce
class Fanatik extends Jednotka
{
public Fanatik()
{
super(TypJednotky.FANATIK);
zivoty = 160;
utok = 11f;
}
}
public class Hra
{
public static void main(String[] args)
{
JComboBox<TypJednotky> cbox = new JComboBox<>(TypJednotky.values());
cbox.setSelectedIndex(1); // vyberu neco v comboBoxu
// zde to klidne muzu pretypovat, protoze vim, jaky typ tam je
TypJednotky typ = (TypJednotky) cbox.getSelectedItem();
Jednotka jednotka = typ.vytvor(); // vytvori jednotku
// v pripade, ze by typy jednotek meli specialni vlastnosti, tak to lze odlisit takto
// ale pro tento pripad by uz bylo lepsi udelat factory, nez vytvaret jednotky takto,
// pokud budou mit vsechno jednotky stejny vlastnosti, tak takto je to idealni
if (typ == TypJednotky.FANATIK) {
Fanatik fanatik = typ.vytvor();
}
System.out.println(jednotka); // vypise
}
}
dost záleží taky na tom, jak si to celý představuješ a jakým směrem se to bude rozrůstat, tohle řešení co jsem napsal je jen jedno z vícero