- Pattern-ul este aplicat clasei
Game, care contine o instanta a jocului in interiorul sau, initial nula. - Constructorul este privat si este apelat de metoda getInstance(), care creeaza un obiect nou prin
lazy instantiationsau returneaza obiectul existent.
- Pattern-ul este aplicat clasei
Information, prezenta in mai multe clase (Account, Spell, Entity). - Contine toate datele despre clasele de mai sus, iar parametri nefolositi sunt nuli.
- Pattern-ul este aplicat clasei
CharacterFactory, care creeaza mai multe tipuri de caractere (Mage, Rogue, Warrior). - Clasa nu poate fi instantiata, avand un constructor privat, iar metoda pentru creearea caracterelor este statica.
- Pattern-ul este aplicat claselor
Spell(visitor),CharactersiEntity. - Spell este o clasa abstracta si, deci, Visitor-ul este implementat de cele 3 abilitati (Fire, Ice, Earth).
- Visitor-ul viziteaza
Mage,Rogue,WarriorsiEnemysi verifica daca sunt imuni la abilitate, iar daca nu sunt aplica atacul.
- Jocul poate fi inceput in 2 moduri, din clasa Game pentru interfata text (in terminal)
sau din clasa
Test()pentru interfata grafica. Initial se creeaza frame-ul de inceput in care utilizatorul este intrebat in ce mod vrea sa se joace (CLIsauGUI) Se foloseste un GridBagLayout pentru asezarea intrebarii si a celor 2 butoane. Fiecare buton are un action listener care va inchide frame-ul curent si va incepe interfata corespunzatoare. Aceste butoane sunt stilizate in metodacreateStylishButton(). - Daca modul de joc ales este GUI, se va crea o alta fereastra unde utilizatorul
se va loga. Daca contul sau parola introduse nu sunt corecte se va incheia executia
programului. Tot folosindu-se un
GridBagLayoutimpreuna cuGridBagConstraintsse adauga label-urile deemailsipasswordsi field-urile corespunzatoare impreuna cu butonul de login care are un action listener care verifica logica de logare (contul si parola). - Daca contul si parola sunt valide, se incepe jocul in interfata grafica, in clasa
GameGUI. Se apeleaza metoda desetupUI(), in care se afiseaza caracterele curente ale jucatorului sub forma de panel-uri. Fiecare caracter are o imagine care este scalata la 300x300 pixeli. Imaginea este pozitionata deasupra in timp ce statisticile sunt pozitionate dedeusbt, sub forma de textfield-uri needitabile, cu bordura transparenta si cursor de culoarea background-ului pentru a fi invizibil. Fiecare panel al unui caracter are un butonSelectcu unActionListenercare va selecta caracterul si va apelasetupGameUI(), dupa ce curata frame-ul curent. - In
setupGameUI()se creeaza harta (grid-ul) cu butoanele de control (North, South etc.) si statisticile jucatorului la momentul curent. Se foloseste o matrice de butoane pentru harta, fiecare buton fiind gol, ca apoi sa aiba un icon corespunzator (daca a fost vizitat sau daca e celula curenta, unde se afla jucatorul). Fiecare buton de control are un action listener care va muta caracterul pe harta ca apoi celula noua sa fie procesata in metodaprocessCell(). InupdateStatsLabel(), se reimprospateaza statisticile caracterului la momentul curent, metoda apelata dupa o celula de tip sanctuar sau dupa o lupta. - In
processCell(), sunt 3 moduri de a interpreta celula,ENEMY,SANCTUARY,PORTAL. Daca celula e de tip SANCTUARY, se actualizeaza viata si mana; de tip PORTAL, experienta caracterului este crescuta si daca trece de pragul de experienta, nivelul este incrementat si trasaturile caracterului incrementate. Nivelul si numarul de jocuri sunt incrementate. Programul se reseteaza. In schimb, daca celula este de tip ENEMY, se creeaza un inamic nou si frame-ul este construit de asa natura incat sa fie compus din panel-urile caracterului si al inamicului si cel al butoanelor in care se poate selecta un atac normal sau o abilitate. Daca se selecteaza o abilitate, se afiseaza un grid scroll-abil cu icon-urile si statisticile corespunzatoare imaginilor. Daca se selecteaza o abilitate si caracterul are mana suficienta, se va executa, altfel se va afisa un avertisment si se va sugera un atac normal. - Daca jucatorul a castigat, se va continua jocul, executia programului reintorcandu-se la grid, altfel
se va afisa pagina finala cu statisticile jucatorului in
finalPage(). Aceasta contine imaginea caracterului curent cu statisticile sale si 2 butoane,ContinuesiExit. Apasarea butonului de Continue va restarta jocul, in timp ce Exit va inchide executia programului.