Perplessità processi (c,java,python, generico)

« Older   Newer »
  Share  
view post Posted on 18/3/2020, 20:42
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Tra alti e bassi...e periodo da dimenticare, ho finito il gioco. Versione non a processi.

Se vi interessa:

 
Top
view post Posted on 18/3/2020, 21:36
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


sempre più carino :)
 
Top
view post Posted on 19/3/2020, 09:43
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Grazie, ho cercato di colorarlo un po'.
Sembra funzionare bene...lo sto testando, i bug sono sempre in agguato. I peggiori poi sono quelli rari, si presentano raramente, e li solitamente sono c. Amari
Rispetto alla versione a pricessi, ci sono pro e contro.
Il contro e' che se rallento di molto il tempo del bruco, la tastiera e' sorda, il movimento lo perdo ( e qui forse si torna agli stati finiti) a processi&pipe no, non perdi nulla anche se il tempo e' lunghissimo.
Posto il programma dopo solo cosi'...giusto se a qualcuno dovesse interessare
 
Top
view post Posted on 19/3/2020, 09:52
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Sembra che il risultato sia buono. C'è tutto quello che volevi fare, compreso il rientro destra-sinistra e alto-basso.
 
Top
view post Posted on 19/3/2020, 10:26
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Sì,
io avevo problemi residui di controllo coordinate sia ai bordi (il mio non rientra ma dà errore, se tocchi i bordi - il gioco originale era così :) ) e sia quando prendi i box dei punti, ma tutto ok. E poi alle volte qualcosa nel redraw... logico
 
Top
view post Posted on 19/3/2020, 11:10
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Mi pareva invece che si potesse sforare i bordi...bho ricordo male allora , io l'ho fatto così preferivo.
Anche io se passo sopra i punti momentaneamente si cancellano, ma ho lasciato così, se no o complicavo
o dovevo sacrificare la prima riga...ho preferito lasciar stare.
Ecco il codice
Come detto l'ho dotato di memorizzazione del record su file...nulla di chè.
Qualcosa è migliorabile, ma per ora mi va bene così:
CODICE
// gioco bruco 3/2020 by Gila75 //

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <ncurses.h>
#include <time.h>

#define ROW 43
#define COL 132
#define L_SNAKE 112
#define DX 261
#define SX 260
#define DOWN 258
#define UP 259
#define SIZE_BUFF 10
#define TEMPO 90000
int dir_up_down[4]={0,0,-1,1}; // array per direzioni (variabili globali)
int dir_lat[4]={1,-1,0,0};
int punti=0;

struct gioco
       {
               int x[500];
               int y[500];
               int rnd;
               int tmp_coda_x;
               int tmp_coda_y;
               int corpo;
               int bit_mela;
               int canc;
               
       }
       snake={.corpo=L_SNAKE, .bit_mela=0,.canc=0};




int cerca_file (FILE **fd, char buff[]);
int aggiorna_record(FILE **fd,char buff[],int old_record);
void init_bruco (struct gioco *punt);
void cambia_dir (struct gioco *punt, int dir_tasto,int mela_x,int mela_y);

//*******************************************************************************
// aggiorna il record su file, solo se è maggiore del vecchio record


int  aggiorna_record(FILE **fd,char buff[],int old_record)
{
       
       *fd=fopen("record.txt", "r");
       if(*fd==NULL )
               exit(0);
               
       if (punti>old_record)
       {
               fclose(*fd);
               *fd=fopen("record.txt", "w");
               if (*fd==NULL)
                       exit(0);
               fprintf (*fd,"%d",punti);
               fclose(*fd);
               return 1;
       }

       else
       {        
               fclose(*fd);
               return 0;        
       }
}
//*******************************************************************************


//*******************************************************************************
// cerca il file per memorizzare i record: se non esiste lo crea e
// lo inizializza a zero
// se esiste legge il contenuto per confrontarlo piu avanti
//*******************************************************************************

int cerca_file (FILE **fd,char buff[])
{
       int n,x;
       *fd=fopen("record.txt", "r");
       if( *fd==NULL )
       {
               move (19,35);
               printw("*********************************\n");
               move (20,35);
               printw ("* nessun record memorizzato     *\n");
               move (21,35);
               printw ("* premi un tasto per proseguire *\n");
               move (22,35);
               printw("*********************************\n");
             *fd=fopen("record.txt", "w");

               if( fd==NULL )
               {
                   printw("impossibile creare");refresh();
                       exit(0);
               }
               fprintf (*fd,"%d",0);
               fclose(*fd);
               getch();
               erase();refresh();
               return 0;
       }

       else
       {
               for(;;)
               {
                       n = fread(buff, 1, SIZE_BUFF, *fd);    
                       if( n == 0 )
                       break;
               }
               x=atoi(buff);
               move (19,35);
               printw ("OLD RECORD:%d\n",x);
               move (20,35);
               printw ("premi un tasto per proseguire\n");
               refresh ();
               getch();
               erase();
              return x;
       }
}
               

