Concetti Chiave
- Il programma utilizza la libreria ncurses per gestire l'interfaccia utente in modalità testo.
- Un processo figlio legge i tasti premuti dall'utente e invia i comandi tramite pipe.
- Un secondo processo figlio funge da timer, inviando segnali a intervalli regolari.
- Il gioco prevede il movimento di un cursore che può mangiare una mela, rappresentata da un carattere 'O'.
- Quando il cursore raggiunge la mela, questa si sposta in una nuova posizione casuale e il cursore si allunga.
inizializzazione e setup
#include curses.h>
#include unistd.h>
#include sys/wait.h>
#include stdlib.h>
#include time.h>
#include string.h>
typedef struct{
int xm;
int ym;
}coordinate;
int main()
{
initscr();
noecho();
curs_set(0);
//start_color();
//init_pair(2, 0, 4);
int x=0, y=0;
char melap='O';
char cursore[21]= {"#"};
int p[2],pmela[2];
int pid1, pid2,pid3;
int mangiato=1;
coordinate mela;
srand(time(NULL));
mvprintw(y, x, "%s",cursore);
refresh();
pipe(p);
pipe(pmela);
if(pid1 = fork() == 0) //processo figlio tasti
{
char car;
while(1)
{
car=getch();
write(p[1], &car, sizeof(char));
}
}
else if(pid2 = fork() == 0) //timer
{
char i = '\0';
while(1)
{
usleep(1000000);
write(p[1], &i, sizeof(char));
}
}
else
{
char cond;
char dir='s';
mela.xm=rand()%10;
mela.ym=rand()%10;
mvprintw(mela.ym, mela.xm,"%c",melap);
refresh();
while(1)
{
read(p[0], &cond, sizeof(char));
if(cond=='\0')
{
erase();
switch(dir)
{
case 'w':
mvprintw(y, x, " ");
mvprintw(--y, x, "%s", cursore);
refresh();
break;
case 'a':
mvprintw(y, x, " ");
mvprintw(y, --x, "%s", cursore);
refresh();
break;
case 's':
mvprintw(y, x, " ");
mvprintw(++y, x, "%s", cursore);
refresh();
break;
case 'd':
mvprintw(y, x, " ");
mvprintw(y, ++x, "%s", cursore);
refresh();
break;
}
mvprintw(mela.ym, mela.xm,"%c",melap);
refresh();
}
else
dir=cond;
if(mela.ym==y &&mela.xm==x)
{
mvprintw(mela.ym, mela.xm," ");
strcat(cursore,"#");
mela.xm=rand()%10;
mela.ym=rand()%10;
mvprintw(mela.ym, mela.xm,"%c",melap);
refresh();
}
}
}
kill(pid1,15);
kill(pid2,15);
endwin();
return 0;
}
Domande da interrogazione
- Qual è la funzione principale del codice presentato?
- Come viene gestito l'input dell'utente nel programma?
- Cosa succede quando il cursore "mangia" la mela?
Il codice implementa un semplice gioco in cui un cursore si muove su uno schermo, cercando di "mangiare" una mela rappresentata da un carattere. Utilizza processi per gestire l'input dell'utente e un timer.
L'input dell'utente viene gestito tramite un processo figlio che legge i tasti premuti e scrive i caratteri in una pipe, permettendo al processo principale di ricevere e interpretare i comandi di movimento.
Quando il cursore raggiunge la posizione della mela, il programma cancella la mela dallo schermo, aumenta la lunghezza del cursore e genera una nuova mela in una posizione casuale, continuando il gioco.