Skip to content

Latest commit

 

History

History
186 lines (109 loc) · 6.67 KB

README.md

File metadata and controls

186 lines (109 loc) · 6.67 KB

LeagueOfOOP

Copyright : Cretu Maria - Carmina, 325CA

Implementare :

  • fiecare tip de erou are cate o clasa specifica ce mosteneste clasa abstracta Hero;

  • fiecare abilitate are o clasa proprie ce mosteneste clasa abstracta Ability;

  • logica jocului este implementata in clasa GameEngine;

  • am aplicat conceptul de double-dispatch pentru lupta dintre eroi;

  • fiecare tip de inger are cate o clasa specifica ce mosteneste clasa abstracta Angel;

Ce este nou?

  • am folosit urmatoarele design pattern-uri : Visitor Pattern, Strategy Pattern si Observer Pattern;

Design :

Ce este nou?

AngelFactory :
  • returneaza o singura instanta, utilizand din nou Singleton Pattern, a unui tip de inger;

  • este utilizat, de asemenea, Factory Pattern.

Ingeri :
  • fiecare clasa contine 4 metode de visit particularizate;

  • se retin urmatoarele: coordonatele ingerului si tipul acetuia.

Visitor Pattern :
  • am implementat in fiecare clasa ce apartine unui tip de inger metodele de visit cu implementarea specifica din enunt, avand ca parametru, tipul de erou pe care urmeaza sa il viziteze;

  • in fiecare clasa de erou, apare o metoda de accept, care modifica pentru eroul respectiv, modificatorii de damage/XP/HP.

Strategy Pattern :
  • in pachetul heroes, am adaugat clasa abstracta HeroStrategy, ce contine cele doua startegii ale fiecarui erou : attack si respectiv,defense si o metoda choose care activeaza o anumita strategie in functie de HP-ul curent al jucatorului.

  • observand faptul ca startegiile eroilor au un comportament asemantor, am decis sa trasmit ca parametrii in constructor, datele care variaza precum :

  • limita inferioara(minLimit) pentru intervalul strategiei attack;

  • limita superioara(maxLimit) pentru intervalul strategiei attack;

  • modificarea coeficientilor de damage pentru strategia de attack(attackBoost);

  • modificarea coeficientilor de damage pentru strategia de defense(defenseBoost);

  • pierderea de HP(lossHP) specifica strategiei de attack;

  • castigarea de HP(winHP) specifica strategiei de defense;

  • am creat pentru fiecare tip de erou, 4 clase(KnightStrategy, PyromancerStrategy, RogueStrategy si WizardStrategy) pentru a particulariza strategiile in functie de parametrii descrisi mai sus;
Observer Pattern :
  • pentru realizarea acestui pattern, am creat pachetul observer, ce dispune de doua interfete: Observer si Subject;

  • Observer reprezinta observatorul ce trebuie notificat, care este implementat de catre TheGreatestMagician;

  • in clasa specifica Marelui Magician am utilizat Singleton Pattern pentru a crea o singura instanta a acestuia;

  • interfata Subject reprezinta obiectul observabil si este implementata de catre clasa Angel, implicit de clasele care o mostenesc si de catre Hero, implicit de tipurile de eroi;

  • in plus fata de observer, exista pachetul events, care are la baza interfata Event si clasele ce o implementeaza;

  • am tratat situatiile precum : comportamentul ingerilor in joc si lupta jucatorilor ca pe niste evenimente:

  • Spawn notifica aparitia unui inger pe harta;

  • Helped/Hit verifica daca un erou a fost ajutat, respectiv incurcat de catre un inger;

  • LevelUp verifica cand un jucator a avansat la urmatorul sau urmatoarele nivel/e;

  • Kill anunta faptul ca un erou si-a omorat victima;

  • KilledByAngel ii permite Marelui Magician sa afle ce erou a fost omorat de catre un inger;

  • BackToLife notifica invierea unui jucator de catre un inger.

  • Observer are metoda de update avand ca parametru evenimentul de tip Event, ce este implementata in TheGreatestMagician si scrie in fisier evenimentele ce au avut loc in timpul jocului;

  • Subject contine doua metode:

  • registerObserver(), ce stabileste cine poarta rolul de observer;

  • updateObserver(), ce instiinteaza adminul cu privire la ce se intampla in joc.

Citirea datelor :

  • se face in clasa GameInputLoader.

Harta :

  • m-am folosit de Singleton Pattern pentru a crea o singura instanta a clasei Map;

  • returnez terenul hartii prin metoda getField().

HeroFactory :

  • returneaza o singura instanta, utilizand din nou Singleton Pattern, a unui tip de jucator.

Double-Dispatch :

  • in clasa abstracta Hero se regasesc 8 metode receive(abilitate) corespunzatoare pentru fiecare abilitate in parte;

  • fiecare metoda de receive executa urmatoarele actiuni:

  • calculeaza damage-ul fara modificatori de rasa, obtinut prin metoda getDamage(), ce exista in fiecare abilitate (util pentru Deflect);

  • calculeaza damage-ul modificat de amplificatorul de rasa specific fiecarei victime care primeste atacul;

  • seteaza efectul de overtime al unei abilitati, unde este necesar.

  • aceste metode sunt suprascrise in subclasele lui Hero, specificand in fiecare dintre acestea, modificatorul de rasa (multiplier);

  • in fiecare abilitate, exista metoda cast(atacator, atacat) in care elementul curent este vizitat, prin apelul target.receive(this), unde target este inamicul asupra caruia i se aplica abilitatea.

Abilitati :

  • in fiecare subclasa, se calculeaza damage-ul de baza dat de abilitatea respectiva impreuna cu modificatorul de teren prin intermediul metodei getDamage(), care este transmis in Hero, in receive();

  • metoda cast() reprezinta atacul, identificand abilitatea corespunzatoare fiecarui tip de jucator.

Eroi :

  • in clasa Hero, se regaseste mecanismul de level-up descris in metodele needToLevel, levelUp si gainXP;

  • in plus fata de cele 8 metode de receive(), explicate mai sus in Double-Dispatch, fiecare clasa de erou dispune de metoda getLandModifier() care atribuie bonusul de teren cand este cazul;

  • am adaugat campurile angelMultiplier si strategyMultiplier ce actualizeaza modificatorii primiti de la ingeri, respectiv strategie;

  • metoda print() care afiseaza stats-urile jucatorilor.

Constante :

  • clasa Constants este publica si statica, continand "numerele magice".

Organizarea jocului :

  • in clasa GameEngine, se realizeaza logica acestui joc conform cerintei, jucatorii miscandu-se pe harta conform input-ului primit si luptandu-se cand se intalnesc in acelasi loc, prin intermediul unei metode, numita battle care pune in aplicare lupta dintre doi jucatori, ce isi folosesc reciproc abilitatile specifice;

Afisarea datelor :

  • in clasa FileLogger, returneaza o singura instanta ce poate fi accesata prin metoda getLogger, utilizand din nou Singleton Pattern cu scopul de a fi vizibila ;

  • cu ajutorul metodei write, se scrie output-ul in fisier;

  • prin intermediul metodei close, se incheie activitatea Writer-ului out.