//*******************************************************************************
       



void cambia_dir (struct gioco *punt, int dir_tasto,int mela_x,int mela_y)
{
       int j,tmp_x,tmp_y;
       attron(COLOR_PAIR(1));
       punt->tmp_coda_x=punt->x[punt->corpo-1]; // memorizzo la coda che il padre metterà come spazio
       punt->tmp_coda_y=punt->y[punt->corpo-1];
       
       for (j=0; j< punt->corpo-1; j++)
       {
               tmp_x=punt->x[j+1];      // scalo posizioni per muovere
               tmp_y=punt->y[j+1];      
               punt->x[j+1]=punt->x[0];
               punt->y[j+1]=punt->y[0];
               punt->x[0]=tmp_x;
               punt->y[0]=tmp_y;
       }
// se la testa incontra la mela : aumenta corpo, azzera  bit mela
// setta bit canc: non deve cancellare la coda...infatti aumenta
       if ((mvinch (punt->x[1]+dir_up_down[dir_tasto],punt->y[1]+dir_lat[dir_tasto]) & A_CHARTEXT) == 'X')
       {        
               punt->bit_mela=0;
               move (mela_x,mela_y);
               addch(' ');
               punt->corpo++;
               punt->x[punt->corpo-1]=punt->tmp_coda_x;
               punt->y[punt->corpo-1]=punt->tmp_coda_y;
               punt->canc=1;
               punti++;
               move (0,0);
               printw("punti %d\n",punti);refresh();
       }
       punt->rnd=dir_tasto;
       
}
                       

//*******************************************************************************
// inizializzazione bruco
//*******************************************************************************
void init_bruco (struct gioco *punt)
{
       int j;        
       for (j=0; j<punt->corpo; j++)
       {
           punt->x[j]=10;  // creo array bruco
           punt->y[j]=10+j; //11
       }        
               
       for (j=0; j<punt->corpo; j++) // stampo bruco
       {
               move(punt->x[j], punt->y[j]);
               addch('@');
       }
       
       move(punt->x[0], punt->y[0]);
       addch('<');refresh();

}

       


int main(void)
{
       
       initscr();   // init ncurses
       cbreak();        // e funzioni varie per ncurses
       noecho();
       curs_set(0);
       intrflush(stdscr, FALSE);
       keypad(stdscr, TRUE);
       start_color ();
//*********************************
       srand((unsigned) time(NULL));
       char heads[]="><^V";
       int ch=0;
       int tmp_dir=1;
       int mela_x,mela_y,i,old_record;
       char buff[SIZE_BUFF];  
       FILE *fd;
       // iniz. colori
       init_pair(1,COLOR_GREEN,COLOR_BLACK); // verde su black (snake)
       init_pair(2,COLOR_RED,COLOR_BLACK); // rosso su black (testa)
       init_pair(3,COLOR_YELLOW,COLOR_BLACK); // rosso su black (mela)

       old_record=cerca_file (&fd,buff);
       attron(COLOR_PAIR(1)); //attiva coppia colori 1
       init_bruco (&snake);
       nodelay (stdscr, TRUE); // getc() NON bloccante
       while(1)
       {
               attron(COLOR_PAIR(1));
               ch=getch();
               if (ch==-1)
                       cambia_dir (&snake,tmp_dir,mela_x,mela_y);

               if (ch==DX && tmp_dir!=1) //se vai a dx,negato sx
               {  
                       cambia_dir (&snake,261-ch,mela_x,mela_y);
                       tmp_dir=261-ch;
               }
               
                       
               if (ch==SX && tmp_dir!=0)
               {        
                       cambia_dir (&snake,261-ch,mela_x,mela_y);
                       tmp_dir=261-ch;
               }
                       
               if (ch==UP && tmp_dir!=3)
               {  
                       cambia_dir (&snake,261-ch,mela_x,mela_y);
                       tmp_dir=261-ch;
               }
                       
               if (ch==DOWN && tmp_dir!=2)
               {  
                       cambia_dir (&snake,261-ch,mela_x,mela_y);
                       tmp_dir=261-ch;
               }
               
               if (ch==32)
               {
                       while (1)
                       {
                               ch=getch();
                               if (ch==32)
                                       break ;
                       }
               }
                       
                       
               snake.x[snake.corpo]=snake.tmp_coda_x;
               snake.y[snake.corpo]=snake.tmp_coda_y;
               
               for (i=1; i<snake.corpo; i++)
               {
                       move (snake.x[i], snake.y[i]);
                       addch('@');refresh();
               }
               
               

               if ((mvinch(snake.x[1]+dir_up_down[snake.rnd],snake.y[1]+dir_lat[snake.rnd])& A_CHARTEXT) == '@')
               {
                       erase();
                       nodelay (stdscr, FALSE);
                       i=aggiorna_record(&fd,buff,old_record);
                       move (19,35);
                       printw("GAME OVER!!!! punti:%d\n",punti);
                       move (20,35);
                       printw("premi tasto per uscire\n");refresh();
                       getch();
                       
                       if (i==1)
                       {
                               move (20,35);
                               printw ("NEW RWCORD: punti %d\n", punti);
                               move (21,35);
                               printw ("tasto per uscire\n");refresh();
                               
                               getch();
                       }
                       endwin();
                       return 0;
               }
       
               else
               {
                       snake.x[0]=snake.x[1]+dir_up_down[snake.rnd]; //aggiorno dir testa in base al tasto arrivato
                       snake.y[0]=snake.y[1]+dir_lat[snake.rnd];
               }        
               
               attroff(COLOR_PAIR(1));
               attron(COLOR_PAIR(2));

               if (snake.y[0]>COL-1) // sbuca a col 0
               {
                       snake.y[0]=0;
                       move (snake.x[0], snake.y[0]);
                       addch(heads[snake.rnd]);
               }
                       
               if (snake.y[0]<0) // sbuca a col 80
               {        
                       snake.y[0]=COL-1;
                       move (snake.x[0], snake.y[0]);
                       addch(heads[snake.rnd]);
               }

               if (snake.x[0]>ROW-1) // sbuca a row 0
               {
                       snake.x[0]=0;
                       move (snake.x[0], snake.y[0]);
                       addch(heads[snake.rnd]);
               }

               if (snake.x[0]<0) // sbuca a row 24
               {
                       snake.x[0]=ROW-1;
                       move (snake.x[0], snake.y[0]);
                       addch(heads[snake.rnd]);
               }

               else
               {
                       move (snake.x[0], snake.y[0]);
                       addch(heads[snake.rnd]);refresh();
               }

               attroff(COLOR_PAIR(2));
               attron(COLOR_PAIR(1));
               
               if (snake.canc==0)
               {
                       move (snake.x[snake.corpo],snake.y[snake.corpo]);
                       addch(' ');refresh();
               }
               else
                       snake.canc=0;
               if (snake.bit_mela==0)
               {
                       while(1)
                       {
                               mela_x=rand()%(ROW);
                               mela_y=rand()%(COL);
                               if ((mvinch(mela_x,mela_y) & A_CHARTEXT)==' ')
                               {
                                       attron(COLOR_PAIR(3));
                                       move (mela_x,mela_y);
                                       addch('X');
                                       refresh();
                                       attroff(COLOR_PAIR(3));
                                       snake.bit_mela=1;
                                       break;
                               }
                       }
               }
               refresh();
               usleep(TEMPO);
       }
       return 0;
}

la gestione di ncurses, colori e movimenti è ancora primitiva, non so usare bene tutto.
Però per quello c'è tempo
 
Top
view post Posted on 19/3/2020, 11:26
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Più o meno siamo là, come codice :) io ho un'array di struct (nel 94 erano 3 array, poi si cresce :D ) e in questa ci metto il simbolo (direzione) e le coordinate di ogni segmentino, così posso ridisegnare/aggiornare/ecc.

Per il gioco originale, tu sei più giovane e quindi di sicuro parliam di due cose diverse :D Io mi sto riferendo a due Arcade che erano in sala giochi a Sauze d'Oulx tra il 1978 e il 1980: uno era questo Arrows che è praticamente identico a come l'ho rifatto io (vedi video sopra - a parte che si poteva pure giocare in due), mentre poi c'era un semplice Bruco, senza punti e direi soltanto da giocare a due cercando di "bloccare" l'altro - E QUESTO FORSE aveva i bordi aperti.
 
Top
view post Posted on 19/3/2020, 12:38
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Un array di struct...non ci avevo pensato.
Calcola che un po' di codice in piu' e' per il file e per i colori
 
Top
view post Posted on 19/3/2020, 13:12
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Sì, giusto: quelli che dico io erano b/n :) forse addirittura con la pellicola colorata davanti!

Per i record, in genere è una cosa che implemento anche io: ma questo giochino nacque appunto su quella scheda Z80 che non aveva memoria
 
Top
view post Posted on 23/3/2020, 22:29
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Sembra che il risultato sia buono. C'è tutto quello che volevi fare, compreso il rientro destra-sinistra e alto-basso.

Si, ho aggiunto i colori, la memorizzazione record nel file, e l'aumento della velocità in base ai punti. Una sorta di gioco a
livelli crescenti di difficoltà.
Si, carino, ma lo scopo del 3d è un po' naufragato: comparare pregi\difetti tra i processi e un programma sequenziale
a "polling", e infine la terza variante a stati finiti.
Quello era interessante. Il gioco si, un bell'esercizio tutto sommato... ma ripeto l'interessante era altro.
Tra la scomparsa di mia suocera e sta porcata che c'è in giro rimandiamo...
Ma sappiate... che prima o poi torno alla carica....!!! :D :D :ph34r:
 
Top
159 replies since 6/1/2020, 21:09   1137 views
  Share