Skip to content

A CMD based game with equipment , enemies , rounds and map navigating , all using basic C++

Notifications You must be signed in to change notification settings

Svegiary/D-D-Style-Command-Promp-Game

Repository files navigation

 ΕΡΓΑΣΙΑ 
Χαράλαμπος Τσιτσιρίγγος 
sdi1900198
ΓΕΝΙΚΑ
Στο παιχνίδι αυτό ο χρήστης καλείται να δημιουργήσει απο 1-3 ήρωες . Εκείνος επιλέγει τον τύπο του ήρωα , το επίπεδό του καθώς και το όνομά του. Έπειτα δημιουργείται ο χάρτης και τοποθετούνται οι ήρωες στο κουτί 0,0. Στα δεξιά τους (κουτι 1,0) υπάρχει ένα marketplace όπου οι παίκτες μπορούν να αγοράσουν αντικείμενα. Άμα σε κάποιο common block τύχει να βρουν τέρατα (το πώς γίνεται αυτό εξηγείται αργότερα) , πρέπει να πολεμήσουν. Με σειρά ο κάθε παίκτης μπορεί να κάνει κάποιες ενέργειες . Όταν όλοι οι παίκτες παίξουν, τα τέρατα επιτίθενται τυχαία στους παίκτες . Αν κερδίσουν οι ήρωες τελειώνει το παιχνίδι , ενώ αν κερδίσουν τα τέρατα , οι παίκτες μεταφέρονται στην αρχή του χάρτη και χάνουν τα μισά τους λεφτά.
Κατανόηση του χάρτη: 
    1) Το 1 2 3 είναι οι παίκτες 
    2) Το Μ είναι η αγορά
    3) Τα Χ είναι non accessible blocks
    4) Τα + είναι απλά common blocks


ΟΡΓΆΝΩΣΗ ΣΕ ΚΛΑΣΕΙΣ 
       1) Items 
Η κλάση Item είναι η υπερκλάση για όλα τα αντικείμενα των ηρώων. Έχει τις protected μεταβλητές name_Item , price , και level_exp. Οι συναρτήσεις της επεξηγούνται με σχόλια στον κώδικα. 
Η κλάση weapons έχει 2 private μεταβλητές , την damage και την hand use , ενω επεκτείνει την κλάση item. Υπάρχει μια στατική συνάρτηση create(int amount) που δημιουργεί amount αντικείμενα και είναι στατική καθώς δεν χρειάζεται να υπάρχει για κάθε weapon ξεχωριστά.  Η συνάρτηση αυτή ανοίγει ενα αρχείο με ονόματα weapon (“weapon.txt”) και ονομάζει τα διάφορα όπλα.
 Η κλάση armor με τη σειρά της επεκτείνει την κλάση item και έχει παρόμοια δομή με την κλάση weapon.
 Η κλάση Potion επεκτείνει και αυτή την κλάση item , αλλά και η ίδια είναι υπερκλάση άλλων κλάσεων : DexterityPotion, AgilityPotion και StrengthPotion. Οι παραπάνω κλάσεις έχουν και αυτές μια στατική συνάρτηση create που έχει την ίδια λειτουργία με αυτή του weapon. Η συνάρτηση τους equip αυξάνει την ιδιότητα του hero που αντιστοιχεί σε κάθε potion.
