From a374c0edee4342cb1301edaea893c2b99067f882 Mon Sep 17 00:00:00 2001 From: Carlo Date: Mon, 10 Nov 2025 09:40:02 +0100 Subject: [PATCH] Continuato il refactor, spostate funzioni gui --- README.md | 3 ++ build/shooter | Bin 22368 -> 22432 bytes data/savelog | 0 include/gui.h | 24 ++++++++++ src/gui.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 125 +------------------------------------------------- 6 files changed, 149 insertions(+), 123 deletions(-) create mode 100644 data/savelog create mode 100644 include/gui.h create mode 100644 src/gui.c diff --git a/README.md b/README.md index e69de29..561ad00 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,3 @@ +Per compilare: +cd space-shooter/ +gcc -o /build/shooter src/main.c src/gui.c -lncurses \ No newline at end of file diff --git a/build/shooter b/build/shooter index cab1f4c0a5ed53e99cc36460204d229d3bace9cf..159b823844d6d7c95ac3622a5ea16ca33a0ffbce 100755 GIT binary patch delta 3378 zcmZuzeNbH06@T|F3%db?4J>az0&GkOUx`^FY(Cpc;=*H0Oi(Z?C;>7Ph#wIl4l}i4 zhR|`lp(UJHqxr+onRe0?sEe*=Rl;&b8Bl0+LV6rCbwA;Z<=s ze(z^Dp6@obe`$VUa!qmNnY^wmdEUSYLwp1|2W=~)23r=V|92lBO`7*h8XgS6gBmUr zF6UQm()1AgoSWmW5PXR9VRNLVz;!q0xI;Kq8onh2Kd<5Ugy2Cq87XDCvw5_AA=WAl ze>em`8~8l(PLtS9U?FZ0w%ffi(+)w9eSdwA#!)_BfM3~do`I#9Yj}3$M}l80I`l#atO9Kdh_p_S5;+{iq$A& zzw!NTf^d;w3Y7X3VqGks#yNfVDq?7Q76+c{nOH%9HfKV^bLg7c)c*t8d%7o*N&i65 z*EEQ#-&n>>pDZ^GG1EP0Y79R0LZsigl}!^HHh0kklpkg>tw(5D%|?rzXEci#s&Se+ zi7Lxtd?MyiWcZB}TRE{BvqJTXrv8We`Hi1w>Tw?CD;p*EuzJ~=yrN%Yu}FShBd5+m z%c?|Co`ttp*%P8!q$UNEU+j~44z8`*WVKRLDJ=-SPfzO2y;SBGF(Vqf3@8+35yK;vEp&xZ zaBvY6DUk~0Pm37!>!J~qcEnoXO(`+sHB8Niuan<9M0@^IrcP0nCn2B{HHedNht=tP z857^_Un}~(Q*5)0#}T0R-4k%H)fK1vh9CxB5>+rUuL?x9P|ZefDi3ve z9I_qY_|DYRVk|58}F6)T`nvS!yK^VW8)WKoSDXr8-})S_4N?ieK56QNUz^PC#v&a{qm zIA2n)kEu)R#q&UUu?nr%fRUHgd!1&5=10d^y(R2GFMX??8-v5Pqz&P>&G#8xZL!`@ z*YZ$TMp?ZVsM>73W}@}(o*BJey}x9I7&mK4bRlW6-c6|Zyi<)oo2ofF*+M^7CAp=K z_2L-`>{#D!Xmy*wlkJA8>?e%1LQ16o7Iy`>+~z>7yVp=62*hdFPXFq02L<^G2F5Y% zDt}M6;MkA4X;@Y3ar_oX1;c%nVJ5}9>W6g}J*5P>LhN_;1^qf@k z5)|f0DHXPpD@h~Y0Sbp?3Lxz46(QiD9H=HaChmU@PIp>BB zF=4BAK@s%JiGCT;FCRhu(xP1}^y|ghz$3Z)33&@Tc1m!5r_KBh#wJ3%a0&)?rrLX$ zCJC2z(=~5CAA@C=WWR<05p2TH{WmRiHUlI~A~wiEnZx7*Odf$Y^cuu(oJ+6^!oKBR ze#SY^WH*z;OwLnjx8v6}7QGH=_aWWa1?Bfj_JbJHf>!;G<lT`5|GqV>8L zA1kPp9A%tV%E1*1(z%W86i(Y1=MPN&lgaOyv_pqiBHQ7ZSF%5jt5e_08Owc-FitCz z9aP$TwLC|(+TGki=mSfhWdA!_X^o+sISsjal5rTVF5K)mG7U9(5}9Lh9ngmJbQnOn zjY|7|{HD@u#_;1wA9gP3$T&?*{uZ+GCHr5H87nx1`jDOuL3zGZ@UdnM?f7R}{5PyD zyujWcoPL2g-2+!hZKKegFYPhmm(L>Jx_|MA(`@_Vd9;7?K}gZ?TCIvY4bMWHci}!* zElb8K)bC_nX@o*qB0h?e3#{9}M;p!PfR@o}Ek-AF$R8RG9jy-37Sx4Vs-Lc|E2}*6 zgf&3!ze)lldq)hU2D%^IXx0x;5q$q(KKTda7X5^j!m*-_mMu9v pu09?JbQh^4x+;Rhi8#c;<%crOL75{T0olLV+@rlU4mehr{C})`GnxPZ delta 3294 zcmZuz4^ULc8Q*<(5AFg6j=SS=5Kd5(1A-nZ2PQZM@WP{m7F$p&m-qt-g=&ry6W@wRK;d;P!>9X%)5B369jkE7E0$ z|4L!&YgubkUc5DYWVr6T&WqpiPlY>7j(BQ;GxT?tB2ry;G4kq#Jm zLkv#BV+qSFQfeIBwU59@`S$#tySg6mYiiIxss{SCS2%l}v1eG|v&2LQ6J&h>_j@wF z8GewEnqZC;^j}x^jH*HT=Lj(QQ)sB>^{Iiss(~SOSPS$A{Z~UxlzG}57*|8iKe(CZ za9|eIdzf$S@Lf3SaTlh3fu>&uBo^+l6&)H;Lh_ymM3jHe!-Pk%Rxmc?+~NkB=gc*; z&|k5CjiYjvk>7{&upuuu(>E`4S<2tQdBA^_nKHIu9uDOx(&>3{7i46#V+c{GCJH@Z zq%c1RLwQ*{cVxy^lZNiv{NuFkxpC9;N1_rki`;)@ggztsYLuCRXb}64%?!!K>xJrb zbG%FkV?)mI`(S^*bKTLouPf8by~<;T-|5*eYknW+Q8l07EMI*i zEm>r+YL0gy8{IDILb4I(;4JHcV=RNIN3ZEmX5obbcVW)gCi^0WTPSv_M1-1|;l&Oy zHsox~;KimGIWKP3Nsh|(rNZ*kOjNP8GgxdU3_JY3)9G9;Hraku3T_?=`sZ;s2J5G> zIa+yOKn*Q960N4rK#eo4;$SqE%}qbyrlv)vJEPTRr+I%hwuwHShF>~!X(4>z>}#3$ zpRQ{^M5*=;&hW6*`tU?iTz{r&LP0M-2QHL~*=od4WMMXcM)VBdE6k#o4cbN&2n^SW z^y1khTEPOw^>DWlO<~wZoRPB<4!vyP0fjNM>t!Ca8yKX&{UV+~Je{P!eF$gka2Aw* zQw%p#UDDBFNKjlY&lD5VHvRPT2|>AuPcvIeL`ubXFxO62Ur0WfCQ2(p4B2N5b{VpK zF($7ip+Zp3Mi;CFKf*MTO)=PXW)_r92K(-9?xhC3!0U?L_D3Q981rMskKKWOC9|l7 zX$9If{t@A1p~IV)D7YAV=nkA)zQ$R@L~ZY78Di#d@OHQ{?R!)jyA{6Z3YrtkR*5)m zpX)m8ala(Z+z8LR>!rks0wIuZ>Uwxbb_Y#-BTpbxH&FHVvO(#{B#R;)pM=ksd!(vs z;Lb^vPECR@r`R!f4^xglGjC5qOO7IKz6LMn+7pv7oO9OkgRj_hYw-Gt z2c*LqTwZaau*Dkd^VNSX)GpSX;O<~$uF)X8(j)b(fJ-ZvwmkKp1vMs2L#tlz_ioF~tlD;1LzB-OH-hYm3C3<@SDa~l z z7**OCO5fn)yL=qu;~hTQVfQA5ro$ADk3koXrEKonh9A5X$wtcVkBW)YMy|P^>vS+3 zl1vIxh0c%J(&6(e*Lj`zyD@Dcl?X;0}vMc6h)qptjc1jUmBHo^4Rf?S~s~7oJZ-n;dx(-X9=dNl+1ha$Ha15>k_v7 zK;U#K;$mm4hpnn2Z$o|=-zm*-NLA=F45cS|4_-nU>))=J?*0NM)C=L0)y-ykXLa4? zozNQZ3|DTsM8oddD<;|qv~IOEvT4d-eO(p(2oBY4q;+tvTzJ hynyjaNK# +#include +#include + +// Aspect constatnts +#define TEXTLINES 4 +#define BORDERLINES 2 + +#define ENEMY_PAIR 1 +#define BONUS_PAIR 2 +#define TITLE_PAIR 3 +#define GMOVR_PAIR 4 +#define WINSC_PAIR 5 + +void init_colors(); +void print_menu(WINDOW* win); +void print_gameover(WINDOW* win); +void print_win_screen(WINDOW* win); + + +#endif \ No newline at end of file diff --git a/src/gui.c b/src/gui.c new file mode 100644 index 0000000..6821549 --- /dev/null +++ b/src/gui.c @@ -0,0 +1,120 @@ +#include "../include/gui.h" + +/************** FUNZIONI GUI ***************/ + +char* title[] = +{ +"###########################################################################################################", +"# o8888o o8888o o8888o o8888o o8888o o8888o o8 80 o8888o o8888o o8888o o8888o o8888o #", +"# 888o 0oooo0 88 888 88 88oo oo 888o 888o88 88 888 88 888 88 88oo 88oo88 #", +"# o888 88 888888 88 88 o888 88 88 88 888 88 888 88 88 88 88 #", +"# 088880 88 88 88 888880 088888 088880 08 80 088880 088880 00 088888 88 88o #", +"###########################################################################################################" +}; + +char menu_desc[] = "BENVENUTO. Premi qualsiasi tasto per giocare..."; + + +char* gameover[] = +{ +"o8888o o8888o o8oo8o o8888o o8888o 88 8o o8888o o8888o", +"888 oo 88 888 88\\/88 88oo oo 88 888 88 88 88oo 88oo88", +"888 8 888888 88 88 88 88 888 88 o8 88 88 88 ", +"O88880 88 88 88 88 888880 088880 888O 888880 88 88o" +}; + +char gameover_desc[] = "HAI PERSO. Premi q per uscire..."; + +char* win_screen[] = +{ +"o8 o8 o8888o o8 8o o8 8o o8888o o8 8o", +"88 o8 88 888 88 88 oo 88 88 88 888o88", +"888 88 888 88 88 88/\\88 88 88 888", +"888 088880 088880 8888 088880 88 88" +}; +char win_desc[] = "HAI VINTO. Premi q per uscire..."; + + +void init_colors() { + start_color(); + init_pair(ENEMY_PAIR, COLOR_RED, COLOR_BLACK); + init_pair(TITLE_PAIR, COLOR_MAGENTA, COLOR_BLACK); + init_pair(GMOVR_PAIR, COLOR_RED, COLOR_BLACK); + init_pair(BONUS_PAIR, COLOR_GREEN, COLOR_BLACK); + init_pair(WINSC_PAIR, COLOR_YELLOW, COLOR_BLACK); +} + +void print_menu(WINDOW* win) { + // Ottieni parametri della finestra + int height; + int width; + getmaxyx(win, height, width); + + // Scritta colorata + wattron(win, COLOR_PAIR(TITLE_PAIR)); + for(int i = 0; i < (TEXTLINES+BORDERLINES); i++) { + mvwprintw(win, i+1, (width-(strlen(title[0])))/2, "%s", title[i]); + } + wattroff(win, COLOR_PAIR(TITLE_PAIR)); + + // Scritta che blinka + wattron(win, A_BLINK); + mvwprintw(win, (TEXTLINES+BORDERLINES)+1, (width-(strlen(menu_desc)))/2, "%s", menu_desc); + wattroff(win, A_BLINK); + + // stampa a video + refresh(); + return; +} + +void print_gameover(WINDOW* win) { + // Parametri della finestra e pulisci tutto + int height; + int width; + int ch; + wclear(win); + getmaxyx(win, height, width); + + // Stampa della scritta colorata + wattron(win, COLOR_PAIR(GMOVR_PAIR)); + for(int i = 0; i < TEXTLINES; i++) { + mvwprintw(win, i+1, (width-(strlen(gameover[0])))/2, "%s", gameover[i]); + } + wattroff(win, COLOR_PAIR(GMOVR_PAIR)); + + // Stampa della scritta che blinka + wattron(win, A_BLINK); + mvwprintw(win, TEXTLINES+1, (width-(strlen(gameover_desc)))/2, "%s", gameover_desc); + wattroff(win, A_BLINK); + + // Stampa a video e attendi input + refresh(); + while((ch = wgetch(win)) != 'q'); + return; +} + +void print_win_screen(WINDOW* win) { + // Parametri della finestra e pulisci tutto + int height; + int width; + int ch; + wclear(win); + getmaxyx(win, height, width); + + // Stampa della scritta colorata + wattron(win, COLOR_PAIR(WINSC_PAIR)); + for(int i = 0; i < TEXTLINES; i++) { + mvwprintw(win, i+1, (width-(strlen(win_screen[0])))/2, "%s", win_screen[i]); + } + wattroff(win, COLOR_PAIR(WINSC_PAIR)); + + // Stampa della scritta che blinka + wattron(win, A_BLINK); + mvwprintw(win, TEXTLINES+1, (width-(strlen(win_desc)))/2, "%s", win_desc); + wattroff(win, A_BLINK); + + // Stampa a video e attendi input + refresh(); + while((ch = wgetch(win)) != 'q'); + return; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index d85fbde..1f3025a 100644 --- a/src/main.c +++ b/src/main.c @@ -6,6 +6,7 @@ #include #include #include +#include "../include/gui.h" /************* STATIC DEFINITIONS ************/ // Game constants @@ -20,15 +21,6 @@ #define HEIGHT 30 #define MIN_COLS 110 -// Aspect constatnts -#define TEXTLINES 4 -#define BORDERLINES 2 - -#define ENEMY_PAIR 1 -#define BONUS_PAIR 2 -#define TITLE_PAIR 3 -#define GMOVR_PAIR 4 -#define WINSC_PAIR 5 /************* GAME STRUCTURES **************/ struct speed { @@ -50,114 +42,6 @@ struct status { int remaining_bullets; }; -/************** FUNZIONI GUI ***************/ - -char* title[] = -{ -"###########################################################################################################", -"# o8888o o8888o o8888o o8888o o8888o o8888o o8 80 o8888o o8888o o8888o o8888o o8888o #", -"# 888o 0oooo0 88 888 88 88oo oo 888o 888o88 88 888 88 888 88 88oo 88oo88 #", -"# o888 88 888888 88 88 o888 88 88 88 888 88 888 88 88 88 88 #", -"# 088880 88 88 88 888880 088888 088880 08 80 088880 088880 00 088888 88 88o #", -"###########################################################################################################" -}; - -char menu_desc[] = "BENVENUTO. Premi qualsiasi tasto per giocare..."; - - -char* gameover[] = -{ -"o8888o o8888o o8oo8o o8888o o8888o 88 8o o8888o o8888o", -"888 oo 88 888 88\\/88 88oo oo 88 888 88 88 88oo 88oo88", -"888 8 888888 88 88 88 88 888 88 o8 88 88 88 ", -"O88880 88 88 88 88 888880 088880 888O 888880 88 88o" -}; - -char gameover_desc[] = "HAI PERSO. Premi q per uscire..."; - -char* win_screen[] = -{ -"o8 o8 o8888o o8 8o o8 8o o8888o o8 8o", -"88 o8 88 888 88 88 oo 88 88 88 888o88", -"888 88 888 88 88 88/\\88 88 88 888", -"888 088880 088880 8888 088880 88 88" -}; -char win_desc[] = "HAI VINTO. Premi q per uscire..."; - -void print_menu(WINDOW* win) { - // Ottieni parametri della finestra - int height; - int width; - getmaxyx(win, height, width); - - // Scritta colorata - wattron(win, COLOR_PAIR(TITLE_PAIR)); - for(int i = 0; i < (TEXTLINES+BORDERLINES); i++) { - mvwprintw(win, i+1, (width-(strlen(title[0])))/2, "%s", title[i]); - } - wattroff(win, COLOR_PAIR(TITLE_PAIR)); - - // Scritta che blinka - wattron(win, A_BLINK); - mvwprintw(win, (TEXTLINES+BORDERLINES)+1, (width-(strlen(menu_desc)))/2, "%s", menu_desc); - wattroff(win, A_BLINK); - - // stampa a video - refresh(); - return; -} - -void print_gameover(WINDOW* win) { - // Parametri della finestra e pulisci tutto - int height; - int width; - int ch; - wclear(win); - getmaxyx(win, height, width); - - // Stampa della scritta colorata - wattron(win, COLOR_PAIR(GMOVR_PAIR)); - for(int i = 0; i < TEXTLINES; i++) { - mvwprintw(win, i+1, (width-(strlen(gameover[0])))/2, "%s", gameover[i]); - } - wattroff(win, COLOR_PAIR(GMOVR_PAIR)); - - // Stampa della scritta che blinka - wattron(win, A_BLINK); - mvwprintw(win, TEXTLINES+1, (width-(strlen(gameover_desc)))/2, "%s", gameover_desc); - wattroff(win, A_BLINK); - - // Stampa a video e attendi input - refresh(); - while((ch = wgetch(win)) != 'q'); - return; -} - -void print_win_screen(WINDOW* win) { - // Parametri della finestra e pulisci tutto - int height; - int width; - int ch; - wclear(win); - getmaxyx(win, height, width); - - // Stampa della scritta colorata - wattron(win, COLOR_PAIR(WINSC_PAIR)); - for(int i = 0; i < TEXTLINES; i++) { - mvwprintw(win, i+1, (width-(strlen(win_screen[0])))/2, "%s", win_screen[i]); - } - wattroff(win, COLOR_PAIR(WINSC_PAIR)); - - // Stampa della scritta che blinka - wattron(win, A_BLINK); - mvwprintw(win, TEXTLINES+1, (width-(strlen(win_desc)))/2, "%s", win_desc); - wattroff(win, A_BLINK); - - // Stampa a video e attendi input - refresh(); - while((ch = wgetch(win)) != 'q'); - return; -} void print_status_bar(WINDOW* main_win, int y, int x, struct status game_status) { int status_x = x + 1; @@ -215,12 +99,7 @@ int main() { srand(time(NULL)); // Colori - start_color(); - init_pair(ENEMY_PAIR, COLOR_RED, COLOR_BLACK); - init_pair(TITLE_PAIR, COLOR_MAGENTA, COLOR_BLACK); - init_pair(GMOVR_PAIR, COLOR_RED, COLOR_BLACK); - init_pair(BONUS_PAIR, COLOR_GREEN, COLOR_BLACK); - init_pair(WINSC_PAIR, COLOR_YELLOW, COLOR_BLACK); + init_colors(); // Dimensioni finestra di gioco e controlli // calcolo delle misure della finestra