From 3a22a9f47c869627ffb48a64bb9b332eba8e2587 Mon Sep 17 00:00:00 2001 From: Carlo Date: Fri, 7 Nov 2025 13:00:48 +0100 Subject: [PATCH] prima commit --- README.md | 0 TODO | 4 + main.c | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ shooter | Bin 0 -> 21448 bytes 4 files changed, 245 insertions(+) create mode 100644 README.md create mode 100644 TODO create mode 100644 main.c create mode 100755 shooter diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/TODO b/TODO new file mode 100644 index 0000000..43ab263 --- /dev/null +++ b/TODO @@ -0,0 +1,4 @@ +Da fare: + +- punteggio +1 quando uccidi, -1 se passano, se < 0 perdi, se ti colpisce perdi +- iniziare a spostare in delle funzioni la GUI diff --git a/main.c b/main.c new file mode 100644 index 0000000..e24fd47 --- /dev/null +++ b/main.c @@ -0,0 +1,241 @@ +#include +#include +#include +#include +#include +#include + +#define DELAY 30000 +#define ENEMY_N 5 +#define BULLET_N 3 +#define MIN_WIDTH 52 +#define MIN_HEIGHT 30 + +struct speed { + int slowness; + int count; +}; + +struct game_obj { + char symbol; + int x, y; + int active; + struct speed y_speed; +}; + +/************** FUNZIONI GUI ***************/ +void print_menu(WINDOW* win) { + mvwprintw(win, 1, 1, "BENVENUTO IN SPACE SHOOTER!\n"); + mvwprintw(win, 2, 1, "Premi un tasto qualsiasi per giocare..."); + refresh(); + getch(); + return; +} + +int main() { + + /************ VARIABILI **************/ + WINDOW *game_window; + int height, width, win_startx, win_starty; + char *pause_msg = "PAUSA: premi q per uscire dal gioco..."; + int pause = 0; + int max_height; + int max_width; + + // Giocatore + struct game_obj player = {}; + int input; + + // Proiettile + struct game_obj bullet[BULLET_N] = {}; + int bullet_attivi = 0; + int next_bullet = 0; + + // Nemici + struct game_obj enemy[ENEMY_N] = {}; + + /**************** INIZIALIZZAZIONE ***************/ + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + srand(time(NULL)); + + // "menu" + print_menu(stdscr); + mvprintw(3, 1, "p per pausa, q per uscire"); + refresh(); + + // Dimensioni finestra di gioco + max_height = LINES - 10; + max_width = COLS - 10; + + // Schermo troppo piccolo ? + if(max_width < MIN_WIDTH || max_height < MIN_HEIGHT) { + delwin(game_window); + curs_set(1); + endwin(); + printf("Gioco terminato.\n"); + printf("Schermo troppo piccolo \n"); + return 0; + } + + // calcolo delle misure della finestra + height = max_height; + width = MIN_WIDTH < max_width ? MIN_WIDTH - (MIN_WIDTH%4) : (max_width) - ((max_width)%4); + win_startx = (COLS - width)/2; + win_starty = (LINES - height)/2; + + // Crea la finestra di gioco + game_window = newwin(height, width, win_starty, win_startx); + nodelay(game_window, TRUE); // input non bloccante + keypad(game_window, TRUE); + box(game_window, 0, 0); + wrefresh(game_window); + + // setup giocatore + player.symbol = 'A'; + player.x = width / 2; + player.y = height - 2; + player.active = 1; + + // setup proiettili + for(int i = 0; i < BULLET_N; i++) { + bullet[i].symbol = '*'; + bullet[i].active = 0; + } + + // setup dei nemici + for(int i = 0; i < ENEMY_N; i++) { + enemy[i].symbol = 'Q'; + enemy[i].active = 0; + enemy[i].y_speed.slowness = 7; + enemy[i].y_speed.count = 0; + } + + //********************* GAME LOOP ***********************/ + while (player.active) { + // TODO if pausa all'inizio e continue + input = wgetch(game_window); + + // Gestione input + if (input == KEY_RIGHT && !pause && player.x < width - 2) { + player.x += 2; + } else if (input == KEY_LEFT && !pause && player.x > 2) { + player.x -= 2; + } else if (input == ' ' && bullet_attivi < BULLET_N && !pause) { + bullet[next_bullet].x = player.x; + bullet[next_bullet].y = player.y - 1; + bullet[next_bullet].active = 1; + } else if (input == 'p') { + pause = !pause; + } else if (input == 'q') { + player.active = 0; + } + + // Aggiorna proiettile + for(int i = 0; i< BULLET_N; i++) { + if (bullet[i].active && !pause) { + bullet[i].y--; + } + if (bullet[i].y < 1) { + bullet[i].active = 0; + } + } + + // Collisioni 1 + for(int j = 0; j < BULLET_N; j++) { + if(bullet[j].active && !pause) { + for(int i = 0; i < ENEMY_N; i++) { + if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) { + enemy[i].active = 0; + bullet[j].active = 0; + // TODO aggiorna punteggio + } + } + } + } + + // Spawna nemici + for(int i = 0; !pause && i < ENEMY_N; i++) { + if(!enemy[i].active && !pause) { + enemy[i].y = 2; + enemy[i].x = (rand()%((width-4)/2))*2 + 2; + enemy[i].active = 1; + break; + } + } + + // Aggiorna posizione nemici + for(int i = 0; !pause && i < ENEMY_N; i++) { + if(enemy[i].active && !pause) { + enemy[i].y_speed.count++; + if(enemy[i].y_speed.count > enemy[i].y_speed.slowness) { + enemy[i].y++; + enemy[i].y_speed.count = 0; + } + if(enemy[i].y > height - 2) { + enemy[i].active = 0; + // TODO aggiorna punteggio + } + } + } + + // Collisioni 2 + for(int j = 0; j < BULLET_N; j++) { + if(bullet[j].active && !pause) { + for(int i = 0; i < ENEMY_N; i++) { + if(bullet[j].x == enemy[i].x && bullet[j].y == enemy[i].y) { + enemy[i].active = 0; + bullet[j].active = 0; + // TODO aggiorna punteggio + } + } + } + } + + // Conteggio proiettili + bullet_attivi = 0; + next_bullet = -1; + for (int i = 0; i < BULLET_N; i++) { + if (bullet[i].active) { + bullet_attivi++; + } else if (i < next_bullet || next_bullet == -1) { + next_bullet = i; + } + } + + // Disegna scena + werase(game_window); + box(game_window, 0, 0); + + if (pause) { + wattron(game_window, A_REVERSE); + mvwprintw(game_window, height/2, (width - strlen(pause_msg)) / 2, "%s", pause_msg); + wattroff(game_window, A_REVERSE); + } else { + // Giocatore + mvwprintw(game_window, player.y, player.x, "%c", player.symbol); + + // Proiettile + for(int i = 0; i < BULLET_N; i++) { + if (bullet[i].active) mvwprintw(game_window, bullet[i].y, bullet[i].x, "%c", bullet[i].symbol); + } + // Nemici + for(int i = 0; i < ENEMY_N; i++) { + if (enemy[i].active) mvwprintw(game_window, enemy[i].y, enemy[i].x, "%c", enemy[i].symbol); + } + } + + wrefresh(game_window); + usleep(DELAY); + } + + /***************** CHIUSURA *****************/ + delwin(game_window); + curs_set(1); + endwin(); + printf("Gioco terminato.\n"); + return 0; +} \ No newline at end of file diff --git a/shooter b/shooter new file mode 100755 index 0000000000000000000000000000000000000000..fb8c04d90772d2deb0185f21a1b81dc624a9cd84 GIT binary patch literal 21448 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

G? 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 P|K{g)iTNf46D$53sVEp2 literal 0 HcmV?d00001