2) Spells 
Η υπερκλάση Spell έχει μερικές protected μεταβλητές (εξηγούνται με σχόλια στον κώδικα). Έχει επίσης μια doubleRand(double fMin , double fMax) η οποία επιστρέφει τυχαίο double ανάμεσα σε fMin και fMax . Είναι στατική , καθώς δεν χρειάζεται να υπάρχει για κάθε spell . Οι συναρτήσεις τις Spell αναλύονται στα σχόλια του κώδικα.  Οι sub-classes της Spell Ice_Spell , Fire_Spell και Lightning_Spell , έχουν και αυτές στατικές συναρτήσεις create όπως και η weapon. Οι υπόλοιπες συναρτήσεις αναλύονται με σχόλια στον κώδικα. 
3) Inventory
Η κλάση inventory χρησιμοποιείται απο τις κλάσεις market και hero όπως θα δούμε παρακάτω. Η χρήση της είναι να παρέχει ένα interface για την αποθήκευση και χρήση item και spells καθώς και άλλες λειτουργίες. Έχει ως private μέλη vectors pointer σε item και spell . Οι συναρτήσεις αναλύονται στα σχόλια του κώδικα. 
4) Market
Η κλάση Market έχει ως private μέλος έναν δείκτη σε inventory . Μπορεί να θεωρηθεί ως ένας μεσάζοντας για την χρήση του interface. 
5) Living
Είναι η υπερκλάση των ηρώων και των τεράτων. Έχει ως protected μεταβλητές όσες είναι κοινές μεταξύ των ηρώων και τεράτων, όπως healtPower , όνομα και άλλες. Περιέχει πολλές συναρτήσεις virtual οι οποίες χρησιμοποιούνται απο τις κλάσεις hero και monster. 
6) Monster
Επεκτείνει την κλάση Living . Έχει ως protected μεταβλητές την damage_range dmg (δηλαδή το διάστημα στο οποίο βρίσκεται η τιμή ζημιάς που μπορεί να προκαλέσει σε έναν ήρωα) , μια ακέραια μεταβλητή dodge η οποία χρησιμοποιείται αργότερα για να υπολογιστεί εάν το τέρας απέφυγε την επίθεση του ήρωα και μια δεκαδική μεταβλητή double defense η οποία χρησιμποιείται για να μειώνει τη ζημιά που δέχεται από τον ήρωα. Η ζημία που προκαλεί το τέρας υπολογίζεται απο την συνάρτηση int Damage() η οποία επιστρέφει την τιμή αυτή. Η συνάρτηση bool dodged() επιστρέφει εάν απέφυγε την επίθεση του ήρωα ή όχι. Η συνάρτηση int attack(Living *l) χρησιμοποιείται για να επιτεθεί το τέρας σε κάποιον ήρωα l . Επιστρέφει -1 άν η επίθεση δεν ηταν επιτυχής , 1 έαν πέθανε ο ήρωας και 0 αν απλά τον πέτυχε. Η Monster έχει υποκλάσεις , οι οποίες αντιστοιχούν στους τύπους τεράτων
7) Hero
Έχει μεταβλητές protected τα πολλά χαρακτηριστκά των ηρώων , τις συντεταγμένες του , καθώς και έναν δείκτη σε inventory. Η ζημιά που προκαλεί υπολογίζεται από την συνάρτηση damage η οποία προσθέτει την δύναμη του ήρωα στην ζημιά που προκαλεί το όπλο του. Η συνάρτηση Spell *equipSpell(int k) επιστρέφει pointer στο κ-ωστό spell στο invetory του ήρωα . Η συνάρτηση int spellDamage(int k , Monster *m) υπολογίζει την ζωή που πρέπει να αφαιρεθεί από το τέρας και επηρεάζει το τέρας ανάλογα το ξόρκι. Με την συνάρτηση castSpell(Living *, int k) ο ήρωας επιτίθενται σε τέρας με ξόρκι και καλεί τη συνάρτηση is hurt_by_spell , του τέρατος , η οποία με τη σειρά της καλεί την παραπάνω spellDamage. Επίσης προσφέρονται οι δυνατότητες αγοράς και πώλησης αντικειμένων , καθώς και η ικανότητα του να μετακινείται στον χάρτη. 
8) Υποκλάσεις
Οι υποκλάσεις των monster και hero δεν είναι περίπλοκες. Κατά την δημιουργία ενός warrior για παράδειγμα καλείται constructor του Hero και αυξάνονται τα στατιστικά του ανάλογα , ενώ ταυτόχρονα ανεβαίνει στο επιθμητό level . Επίσης σε κάθε level up ο συντελεστής αύξησης ορισμένων χαρακτηριστικών του είναι μεγαλύτερος σε κάθε τύπο hero . Tο ίδιο ισχύει και για τις αντίστοιχες κλάσεις του monster. 
9) block και Grid
Τα blocks είναι τα θεμέλια του χάρτη , ο οποίος είναι 2d-array pointer σε block. Τα blocks χωρίζονται σε common block , market block και non accessible block , όλα subclass της κλάσης block. Το common block έχει έναν vector pointer σε heros και μια μεταβλητή τύπου percent , που είναι η πιθανότητα να συναντήσουν οι  ήρωες τέρατα. Το market block έχει και αυτό τον παραπάνω vector αλλά ως δεύτερη μεταβλητή έχει έναν δείκτη σε market. 

