#include "Tennis.h" int main() { int i=0,lan,kb; srand((unsigned)time(NULL)); struct Raq *rq; /***** Gestion du terminal *****/ if (tcgetattr(0,&Term) == -1) exit(1); SaveTerm = Term; Term.c_lflag &= ~(ICANON | ECHO | ISIG); Term.c_cc[VMIN] = 1; if (tcsetattr(0,TCSANOW,&Term) == -1) exit(1); /***** Ouverture de la grille de jeu *****/ if (OuvrirGrille(LIGNE,COLONNE,20) == -1) { perror("Erreur de InitGrille"); exit(-1); } //Armement du signal pour faire monter la raquette: sigemptyset(&sigAct.sa_mask); sigAct.sa_handler = handlerUp; if (sigaction(SIGUSR1,&sigAct,NULL) == -1) { perror("Err. de signal...\n"); exit(1); } //Armement du signal pour faire descendre la raquette: sigemptyset(&sigAct2.sa_mask); sigAct2.sa_handler = handlerDown; if (sigaction(SIGUSR2,&sigAct2,NULL) == -1) { perror("Err. de signal...\n"); exit(1); } //Armement du signal pour arreter le jeu: /*sigemptyset(&sigAct.sa_mask); sigAct.sa_handler = handlerFin; if (sigaction(SIGINT,&sigAct,NULL) == -1) { perror("Err. de signal...\n"); exit(1); }*/ LimitesTerrain(); pthread_mutex_init(&mutexTerrain,NULL); pthread_mutex_init(&mutexZone,NULL); pthread_cond_init(&condZone,NULL); if(pthread_key_create(&cle,NULL) != 0) { printf("\nErreur de creation de cle..."); exit(0); } pthread_create(&threadHandle, NULL, (void*(*)(void*))fctClavier,&kb); /*rq->ligne = 5; rq->colonne = 0; rq->taille = 5;*/ pthread_create(&threadHandle, NULL, (void*(*)(void*))fctRaquette,GAUCHE); /*rq->ligne = 5; rq->colonne = COLONNE-1; rq->taille = 5;*/ pthread_create(&threadHandle, NULL, (void*(*)(void*))fctRaquette,DROITE); sigemptyset(&sigAct.sa_mask); sigaddset(&sigAct.sa_mask,SIGUSR1); sigaddset(&sigAct.sa_mask,SIGUSR2); sigprocmask(SIG_SETMASK,&sigAct,&OldsigAct); pthread_create(&threadHandle, NULL, (void*(*)(void*))fctLanceur,&lan); sleep(30); /***** Fermeture de la grille de jeu *****/ FermerGrille(); if (tcsetattr(0,TCSANOW,&SaveTerm) == -1) exit(1); exit(0); } /****************************************************************************************/ int LimitesTerrain() { int i,j; /***** Murs haut et bas *****/ for(j=0 ; jligne][b->colonne]; if(b->dir == GAUCHE && (Terrain[b->ligne][b->colonne-1] == BALLE || Terrain[b->ligne][b->colonne-1] == RAQUETTE)) b->dir = DROITE; if(b->dir == DROITE && (Terrain[b->ligne][b->colonne+1] == BALLE || Terrain[b->ligne][b->colonne+1] == RAQUETTE)) b->dir = GAUCHE; if(Terrain[b->ligne][b->colonne] == ZONE) zone_limite(b); //Affichage de la balle à l'endroit qui lui a été désigné: Terrain[b->ligne][b->colonne] = BALLE; DessineCarre(b->ligne,b->colonne,b->couleur); pthread_mutex_unlock(&mutexTerrain); nanosleep(&time,NULL); pthread_mutex_lock(&mutexTerrain); //Restitution de ce qui se trouvait à l'emplacement de la balle avant celle-ci: restitution(b,prec); balle_cote(b); pthread_mutex_unlock(&mutexTerrain); if(b->colonne>COLONNE||b->colonne<0) pthread_exit(1); } } /****************************************************************************************/ void * fctLanceur() { struct Balle *b; struct timespec time; time.tv_sec = 1; time.tv_nsec = 0; int i=0,j=0; while(1) { b = (struct Balle *) malloc (sizeof(struct Balle)); do { //b->ligne = 10; b->ligne = rand()%13 + 1; b->colonne = rand()%28 + 1; }while(Terrain[b->ligne][b->colonne] == BALLE || Terrain[b->ligne][b->colonne] == ZONE); do b->couleur = rand()%10; while(b->couleur == BLANC || b->couleur == NOIR || b->couleur == GRIS); b->dir = rand()%2; pthread_create(&threadHandle, NULL, (void*(*)(void*))fctBalle,b); i++; nanosleep(&time,NULL); } } /****************************************************************************************/ void * zone_limite(struct Balle *b) { //Blocage de l'accès à la zone grise: pthread_mutex_lock(&mutexZone); while(NbrBallesZone == NBMAX_BALLES_ZONE) { if(b->dir == GAUCHE) DessineCarre(b->ligne,b->colonne+1,b->couleur); else DessineCarre(b->ligne,b->colonne-1,b->couleur); pthread_mutex_unlock(&mutexTerrain); pthread_cond_wait(&condZone,&mutexZone); pthread_mutex_lock(&mutexTerrain); if(b->dir == GAUCHE) DessineCarre(b->ligne,b->colonne+1,BLANC); else DessineCarre(b->ligne,b->colonne-1,BLANC); } NbrBallesZone++; pthread_mutex_unlock(&mutexZone); } /****************************************************************************************/ void * restitution(struct Balle *b,int prec) { Terrain[b->ligne][b->colonne] = prec; if(prec == ZONE) { pthread_mutex_lock(&mutexZone); DessineCarre(b->ligne,b->colonne,GRIS); NbrBallesZone--; pthread_mutex_unlock(&mutexZone); pthread_cond_signal(&condZone); } else DessineCarre(b->ligne,b->colonne,BLANC); } /****************************************************************************************/ void * balle_cote(struct Balle *b) { if(b->dir == GAUCHE) { if(Terrain[b->ligne][b->colonne-1] == BALLE||Terrain[b->ligne][b->colonne-1] == RAQUETTE) { b->dir = DROITE; b->colonne++; } else b->colonne--; } else { if(Terrain[b->ligne][b->colonne+1] == BALLE||Terrain[b->ligne][b->colonne+1] == RAQUETTE) { b->dir = GAUCHE; b->colonne--; } else b->colonne++; } } /****************************************************************************************/ void * fctClavier() { while(1) { switch(ReadChar()) { case 'a': kill(getpid(),SIGUSR1); break; case 'q': kill(getpid(),SIGUSR2); break; case 'p': kill(getpid(),SIGUSR1); break; case 'm':kill(getpid(),SIGUSR2); break; case 'x': printf("x\n"); break; } } } /****************************************************************************************/ void * fctRaquette(int pos) { int i,p; //Détection de raquette gauche ou droite: if(pos==GAUCHE) pos=0; else pos=COLONNE-1; //Affichage de la raquette: for(i=5;i<(LIGNE-5);i++) { Terrain[i][pos] = RAQUETTE; DessineCarre(i,pos,NOIR); } //Sauvegarde de l'emplacement: pos=30; if(pthread_setspecific(cle,(void*)pos)) { printf("\nErreur de sauvegarde de la donnee specifique..."); exit(0); } p = (int) pthread_getspecific(cle); printf("pos: %d, cle: %d\n",p,cle); } /****************************************************************************************/ void handlerDown(int sig) { int p=3; printf("handlerDown\n"); printf("pos: %d, cle: %d\n",p,cle); p = (int) pthread_getspecific(cle); printf("pos: %d\n",p); } /****************************************************************************************/ void handlerUp(int sig) { int p; printf("\nhandlerUp"); p = (int) pthread_getspecific(cle); printf("\npos: %d\n",p); } /****************************************************************************************/ void handlerFin(int sig) { printf("\nhandlerFin"); }