linachris / role-playing-game

A command line Role-Playing game, written in C++

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

role-playing-game

Εκπονήθηκε στα πλαίσια του μαθήματος "Αντικειμενοστραφής Προγραμματισμός(Κ10)" από:

Εντολή μεταγλώττισης: make

(αρχείο Makefile)

Εντολή εκτέλεσης: ./main

Στην εργασία αυτή, υλοποιείται μια προσομοίωση ενός παιχνιδιού ρόλων, στο οποίο υπάρχουν αντικείμενα(Item), ξόρκια(Spell), ήρωες(Hero) και τέρατα(Monster).Οι ήρωες και τα τέρατα ζουν σε έναν κόσμο που αναπαρίσταται από ένα πλέγμα(Grid), και πολεμάνε μεταξύ τους, με τους ήρωες να μπορούν να επισκέπτονται την αγορά(Market), και να αγοράζουν αντικέιμενα και ξόρκια για να νικήσουν. Μετά από μία νίκη αποκτούν εμπειρία(ενδεχομένως ανεβαίνουν και επίπεδο) και χρήματα, ενώ μετά από μία ήττα χάνουν χρήματα.

Αρχεία :

  • include/Items.h - src/Items.cpp --> Η υλοποίηση της έννοιας αντικείμενο(Item (Weapon, Armor, Potion))

  • include/Spells.h - src/Spell.cpp --> Η υλοποίηση της έννοιας ξόρκι(Spell (IceSpell,FireSpell,LightingSpell))

  • include/Livings.h - src/Heroes.cpp & src/Monsters.cpp --> Οι υλοποιήσεις της έννοιας ήρωας(Hero (Warrior,Sorcerer,Paladin)) και τέρας(Monster (Dragon,Exoskeleton, Spirit))

  • include/Location.h - src/Location.cpp --> Η υλοποίηση της κλάσης Location, που θα παριστάνει την θέση της ομάδας των ηρώων στον χάρτη του rpg

  • include/HeroesTeam.h - src/HeroesTeam.cpp --> Η υλοποίηση της κλάσης HeroesTeam, δηλαδή της ομάδας των ηρώων την οποία θα διαλέξει ο παίκτης

  • include/Database.h - src/Database.cpp --> Η υλοποίηση της κλάσης Database, στην οποία θα υπάρχουν διαθέσιμα όλα τα πιθανά livings(heroes, monsters) του κόσμου του rpg

  • include/Market.h - src/Market.cpp --> Η υλοποίηση της έννοιας αγορά(Market)

  • include/Grid.h - src/Grid.cpp --> Η υλοποίηση της έννοιας πλέγμα(Grid)

  • include/CommDefines.h --> Κάποια common defines που γίνονται σε αρκετά .cpp του project

  • src/main.cpp

  • txt/*.txt --> Τα αρχεία που χρησιμοποιούνται για την αρχικοποίηση όλων των εννοιών (υποκλάσεις των Living & Item & Spell), που περιέχουν δηλαδή όλα τα ονόματα και τις τιμές των protected μελών των παραπάνω κλάσεων.

  • ./Makefile -> Για την μεταγλώττιση και τη σύνδεση όλων των αρχείων.

main:

Στην main δημιουργούνται δυναμικά μέσω της κλήσης των constructor τους, αντικείμενα των κλάσεων Market(mark) & Database(dt), των οποίων τις διευθύνσεις παίρνει σαν όρισμα ο constructor του Grid, και δημιουργείται έτσι και ένα αντικείμενο της κλάσης Grid(game). Κατά την δημιουργία του Market, ο παίκτης καλείται να διαλέξει την ομάδα του(κλάση HeroesTeam), και ύστερα καλείται η συνάρτηση-μέλος του game play(), με την οποία ο παίκτης ξεκινάει το παιχνίδι και την μετακίνηση της ομάδας του στον χάρτη(πλέγμα), και σταματάει να εκτελείται όταν δώσει σαν είσοδο το "quit". Τέλος καλούνται οι destructors για τα mark & dt για την αποδέσμευση της μνήμης.

Η δημιουργία/καταστροφή των παραπάνω αντικειμένων θα εξηγηθεί παρακάτω.

Βασικότερες έννοιες/κλάσεις :

- Δημιουργία/Καταστροφή: Κατά την δημιουργία ενός αντικείμενου μίας υποκλάσης, μέσω του constructor της υποκλάσης αυτής, καλείται **πρώτα** ο constructor της **υπερκλάσης** και μετά της υποκλάσης, και ύστερα αρχικοποιούνται τα υπόλοιπα private μέλη της υποκλάσης με *initializer list*.   

- Η καταστροφή με την κλήση των destructors, γίνεται με την αντίστροφη σειρά. *Επίσης, οι destructors στις αφηρημένες κλάσεις έχουν οριστεί σαν virtual, ώστε όταν έχω δείκτη στην αφηρημένη αυτή υπερκλάση, ο οποίος έχει την διεύθυνση ενός δυναμικά δεσμευμένου(με new) αντικειμένου μιας υποκλάσης, όταν πάω να τον κάνω delete να καλείται πρώτα ο destructor της υποκλάσης, και ύστερα της υπερκλάσης. Αν δεν οριστούν σαν virtual, θα κληθεί μόνο ο destructor της υπερκλάσης!*

- Τα ορίσματα των constructors και η αρχικοποίηση των private/protected μελών, γίνεται μέσω εισόδου από τα αρχεία txt που αντιστοιχούν στην κάθε κλάση κάθε φορά.

- Κάθε κλάση που περιγράφεται παρακάτω έχει accessors/mutators για την πρόσβαση/διαχείρηση των private/protected μελών.
  • Item

    • Αναπαράσταση της έννοιας αντικείμενο. Η κλάση Item αποτελεί abstract υπερκλάση(δεν μπορούν να οριστούν αντικείμενα αυτής), εφόσον περιέχει την pure virtual μέθοδο: get_item_kind(). Την κληρονομούν οι υποκλάσεις Weapon, Armor, Potion (is-a), με κοινά χαρακτηριστικά την παραπάνω λειτουργία, την οποία και επαναορίζουν. Επίσης "επαναορίζουν" άλλες λειτουργίες οι οποίες είναι χαρακτηριστικά μόνο των υποκλάσεων, αλλά έχουν οριστεί με κενό σώμα και στην κλάση Item, για την περίπτωση που έχω δείκτη στην υπερκλάση.

    • Σαν protected μέλη-δεδομένα έχει:

      • ένα όνομα(name), μία τιμή αγοράς(cost), κάποιο ελάχιστο επίπεδο στο οποίο πρέπει να βρίσκεται ο ήρωας για να το χρησιμοποιήσει(minLevel), και μία μεταβλητή για το αν χρησιμοποιείται ή όχι κατά την διάρκεια μίας μάχης(used). (Σαν protected έχουν οριστεί τα παραπάνω, ώστε όταν βρισκόμαστε στην εμβέλεια της κάθε υποκλάσης της Item, να έχουμε προσβάση σε αυτά)
    • Η υποκλάση Weapon της Item: Είναι ένα αντικείμενο το οποίο μπορεί να χρησιμοποιηθεί από τον ήρωα για να επιτεθεί σε κάποιο τέρας και έχει σαν private μέλη ένα συγκεκριμένο ποσό ζημιάς που προκαλεί στον αντίπαλο(damage), και αν απαιτούνται 1/2 χέρια για να το χρησιμοποιήσει(handsNeeded).

    • Η υποκλάση Armor της Item: Είναι ένα αντικείμενο όταν το φοράει ένας ήρωας, μειώνει την ζημία που δέχεται από μία επίθεση του αντιπάλου του και έχει σαν private μέλη ένα αυτό το ποσό άμυνας(defence), και αν απαιτούνται 1/2 χέρια για να το χρησιμοποιήσει(handsNeeded).

    • Η υποκλάση Potion της Item: Είναι ένα αντικείμενο το οποίο όταν το χρησιμοποιεί ένας ήρωας, αυξάνει κάποιο στατιστικό του κατά κάποιο ποσό. Τα φίλτρα είναι μίας χρήσης, πράγμα που σημαίνει ότι μετά τη χρήση τους, δεν μπορούν να ξαναχρησιμοποιηθούν. Έχει σαν private μέλη το ποσοστό αύξησης κάποιου χαρακτηριστικού του(increaseTrait), το οποίο χαρακτηριστικό εξαρτάται από το μέλος (type).

  • Spell

    • Αναπαράσταση της έννοιας ξόρκι. Η κλάση Spell αποτελεί abstract υπερκλάση(δεν μπορούν να οριστούν αντικείμενα αυτής), εφόσον περιέχει την pure virtual μέθοδο: get_spell_type(). Την κληρονομούν οι υποκλάσεις IceSpell, FireSpell, LightingSpell (is-a), με κοινά χαρακτηριστικά την παραπάνω λειτουργία, την οποία και επαναορίζουν. Επίσης "επαναορίζουν" άλλες λειτουργίες οι οποίες είναι χαρακτηριστικά μόνο των υποκλάσεων, αλλά έχουν οριστεί με κενό σώμα και στην κλάση Spell, για την περίπτωση που έχω δείκτη στην υπερκλάση.

    • Σαν protected μέλη-δεδομένα έχει:

      • ένα όνομα(name), μία τιμή αγοράς(cost), κάποιο ελάχιστο επίπεδο στο οποίο πρέπει να βρίσκεται ο ήρωας για να το χρησιμοποιήσει(minLevel), ένα εύρος ζημιάς που μπορεί να προκαλέσει(damageRange) καθώς και ένα ποσό μαγικής ενέργειας που απαιτεί για να εκτελεστεί(minMagPower). (Σαν protected έχουν οριστεί τα παραπάνω, ώστε όταν βρισκόμαστε στην εμβέλεια της κάθε υποκλάσης της Spell, να έχουμε προσβάση σε αυτά)
    • Η υποκλάση IceSpell της Spell: είναι ένα ξόρκι το οποίο, εκτός από τη ζημιά που προκαλεί στην ζωή του αντιπάλου, μειώνει και το εύρος ζημιάς του για κάποιους γύρους, και έχει σαν private μέλη το ποσοστό μείωσης του εύρους ζημιάς(decrDamageRate).

    • Η υποκλάση FireSpell της Spell: είναι ένα ξόρκι το οποίο, εκτός από τη ζημιά που προκαλεί στην ζωή του αντιπάλου, μειώνει και το ποσό άμυνας του για κάποιους γύρους, και έχει σαν private μέλη το ποσοστό μείωσης της άμυνας(decrDefence).

    • Η υποκλάση LightingSpell της Spell: είναι ένα ξόρκι το οποίο, εκτός από τη ζημιά που προκαλεί στην ζωή του αντιπάλου, μειώνει και την πιθανότητα του να αποφύγει μια επίθεση για κάποιους γύρους, και έχει σαν private μέλη το ποσοστό μείωσης της πιθανότητας αποφυγής μίας επίθεσης(decrAgility).

  • Living

    • Αναπαράσταση της έννοιας ζωντανό ον. Η κλάση Living αποτελεί υπερκλάση, την οποία κληρονομούν οι υποκλάσεις Hero, Monster (is-a), με κοινά χαρακτηριστικά τα παρακάτω μέλη-δεδομένα. Η κλάση Hero αποτελεί υπερκλάση με την σειρά της, την οποία κληρονομούν οι υποκλάσεις Warrior, Sorcerer, Paladin (is-a). Η κλάση Monster αποτελεί υπερκλάση με την σειρά της, την οποία κληρονομούν οι υποκλάσεις Dragon, Exoskeleton, Spirit (is-a).

    • Σαν protected μέλη-δεδομένα έχει:

      • ένα όνομα(name), μία τιμή αγοράς(cost), κάποιο επίπεδο(level), ένα εύρος ζημιάς που μπορεί να προκαλέσει(damageRange), και ένα ποσό ζωτικής ενέργειας (healthPower). (Σαν protected έχουν οριστεί τα παραπάνω, ώστε όταν βρισκόμαστε στην εμβέλεια της κάθε υποκλάσης της Living, να έχουμε προσβάση σε αυτά)
    • Η υποκλάση Hero της Living: Είναι ένα ζωντανό ον, και έχει σαν protected μέλη ένα ποσό μαγικής ενέργειας (magicPower), κάποια τιμή δύναμης (strength), επιδεξιότητας (dexterity), ευκινησίας (agility), ένα ποσό χρημάτων (money), εμπειρίας (experience), και το πόσα χέρια χρησιμοποιεί για να κρατάει Items(hands_occupied). Επίσης έχει μία λίστα με Items και μία με Spells τα οποία αγοράζει από το Market.

    • Η υποκλάση Warrior της Hero: Είναι ένας Hero ευνοημένος στον τομέα της δύναμης και της ευκινησίας.

    • Η υποκλάση Sorcerer της Hero: Είναι ένας Hero ευνοημένος στον τομέα της επιδεξιότητας και της ευκινησίας.

    • Η υποκλάση Paladin της Hero: Είναι ένας Hero ευνοημένος στον τομέα της δύναμης και της επιδεξιότητας.

    • Οι παραπάνω Heroes κληρονομούν και τις συναρτήσεις buy/sell(αγορά/πώληση Item/Spell), checkInventory(ώστε να μπορούν να ελέγξουν τι Items/Spells διαθέτουν), equip(ώστε να χρησιμοποιήσουν διαφορετικά όπλα και να φορέσουν άλλη πανοπλία), use(ώστε να χρησιμοποιήσουν κάποιο φίλτρο).

    • Η υποκλάση Monster της Living: Είναι ένα ζωντανό ον, και έχει σαν protected μέλη, ένα εύρος ζημιάς που μπορεί να προκαλέσει(damageRate), ένα ποσό άμυνας(defence) και μια πιθανότητα αποφυγής κάποιας επίθεσης(agility).

    • Η υποκλάση Dragon της Monster: Είναι ένα Monster ευνοημένο στο εύρος ζημιάς που μπορεί να προκαλέσει.

    • Η υποκλάση Exoskeleton της Monster: Είναι ένα Monster ευνοημένο στο ποσό άμυνας που διαθέτει.

    • Η υποκλάση Spirit της Monster: Είναι ένα Monster ευνοημένο στην πιθανότητα αποφυγής κάποιας επίθεσης.

  • Location

    • Αναπαριστά την θέση της ομάδας των ηρώων στο χάρτη(πλέγμα) του rpg. Εφόσον το πλέγμα είναι ένας δισδιάστατος πίνακας, έχει σαν private μέλη δύο int, για κάθε block του grid("γραμμές"(row),"στήλες"(column)).

    • Σαν public μέλη, έχει constructor/destructor, τις μεθόδους(accessors, mutators) για την πρόσβαση/διαχείρηση/ενημέρωση των private μελών κατά την μετακίνηση της HeroesTeam σε διαφορετικό block.

    • Στον constructor με την χρήση initializer list, αρχικοποιούνται τα row & column με 0, δηλαδή η τοποθεσία της HeroesTeam στο πρώτο block του grid(αρχή του χάρτη).

  • HeroesTeam

    • Είναι σύνθετη κλάση(has-a), καθώς έχει σαν private μέλη, έναν δείκτη σε κλάση Location(location), και μία λίστα από δείκτες σε κλάση Hero(myHeroes), η οποία και ενημερώνεται με τους ήρωες που θα διαλέξει στην ομάδα του ο παίκτης.

    • Σαν public μέλη, έχει constructor/destructor, accessors για την πρόσβαση στα παραπάνω private μέλη, και μεθόδους για την εκτύπωση των μελών της HeroesTeam(printHeroes), των στατιστικών της(displayStats), και για την πρόσβαση στα μέλη της ομάδας ξεχωριστά(pickHeroFromTeam/validHeroName).

    1. Ο constructor δεσμεύει δυναμικά μνήμη(new) για την Location της ομάδας και την αρχικοποιεί καλώντας τον constructor της Location, και παίρνοντας σαν όρισμα τους ήρωες που διάλεξε ο παίκτης σε μία λίστα, τους προσθέτει στην λίστα της κλάσης HeroesTeam (myHeroes).

    2. Ο destructor, αποδεσμεύει την μνήμη(delete) της location, καθώς και όλων των Items/Spells από τις λίστες του κάθε Hero, σε περίπτωση που δεν τα έχει πουλήσει ήδη, όταν ο παίκτης κάνει quit από το παιχνίδι.

  • Database

    • Είναι σύνθετη κλάση(has-a), καθώς έχει σαν private μέλη, έναν δείκτη σε κλάση HeroesTeam(team), καθώς και τόσες λίστες όσες και οι υποκλάσεις των Hero & Monster. Κάθε λίστα έχει κόμβους που κρατάνε έναν δείκτη στην αντίστοιχη υποκλάση των Livings κάθε φορά, οι οποίες και ενημερώνονται μέσω του constructor.

    • Στο private μέρος της κλάσης έχουν οριστεί και οι συναρτήσεις insert"DERIVEDCLASS", εφόσον καλούνται μόνο στην εμβέλεια της κλάσης Database, και συγκεκριμένα από τον constructor της. Αυτό που κάνει πχ η insert"DERIVEDCLASS" είναι το εξής: Παίρνοντας σαν ορίσματα εκείνα τα protected/private μέλη της DERIVEDCLASS, δημιουργεί δυναμικά ένα αντικείμενο της DERIVEDCLASS καλώντας τον constructor της, και προσθέτει στην λίστα της Database που αντιστοιχεί στην DERIVEDCLASS, την διεύθυνση του δείκτη σε αυτό το αντικείμενο.

      • Όπου DERIVEDCLASS: {Warrior, Sorcerer, Paladin, Dragon, Exoskeleton, Spirit}
    • Σαν public μέλη, έχει constructor/destructor, accessor για την πρόσβαση στην team, μία μέθοδο για την εκτύπωση ορισμένων εφε, και την monsterGenerator(επεξήγηση παρακάτω).

    1. Ο constructor μέσω του ρεύματος ifstream, παίρνοντας σαν είσοδο τα δεδομένα των αρχείων που βρίσκονται στον txt folder(και έχουν σχέση με τα Livings), καλώντας τις insert"DERIVEDCLASS", αρχικοποιεί τις προαναφερθείσες λίστες με όλα τα πιθανά livings του κόσμου του rpg. Ύστερα ο παίκτης καλείται να διαλέξει την ομάδα του, η οποία και αρχικοποιείται με την κλήση της συνάρτησης chooseYourTeam().

    2. Ο destructor, αποδεσμεύει την μνήμη(delete) της team αρχικά, και ύστερα όλων των αντικειμένων των υποκλάσεων των Heroes/Monsters, που βρίσκονται σε κάθε λίστα της Database.

    3. *chooseYourTeam()*: Εφόσον ο παίκτης διαλέξει τους ήρωες που θέλει στην ομάδα του, οι οποίοι κάθε φορά προστίθενται σε μία λίστα, καλείται ο constructor της HeroesTeam με όρισμα την λίστα αυτή, και δημιουργείται έτσι η ομάδα των ηρώων.

    • monsterGenerator(): Καλείται από την συνάρτηση Grid::fight(), και επιστρέφει μία λίστα με Monster*, που παράχθηκαν τυχαία από όλες τις λίστες της Database, μεγέθους όσοι και οι παίκτες της HeroesTeam. Kάθε Monster έχει προστεθεί στην λίστα κατάλληλα (push_back), ώστε να βρίσκεται στην ίδια θέση με τον Hero ίδιου επιπέδου που θα πολεμήσει.
  • Market

    • Αποτελεί την αγορά του κόσμου του rpg, την οποία μπορεί να επισκεφτεί ο παίκτης σε οποιοδήποτε σημείο του Grid υπάρχει η ένδειξη(Μ). Έχει σαν private μέλη τόσες λίστες όσες και οι υποκλάσεις των Item & Spell. Κάθε λίστα έχει κόμβους που κρατάνε έναν δείκτη στην αντίστοιχη υποκλάση των Item & Spell κάθε φορά, οι οποίες και ενημερώνονται μέσω του constructor.

    • Στο private μέρος της κλάσης έχουν οριστεί και οι συναρτήσεις insert"DERIVEDCLASS", εφόσον καλούνται μόνο στην εμβέλεια της κλάσης Market, και συγκεκριμένα από τον constructor της. Αυτό που κάνει πχ η insert"DERIVEDCLASS" είναι το εξής: Παίρνοντας σαν ορίσματα εκείνα τα protected/private μέλη της DERIVEDCLASS, δημιουργεί δυναμικά ένα αντικείμενο της DERIVEDCLASS καλώντας τον constructor της, και προσθέτει στην λίστα της Market που αντιστοιχεί στην DERIVEDCLASS, την διεύθυνση του δείκτη σε αυτό το αντικείμενο.

      • Όπου DERIVEDCLASS: {Weapon, Armor, Potion, IceSpell, FireSpell, LightingSpell}
    • Σαν public μέλη έχει:

    1. Ο constructor μέσω του ρεύματος ifstream, παίρνοντας σαν είσοδο τα δεδομένα των αρχείων που βρίσκονται στον txt folder(και έχουν σχέση με τα Items & Spells), καλώντας τις insert"DERIVEDCLASS", αρχικοποιεί τις προαναφερθείσες λίστες με όλα τα πιθανά items/spells του κόσμου του rpg.

    2. Ο destructor, αποδεσμεύει την μνήμη(delete) όλων των αντικειμένων των υποκλάσεων των Items/Spells, που βρίσκονται σε κάθε λίστα της Market.

    3. visit(HeroesTeam* myTeam): Πραγματοποιούνται συναλλαγές (αγορά / πώληση). Εμφανίζονται κατάλληλα μηνύματα προκειμένου ο παίκτης να επιλέξει την συναλλαγή που θα πραγματοποιήσει καθώς και για ποιον ήρωα θα γίνει η συναλλαγή αυτή(pickHeroFromTeam()). Κατόπιν επιλέγεται το όνομα του αντικειμένου το οποίο θα πουληθεί ή αγοραστεί. Αν ο παίκτης αγοράζει τότε γίνονται έλεγχοι αν έχει αρκετά χρήματα/επίπεδο για να πάρει το προιόν. Σε κάθε περίπτωση ελέγχεται εαν έχει δωθεί σωστό όνομα και εαν ολα πάνε καλά τότε καλείται η αντίστοιχη συνάρτηση αγοράς(buy)/πώλησης(sell) της κλάσης Hero.

    4. Bοηθητικές συναρτήσεις για την visit:

      • ckeckTransaction: ελέγχει εάν υπάρχουν αρκετά χρήματα και επαρκές επίπεδο για την αγορά.
      • validItem/validSpell: ελέγχεται εαν έχει δωθεί σωστό όνομα προιόντος.
  • Grid

    • Περιγράφει τον κόσμο του παιχνιδιού στον οποίο παίζει η HeroesTeam, και αναπαρίσταται από ένα δισδιάστατο πίνακα χαρακτήρων. Κάθε block του grid είναι ένας χαρακτήρας από τους {'N', ' ', 'Μ'}, όπου 'Ν': NonAccessible, ' ': Common, 'M': Market, που υποδηλώνουν τον είδος της περιοχής την οποία επισκέπτεται ο παίκτης με την ομάδα του.

    • Είναι σύνθετη κλάση(has-a), καθώς έχει σαν private μέλη, έναν δείκτη σε κλάση Market (gameMarket, που αποτελεί την αγορά του παιχνιδιού), έναν δείκτη σε κλάση Database (livings, από όπου ο παίκτης θα διαλέξει την HeroesTeam του και θα γίνονται generate Monster για να πολεμάνε με τους ήρωες), και τον δισδιάστατο πίνακα χαρακτήρων που προαναφέρθηκε(map).

    • Σαν public μέλη-συναρτήσεις έχει:

    1. Ο constructor, αρχικά, με ορίσματα δείκτες σε αντικείμενα κλάσεων (Market & Database) αρχικοποιεί τα gameMarket & livings. Ύστερα δεσμεύει δυναμικά μνήμη για τον πίνακα map αρχικοποιώντας τα block σε NonAccessible και με μία rand() στο διάστημα [1,100], αλλάζει την τιμή του χαρακτήρα του κάθε block από NonAccessible

      • σε Market αν η πιθανότητα είναι στο διάστημα [16,45]
      • σε Common αν η πιθανότητα είναι στο διάστημα [45,100] -> το πιο πιθανό
    2. Ο destructor, αποδεσμεύει την μνήμη(delete) του map.

    3. displayMap(): Ο παίκτης μπορεί να εμφανίσει το πλέγμα, και να δει πληροφορίες για κάθε block του πλέγματος, όπως το αν βρίσκεται η HeroesTeam σε αυτό, αν είναι NonAccesible ή αν διαθέτει Market.

    4. move(): Η HeroesTeam μετακινείται στο map κατά ένα τετράγωνο προς τα πάνω, κάτω, δεξιά ή αριστερά, με την βοήθεια των συναρτήσεων (move_XX), οι οποίες ελέγχουν για το αν ο παίκτης μετακινείται εντός του grid, και σε block που είναι accessible. Αν η κίνηση του παίκτη είναι έγκυρη, ενημερώνεται η Location της HeroesTeam και καλείται η examineArea().

    5. examineArea(): Εξετάζει την περιοχή στην οποία βρίσκεται η HeroesTeam.

      • Αν βρίσκεται σε block με Market, ρωτάει τον παίκτη αν θέλει να την επισκεπτεί, και αν πάρει θετική απάντηση καλεί την Market::visit().
      • Αν βρίσκεται σε Common block, με μία πιθανότητα (50%), η HeroesTeam είτε εμπλέκεται σε μάχη με τα τέρατα(fight()), είτε περνάει σε checkPointRound().
    6. checkPointRound(): Οι ήρωες της HeroesTeam δεν μάχονται. Μπορούν να ελέγξουν τι αντικείμενα διαθέτουν(checkInventory), να χρησιμοποιήσουν διαφορετικά όπλα και να φορέσουν άλλη πανοπλία (equip) ή να χρησιμοποιήσουν κάποιο φίλτρο (use).

    7. fight(): Ανάλογα με το πλήθος των ηρώων στην ομάδα επιλέγεται και μια ομάδα τεράτων με αντίστοιχο πλήθος(monsterGenerator). Όσο η συνολική ενέργεια των ηρώων ή η συνολική ενέργεια των τεράτων δεν έχει φτάσει στο 0, εμφανίζονται με επιλογή του παίκτη τα στατιστικά των δύο ομάδων(displayTeamStats/displayMonStats) και για κάθε ήρωα ο παίκτης επιλέγει την κίνηση που θα κάνει (attack,cast,use) προς το αντίστοιχο του monster (καθε ήρωας πολεμάει σε όλους τους γύρους με ένα μόνο συνγκεκριμένο monster). Αυτο βέβαια συμβαίνει εάν το τέρας και ο ήρωας δεν είναι λιπόθυμοι γιατί εαν είναι απλά προσπερνάται αυτό το ζευγάρι και πολεμούν οι επόμενοι. Στην συνέχεια κάνουν τα τέρατα την επίθεση τους εάν το τέρας και ο ήρωας δεν είναι λιπόθυμοι και ελευθερώνονται τα χέρια του ήρωα για τον νέο γύρο. Στο τέλος καθε γύρου ανακτάται κάποια ενέργεια και στις δυο ομάδες και η μαγική ενέργεια των ηρώων. Τελικά αν έχουν κερδίσει οι ήρωες τότε αυξάνονται τα στατιστικά τους κατά κάποια ποσοστά που έχουμε επιλέξει τυχαία, και εάν αρκεί η εμπειρία τους γίνεται levelUp. Αντίστοιχα αν κερδίζουν τα τέρατα τότε γίνονται κάποιες μειώσεις με τυχαία ποσά πάλι και αποδεσμεύεται η μνήμη για την λίστα των τεράτων.

    8. HeroesHealth/MonstersHealth: Eπιστρέφουν το άθροισμα των ενεργειών όλων των ηρώων μειωμένο κατά την ζωή του τέρατος ή ήρωα που ανήκει σε ζευγάρι που ο αντίπαλος έχει λιποθυμήσει.

    9. attack: Ο παίκτης επιλέγει εάν θα κάνει equip. Στην συνέχεια προστίθενται κάποιo ποσo στο damage του ήρωα εάν κρατάει armor. Τελικά υπολογίζεται η μείωση που θα υπάρξει στην ζωή του τέρατος. Επιλέξαμε με την λογική ποιά ποσά θα εξαρτήσουν την μείωση αυτη ενώ καποια νούμερα-ποσοστά επιλέχθηκαν τυχαία.

    10. monster_attack: Υπολογίζεται η μείωση που θα υπάρξει στην ζωή του τέρατος. Επιλέξαμε με την λογική ποιά ποσά θα εξαρτήσουν την μείωση αυτη ενώ καποια νούμερα-ποσοστά επιλέχθηκαν τυχαία.

    11. castSpell: Εάν υπάρχουν ξόρκια στην κατοχή του ήρωα τοτε επιλέγεται ποιό θα χρησιμοποιήσει. Στην συνέχεια επηρεάζονται οι δυνατότητες του τέρατος που επηρεάζει κάθε ξόρκι αντίστοιχα, βάση της αποτελεσματικότητας που θα έχει κάθε ξόρκι πολ/σμένου με ένα ποσοστό που επιλέξαμε τυχαία. Τελικά υπολογίζεται η μείωση που θα υπάρξει στην ζωή του τέρατος. Επιλέξαμε με την λογική ποιά ποσά θα εξαρτήσουν την μείωση αυτη ενώ καποια νούμερα-ποσοστά επιλέχθηκαν τυχαία.

    12. play: Όσο ο χρήστης δεν δίνει σαν είσοδο το "quit" ο παίκτης συνεχίζει να παίζει και να μετακινείται στον χάρτη.

Σημαντικές σημειώσεις/Παραδοχές :

1. Άμα λιποθυμήσει ένας παίκτης, το αντίστοιχο τέρας με το οποίο πολεμούσε, σταματάει να πολεμάει, και η healthPower του αφαιρείται από την συνολική ενέργεια της ομάδας των τεράτων.

2. Ο παίκτης έχει πρόσβαση στην ομάδα του(HeroesTeam), μέσω του Database (αφού η κλάση Database έχει δείκτη στην HeroesTeam), με τη συνάρτησης get_MyTeam().

3. Στην αρχή του παιχνιδιού ο παίκτης ξεκινάει πάντα από ένα Common Block και βρίσκει στο δεξί του block, Market.

About

A command line Role-Playing game, written in C++


Languages

Language:C++ 98.2%Language:C 1.2%Language:Makefile 0.6%