Aggiunta struttura status e sistemato alcuni conteggi

This commit is contained in:
Carlo 2025-11-08 12:18:32 +01:00
parent d985458100
commit 62f904d39a

54
main.c
View file

@ -5,6 +5,7 @@
#include <ncurses.h> #include <ncurses.h>
#include <time.h> #include <time.h>
/************* STATIC DEFINITIONS ************/
#define DELAY 30000 #define DELAY 30000
#define ENEMY_N 5 #define ENEMY_N 5
#define BULLET_N 3 #define BULLET_N 3
@ -12,7 +13,10 @@
#define HEIGHT 30 #define HEIGHT 30
#define MIN_COLS 110 #define MIN_COLS 110
#define LIVES_N 5 #define LIVES_N 5
#define TEXTLINES 4
#define BORDERLINES 2
/************* GAME STRUCTURES **************/
struct speed { struct speed {
int slowness; int slowness;
int count; int count;
@ -25,8 +29,15 @@ struct game_obj {
struct speed y_speed; struct speed y_speed;
}; };
struct status {
int lives;
int score;
int top_score;
int remaining_bullets;
};
/************** FUNZIONI GUI ***************/ /************** FUNZIONI GUI ***************/
#define TITLE_LINES 6
char* title[] = char* title[] =
{ {
"###########################################################################################################", "###########################################################################################################",
@ -39,7 +50,7 @@ char* title[] =
char menu_desc[] = "BENVENUTO. Premi qualsiasi tasto per giocare..."; char menu_desc[] = "BENVENUTO. Premi qualsiasi tasto per giocare...";
#define GAMEOVER_LINES 4
char* gameover[] = char* gameover[] =
{ {
"o8888o o8888o o8oo8o o8888o o8888o 88 8o o8888o o8888o", "o8888o o8888o o8oo8o o8888o o8888o 88 8o o8888o o8888o",
@ -54,11 +65,11 @@ void print_menu(WINDOW* win) {
int height; int height;
int width; int width;
getmaxyx(win, height, width); getmaxyx(win, height, width);
for(int i = 0; i < TITLE_LINES; i++) { for(int i = 0; i < (TEXTLINES+BORDERLINES); i++) {
mvwprintw(win, i+1, (width-(strlen(title[0])))/2, "%s", title[i]); mvwprintw(win, i+1, (width-(strlen(title[0])))/2, "%s", title[i]);
} }
wattron(win, A_BLINK); wattron(win, A_BLINK);
mvwprintw(win, TITLE_LINES+1, (width-(strlen(menu_desc)))/2, "%s", menu_desc); mvwprintw(win, (TEXTLINES+BORDERLINES)+1, (width-(strlen(menu_desc)))/2, "%s", menu_desc);
wattroff(win, A_BLINK); wattroff(win, A_BLINK);
refresh(); refresh();
return; return;
@ -70,30 +81,30 @@ void print_gameover(WINDOW* win) {
int ch; int ch;
wclear(win); wclear(win);
getmaxyx(win, height, width); getmaxyx(win, height, width);
for(int i = 0; i < GAMEOVER_LINES; i++) { for(int i = 0; i < TEXTLINES; i++) {
mvwprintw(win, i+1, (width-(strlen(gameover[0])))/2, "%s", gameover[i]); mvwprintw(win, i+1, (width-(strlen(gameover[0])))/2, "%s", gameover[i]);
} }
wattron(win, A_BLINK); wattron(win, A_BLINK);
mvwprintw(win, GAMEOVER_LINES+1, (width-(strlen(gameover_desc)))/2, "%s", gameover_desc); mvwprintw(win, TEXTLINES+1, (width-(strlen(gameover_desc)))/2, "%s", gameover_desc);
wattroff(win, A_BLINK); wattroff(win, A_BLINK);
refresh(); refresh();
while((ch = wgetch(win)) != 'q'); while((ch = wgetch(win)) != 'q');
return; return;
} }
void print_status_bar(WINDOW* main_win, int y, int x, int lives, int score, int top_score, int shots) { void print_status_bar(WINDOW* main_win, int y, int x, struct status game_status) {
int status_x = x + 1; int status_x = x + 1;
int status_y = y; int status_y = y;
status_x++; status_x++;
// lives // lives
mvwprintw(main_win, status_y, status_x, "LIVES:\t%d", lives); mvwprintw(main_win, status_y, status_x, "LIVES:\t%d", game_status.lives);
// score // score
mvwprintw(main_win, status_y+1, status_x, "SCORE:\t%d", score); mvwprintw(main_win, status_y+1, status_x, "SCORE:\t%d", game_status.score);
// top score // top score
mvwprintw(main_win, status_y+2, status_x, "TOP SCORE:\t%d", top_score); mvwprintw(main_win, status_y+2, status_x, "TOP SCORE:\t%d", game_status.top_score);
// bullets // bullets
mvwprintw(main_win, status_y+3, status_x, "BULLETS:\t%d", shots); mvwprintw(main_win, status_y+3, status_x, "BULLETS:\t%d", game_status.remaining_bullets);
// refresh window // refresh window
wrefresh(main_win); wrefresh(main_win);
@ -112,9 +123,13 @@ int main() {
// Giocatore // Giocatore
struct game_obj player = {}; struct game_obj player = {};
int input; int input;
int top_score = 0;
int score = 0; // Status
int lives = LIVES_N; struct status game_status = {};
game_status.top_score = 0;
game_status.score = 0;
game_status.lives = LIVES_N;
game_status.remaining_bullets = BULLET_N;
// Proiettile // Proiettile
struct game_obj bullet[BULLET_N] = {}; struct game_obj bullet[BULLET_N] = {};
@ -228,7 +243,7 @@ int main() {
if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) { if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) {
enemy[i].active = 0; enemy[i].active = 0;
bullet[j].active = 0; bullet[j].active = 0;
score++; game_status.score++;
} }
} }
} }
@ -254,8 +269,8 @@ int main() {
} }
if(enemy[i].y > height - 2) { if(enemy[i].y > height - 2) {
enemy[i].active = 0; enemy[i].active = 0;
lives--; game_status.lives--;
if(lives == 0) { if(game_status.lives == 0) {
player.active = 0; player.active = 0;
print_gameover(stdscr); print_gameover(stdscr);
} }
@ -270,7 +285,7 @@ int main() {
if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) { if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) {
enemy[i].active = 0; enemy[i].active = 0;
bullet[j].active = 0; bullet[j].active = 0;
score++; game_status.score++;
} }
} }
} }
@ -286,6 +301,7 @@ int main() {
next_bullet = i; next_bullet = i;
} }
} }
game_status.remaining_bullets = BULLET_N - bullet_attivi;
// Disegna scena // Disegna scena
werase(game_window); werase(game_window);
@ -310,7 +326,7 @@ int main() {
} }
// Status Bar // Status Bar
print_status_bar(stdscr, win_starty, (win_startx + width), lives, score, top_score, (BULLET_N - bullet_attivi)); print_status_bar(stdscr, win_starty, (win_startx + width), game_status);
} }