Η κλάση Grid δημιουργεί στην ουσία το παιχνίδι. Ας αρχίσουμε απο τις public συναρτήσεις . Η createGrid(vector<Hero*>) δημιουργεί τυχαία blocks με ξεχωριστή πιθανότητα το καθένα. Η int play(vector<Hero*>) δίνει επιτυγχάνει επαφή με τον παίκτη παρέχοντας κάθε φορά τις πιθανές ενέργειες. Αν η play επιστρέψει -2 , τότε ολοκληρώνεται το παιχνίδι (υπάρχει while loop στην main που το ελέγχει αυτό). Οι συναρτήσεις move_(direction)(vector <Hero *>) επιστρέφουν : 
Αν μετακινούνται σε common block ( μέσω της συνάρτησης block entry (*))  : 
	1) αν συναντήσουν τέρατα :
		α)  -1 αν πεθάνουν οι ήρωες 
		β)  1 αν πεθάνουν τα τέρατα 
	2) αν δεν συναντήσουν τέρατα :
		επιστρέφουν 4 
Αν μετακινούνται σε market block (μέσω της block entry) :
	επιστρέφουν 2 ,  όταν τελειώσει ο χρήστης την χρήση του marketplace , μέσω της συνάρτησης marketplace( vector<Hero*> h , Market *) (**).
Αν μετακινούνται σε non accessible ή εκτός χάρτη επιστρέφουν -3.
(*) Η συνάρτηση int block_entry(coordinates p1) αναγνωρίζει τον τύπο του block (market / common) και αν είναι common και συναντήσουν τέρατα επιστρέφει την τιμή της συνάρτησης int battle(vector<Heros*>)(***) (τα -1,1) που αναφέρθηκαν πιο πάνω. Η block entry αναγνωρίζει τα blocks καθώς όταν καλείται η συνάρτηση virtual int entry() του block των συντεταγμένων p1 , το market block επιστρέφει 2 ενώ το common block 1.
(**) Η συνάρτηση int marketplace(vector<Heros*> h , Market*) παρέχει πιθανές ενέργειες στον παίκτη για την χρήση του market σε ένα market block. 
(***) Η int battle(vector<Heros*>) αρχικά δημιουργεί τέρατα για κάθε έναν από τους ήρωες , ίδιο level με τους αντίστοιχους ήρωες , κάτι που γίνεται με την κλάση MonsterCreation που θα αναλύσουμε αργότερα. Δίνεται η δυνατότητα στον κάθε παίκτη με τη σειρά του να επιτεθεί σε οποιοδήποτε τέρας θελει κάτι που αναφέρεται και στις γενικές σημειώσεις στην αρχή του εγγράφου. 

Οι ήρωες και τα τέρατα δημιουργούνται μέσω των κλάσεων MonsterCreation και HeroCreation. Οι δείκτες σε ήρωες ανήκουν στην HeroCreation οπότε εκείνη διαχειρίζεται τα delete αυτών. Η διαδικασία εξηγείται αναλυτικά στα σχόλια του κώδικα. 		
COMPILATION
              Στον φάκελο περιέχονται τα πηγαία αρχεία , τα αρχεία επικεφαλίδας καθώς και τα αρχεία που χρειάζονται για την ονομασία των αντικειμένων . Για να γίνει το compile: 
       g++  *.cpp
Για την εκτέλεση του προγράμματος : ./a.out

About

A CMD based game with equipment , enemies , rounds and map navigating , all using basic C++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages