diff --git a/main.cpp b/main.cpp index 03b92ff..d2595fe 100644 --- a/main.cpp +++ b/main.cpp @@ -27,31 +27,170 @@ using namespace std; //Mappa del gioco unsigned char map[X_MAX][Y_MAX]; -//Tutta sta roba non si potrebbe mettere in una classe giocatore o qualcosa del genere? //Numero del piano raggiunto dal giocatore int depth = 1; -//Salute del giocatore -int hp = HP_MAX; +//Devo mettere due volte draw perchè ha bisogno della classe Player, a cui però serve la funzione draw. Idem per l'inventario... +void draw(); +void inventory(); -//Inventario del giocatore -int pozioni_vita_piccole = 3; -int pozioni_vita_medie = 2; -int pozioni_vita_grandi = 1; - -//Classe dei nemici -class Enemy +//Classe entità generica, sia nemico sia giocatore +class Entity { public: int x; int y; - void move() + int hp = HP_MAX; + int hp_max = HP_MAX; + int move(); + //Cura di x l'entità + void heal(int x) + { + if(hp + x > hp_max) + { + hp = hp_max; + } + else + { + hp += x; + } + } + //Danneggia di x l'entità + void damage(int x) + { + if(hp - x < 0) + { + //entità zombi + hp = 0; + } + else + { + hp -= x; + } + } +}; + +//Classe del giocatore +class Player : public Entity +{ + public: + int pozioni_vita_piccole = 3; + int pozioni_vita_medie = 2; + int pozioni_vita_grandi = 1; + int move() + { + bool waiting = true; + unsigned char* starting = &map[x][y]; //Casella attuale + unsigned char* target; //Bersaglio del movimento + //Rileva i tasti freccia + while(waiting) + { + unsigned char input = getch(); + short int dir = 0; //Direzione del movimento, per modificare x e y. + if(input == 224) + { + switch(getch()) + { + case 72: //Freccia su, 1 + target = &map[x][y-1]; + dir = 1; + break; + case 80: //Freccia giù, 2 + target = &map[x][y+1]; + dir = 2; + break; + case 75: //Freccia sinistra, 3 + target = &map[x-1][y]; + dir = 3; + break; + case 77: //Freccia destra, 4 + target = &map[x+1][y]; + dir = 4; + break; + //Aggiungere gestione del caso che non sia una delle quattro frecce + } + //Muoviti e agisci! + if(*target == EMPTY) + { + *starting = EMPTY; + *target = PLAYER; + waiting = false; + } + else if(*target == ITEM_SMALL_POTION) + { + *starting = EMPTY; + *target = PLAYER; + pozioni_vita_piccole++; + waiting = false; + } + else if(*target == ITEM_MEDIUM_POTION) + { + *starting = EMPTY; + *target = PLAYER; + pozioni_vita_medie++; + waiting = false; + } + else if(*target == ITEM_BIG_POTION) + { + *starting = EMPTY; + *target = PLAYER; + pozioni_vita_grandi++; + waiting = false; + } + else if(*target == EXIT) + { + return 1; + } + } + else if(input == 's') //S + { + //Salta un turno + waiting = false; + } + else if(input == 'i') //I + { + //Apri l'inventario + inventory(); + //Torna alla mappa + draw(); + } + //Se ti sei mosso, controlla in che direzione e aggiorna correttamente la x e la y. + //Non mi veniva in mente un modo per farlo meglio. + if(!waiting) + { + if(dir == 1) + { + y--; + } + else if(dir == 2) + { + y++; + } + else if(dir == 3) + { + x--; + } + else if(dir == 4) + { + x++; + } + } + } + return 0; + } +} player; + +//Classe dei nemici +class Enemy : public Entity +{ + public: + int move() { //Se intorno c'è il giocatore if(map[x-1][y] == PLAYER || map[x+1][y] == PLAYER || map[x][y-1] == PLAYER || map[x][y+1] == PLAYER) { //Forse sarebbe meglio fare una funzione per togliere vita che controlla anche se va a 0... - hp--; + player.damage(rand() % 5 + 1); } else { @@ -104,48 +243,50 @@ class Enemy } }; -//Cura il giocatore di x -void heal(int x) +//Aggiorna la console con la situazione corrente del gioco. +void draw() { - if(hp + x > HP_MAX) + //Svuota lo schermo della console. Sono sicuro che ci sia un modo molto migliore per farlo, ma non mi viene in mente... + system("cls"); + for(int y=0; y 0) + if(player.pozioni_vita_piccole > 0) { - cout << pozioni_vita_piccole << "x Pozione di Vita (p)iccola\tRipristina 10 Vita\n"; + cout << player.pozioni_vita_piccole << "x Pozione di Vita (p)iccola\tRipristina 10 Vita\n"; } else { cout << '\n'; } - if(pozioni_vita_medie > 0) + if(player.pozioni_vita_medie > 0) { - cout << pozioni_vita_medie << "x Pozione di Vita (n)ormale\tRipristina 20 Vita\n"; + cout << player.pozioni_vita_medie << "x Pozione di Vita (n)ormale\tRipristina 20 Vita\n"; } else { cout << '\n'; } - if(pozioni_vita_grandi > 0) + if(player.pozioni_vita_grandi > 0) { - cout << pozioni_vita_grandi << "x Pozione di Vita (m)aggiore\tRipristina 50 Vita\n"; + cout << player.pozioni_vita_grandi << "x Pozione di Vita (m)aggiore\tRipristina 50 Vita\n"; } else { @@ -159,231 +300,34 @@ void inventory() unsigned char selezione = getch(); if(selezione == 112) //p { - if(pozioni_vita_piccole > 0) + if(player.pozioni_vita_piccole > 0) { - pozioni_vita_piccole--; - heal(10); + player.pozioni_vita_piccole--; + player.heal(10); break; } } else if(selezione == 110) //n { - if(pozioni_vita_medie > 0) + if(player.pozioni_vita_medie > 0) { - pozioni_vita_medie--; - heal(20); + player.pozioni_vita_medie--; + player.heal(20); break; } } else if(selezione == 109) //m { - if(pozioni_vita_grandi > 0) + if(player.pozioni_vita_grandi > 0) { - pozioni_vita_grandi--; - heal(50); + player.pozioni_vita_grandi--; + player.heal(50); break; } } } } -//Aggiorna la console con la situazione corrente del gioco. -void draw() -{ - //Svuota lo schermo della console. Sono sicuro che ci sia un modo molto migliore per farlo, ma non mi viene in mente... - system("cls"); - for(int y=0; y