#include #include #include #include #define UP 'e' #define DOWN 'd' #define LEFT 's' #define RIGHT 'f' #define ESC 27 #define PAUSE 'p' typedef struct{ int colonna; int riga; }pezzo; //nuovo tipo di variabile: pezzo struct snake{ //creo una lista di pezzi che faranno da corpo al serpente pezzo inf; struct snake *next; //puntatore al pezzo successivo }; typedef struct{ //creo una struttura per contenere //le inforazioni sui punteggi migliori int posizione; char nome[10]; int punteggio; }record; //nuova variabile: record //prototipi delle funzioni void video(struct snake *punt, pezzo mela, int punteggio); struct snake *movimento(struct snake *punt,char *dir); struct snake *aggiungi_pezzo(struct snake *original,char dir); void fine(int punteggio); void salva_punteggio(int punteggio); void visualizza_punteggi(); time_t timer; main(){ //inizia il main char dir=RIGHT; //dichiaro ed inizlizzo la variabile dir che indicherà la direzione int punteggio=0,i; struct snake *punt; //inizializzo un puntatore alla struttura snake pezzo mela; //dichiaro una struttura pezzo che farà da mela timer=time(NULL); system("COLOR 1B"); system("cls"); printf("\n __ "); printf("\n ---_ ...... _/_ - "); printf("\n / . ./ .'*\\ \\ ___ __ _ _ _ __ _____ "); printf("\n : ' /__-' \\. / __| | \\ || /_\\ | |/ / | ___|"); printf("\n / ) | |__ ||\\\\ || //_\\\\ | / / | |__ "); printf("\n _/ > .' \\__ \\ || \\\\ || / ___ \\ | \\ | __|"); printf("\n / ' . _.-"" / .' __| | || \\\\|| / / \\ \\ | |\\ \\ | |__ "); printf("\n \\ __/"" /.' /____| || \\_| /_/ \\_\\ |_| \\_\\ |____|"); printf("\n \\ '-- .-"" / //' "); printf("\n \\| \\ | / // "); printf("\n \\: //"); printf("\n `\\/ // "); printf("\n \\__`\\/ / "); printf("\n \\_| "); printf("\n\n\n\npremere un tasto per continuare..."); getch(); punt = (struct snake *)malloc(sizeof(struct snake)); //allocco la memoria necessaria punt->inf.colonna=10; //inizializzo la colonna dove sarà la testa del serente punt->inf.riga=10; punt->next=NULL; //inizializzo a NULL il puntatore contenuto nella lista punt=aggiungi_pezzo(punt,dir); //aggiungo 2 pezzi punt=aggiungi_pezzo(punt,dir); srand(time(NULL)); //"randomizzo" il rand() mela.colonna=rand()%79; //inizializzo colonna e riga ad un valore casuale mela.riga=rand()%24; while(1){ printf("\t\t time: %d",(time(NULL)-timer)); video(punt,mela,punteggio); punt=movimento(punt,&dir); //se la testa del serpente ha le stesse coordinate della mela... if((punt->inf.colonna==mela.colonna)&&(punt->inf.riga==mela.riga)){ punt=aggiungi_pezzo(punt,dir); mela.colonna=rand()%78; mela.riga=rand()%23; punteggio+=10; } } return; } void video(struct snake *punt, pezzo mela, int punteggio){ int i,m; char schermone[24][79]; for(i=0;i<24;i++) //inizializzazione tabella for(m=0;m<79;m++) schermone[i][m]=' '; i=0; while(punt!=NULL){ //finché non è finito... if(schermone[punt->inf.riga][punt->inf.colonna]=='æ')//se il punto non è vuoto fine(punteggio); //disegna il corpo ed esce else{ //altrimenti procede e "colora" lo schermo schermone[punt->inf.riga][punt->inf.colonna]='æ'; /*if(punt->inf.riga<0) fine(punteggio);//se sono stati oltrepassati i if(punt->inf.riga>24) fine(punteggio);//bordi esce dal gioco if(punt->inf.colonna<0) fine(punteggio); if(punt->inf.colonna>78) fine(punteggio); */ punt=punt->next; } } schermone[mela.riga][mela.colonna]='@'; system("cls"); for(i=0;i<24;i++){ for(m=0;m<79;m++) printf("%c",schermone[i][m]); printf("\n"); } printf("\t\t\t\tpunteggio: %d",punteggio); } /*************************************************************************************** la funzione movimento farà cambiare la direzione e farà muovere il serpente cambiando le coordinate dei suoi pezzi riveve come parametri il puntatore alla testa del serpente il puntatore alla direzione ritorna un puntatore ala testa del serpente (una lista che punta agli altri pezzi) *************************************************************************************/ struct snake *movimento(struct snake *punt,char *dir){ if(kbhit()){ //se è stato premuto un tasto... switch (getch()){ case DOWN: //in base al tasto spinto cambia direzione if (*dir!=UP) //però non deve essere la direzzione opposta *dir=DOWN; //a quela prima, in tal caso non succede nulla break; case UP: if (*dir!=DOWN) *dir=UP; break; case LEFT: if (*dir!=RIGHT) *dir=LEFT; break; case RIGHT: if (*dir!=LEFT) *dir=RIGHT; break; case PAUSE: getch(); break; case ESC: exit(1); } } struct snake *original=punt,*temp;//dichiaro un nuovo puntatore alla testa dello //snake che userò per ripristinare il suo valore //ed una alto puntatore che userò... while(punt->next->next!=NULL) //ottengo il puntatore al penultimo elemento punt=punt->next; temp=punt->next; //in tutta sta parde faccio lo spostamento... temp->next=original; punt->next=NULL; if((*dir==DOWN)||(*dir==UP)) temp->inf.colonna=original->inf.colonna; if(*dir==DOWN) temp->inf.riga=original->inf.riga+1; if(*dir==UP) temp->inf.riga=original->inf.riga-1; if((*dir==LEFT)||(*dir==RIGHT)) temp->inf.riga=original->inf.riga; if(*dir==LEFT) temp->inf.colonna=original->inf.colonna-1; if(*dir==RIGHT) temp->inf.colonna=original->inf.colonna+1; if(temp->inf.colonna>78) temp->inf.colonna=0; if(temp->inf.colonna<0) temp->inf.colonna=78; if(temp->inf.riga>23) temp->inf.riga=0; if(temp->inf.riga<0) temp->inf.riga=23; punt=temp; return(punt); //il vaore di ritorno è il nuovo puntatore } //funzione finita /*in questa funzione aggiungo un pezzo alla lista che compone il corp del serpete*/ struct snake *aggiungi_pezzo(struct snake *original, char dir){ struct snake *prossimo; prossimo = (struct snake *)malloc(sizeof(struct snake)); if((dir==DOWN)||(dir==UP)) prossimo->inf.colonna=original->inf.colonna; if(dir==DOWN) prossimo->inf.riga=original->inf.riga+1; if(dir==UP) prossimo->inf.riga=original->inf.riga-1; if((dir==LEFT)||(dir==RIGHT)) prossimo->inf.riga=original->inf.riga; if(dir==LEFT) prossimo->inf.colonna=original->inf.colonna-1; if(dir==RIGHT) prossimo->inf.colonna=original->inf.colonna+1; prossimo->next=original; return(prossimo); } void fine(int punteggio){ system("cls"); printf("\n\t\tGAME OVER\n\n"); salva_punteggio(punteggio); printf("\tpunteggio: %d\n\n\tpremere:",punteggio); printf("\n\n 1 per uscire\n 2 per un altra partita"); printf("\n 3 per visualizzare i punteggi migliori\n\n\n"); while(1) switch (getch()){ case '1': exit(1); case '2': main(); case '3': visualizza_punteggi(); } } void visualizza_punteggi(){ FILE *stream=fopen("snake.rec","r"); char c; while(1){ c=getc(stream); if (c==EOF) break; putc (c, stdout); } fclose(stream); } void salva_punteggio(int punteggio){//salva il punteggio su file int i; record classifica[10]; FILE *stream = fopen("snake.rec","rt"); for(i=0;i<10;i++){ //prima li legge fscanf(stream, "%d. %s %d;",&classifica[i].posizione,classifica[i].nome,&classifica[i].punteggio); } if (punteggio>classifica[9].punteggio){ printf("\ninserisci il tuo nome:\n"); scanf("%s",&classifica[9].nome); classifica[9].punteggio=punteggio; record temp; for(i=9;punteggio > classifica[i-1].punteggio;i--){ temp=classifica[i-1]; classifica[i-1]=classifica[i]; classifica[i]=temp; } fclose(stream);//poi li riscrive aggiornati FILE *Wstream = fopen("snake.rec","w"); for(i=0;i<10;i++) { fprintf(Wstream,"%2d. %10s %5d;\n",i+1,classifica[i].nome,classifica[i].punteggio); } fclose(Wstream); } }