Ejemplo n.º 1
0
void HandlerDroit(int)
{
  S_RAQUETTE* raquetteTraitee;
  int parc;

  raquetteTraitee = (S_RAQUETTE*)pthread_getspecific(CleRaquette);

  pthread_mutex_lock(&mutexTableau);
  if(tab[raquetteTraitee->L][raquetteTraitee->C+3] == VIDE)
  {
    raquetteTraitee->C++;
    if(raquetteTraitee->L == 1)
      DessineRaquetteHaut(raquetteTraitee->L, raquetteTraitee->C);

    else
      DessineRaquetteBas(raquetteTraitee->L, raquetteTraitee->C);

    for(parc = (raquetteTraitee->C)-2; parc != (raquetteTraitee->C)+3; parc++)
        tab[raquetteTraitee->L][parc] = RAQUETTE;

    EffaceCarre(raquetteTraitee->L, raquetteTraitee->C-3);
    tab[raquetteTraitee->L][raquetteTraitee->C-3] = VIDE;
  }
  pthread_mutex_unlock(&mutexTableau);
}
Ejemplo n.º 2
0
void HandlerHaut(int)
{
  S_RAQUETTE* raquetteTraitee;
  int parc;

  raquetteTraitee = (S_RAQUETTE*)pthread_getspecific(CleRaquette);

  pthread_mutex_lock(&mutexTableau);
  if(tab[raquetteTraitee->L-3][raquetteTraitee->C] == VIDE)
  {
    raquetteTraitee->L--;
    if(raquetteTraitee->C == 1)
      DessineRaquetteGauche(raquetteTraitee->L, raquetteTraitee->C);

    else
      DessineRaquetteDroite(raquetteTraitee->L, raquetteTraitee->C);

    for(parc = (raquetteTraitee->L)-2; parc != (raquetteTraitee->L)+3; parc++)
        tab[parc][raquetteTraitee->C] = RAQUETTE;

    EffaceCarre(raquetteTraitee->L+3, raquetteTraitee->C);
    tab[raquetteTraitee->L+3][raquetteTraitee->C] = VIDE;
    
  }
  pthread_mutex_unlock(&mutexTableau);
}
Ejemplo n.º 3
0
//Les raquetes vont passer dedans pour bouger dans la direction voulue
void HandlerGauche(int)
{
  S_RAQUETTE* raquetteTraitee;
  int parc;

  raquetteTraitee = (S_RAQUETTE*)pthread_getspecific(CleRaquette);//On recupere la structure de la raquette qui passe ici

  pthread_mutex_lock(&mutexTableau);//lock le tableau pour la modif

  if(tab[raquetteTraitee->L][raquetteTraitee->C-3] == VIDE)//Si c'est vide a gauche (pas de mur ou de bille) on peut bouger
  {
    raquetteTraitee->C--;
    if(raquetteTraitee->L == 1)//si en haut
      DessineRaquetteHaut(raquetteTraitee->L, raquetteTraitee->C);

    else//Si en bas
      DessineRaquetteBas(raquetteTraitee->L, raquetteTraitee->C); 

    for(parc = (raquetteTraitee->C)-2; parc != (raquetteTraitee->C)+3; parc++) // On boucle pour ecrire l'emplacement des raquettes dans le tableau
        tab[raquetteTraitee->L][parc] = RAQUETTE;

    EffaceCarre(raquetteTraitee->L, raquetteTraitee->C+3); //On efface l'ancienne raquette
    tab[raquetteTraitee->L][raquetteTraitee->C+3] = VIDE;
  }
  pthread_mutex_unlock(&mutexTableau);
}
Ejemplo n.º 4
0
void* threadEvent(void*)
{
	char ok = 0;
	EVENT_GRILLE_SDL event;
  while(!ok)
  {
    event = ReadEvent();
    if (event.type == CROIX) ok = 1;
    if (event.type == CLIC_GAUCHE && event.colonne<10 && tab[event.ligne][event.colonne]==0)
		{
			DessineSprite(event.ligne,event.colonne,pieceEnCours.professeur);
			tab[event.ligne][event.colonne]=pieceEnCours.professeur;
			casesInserees[nbCasesInserees].ligne=event.ligne;
			casesInserees[nbCasesInserees].colonne=event.colonne;
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees++;
			pthread_mutex_unlock(&mutexCasesInserees);
			pthread_cond_signal(&condCasesInserees);
		}
		if (event.type == CLIC_DROIT && nbCasesInserees>0)
		{
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees--;
			pthread_mutex_unlock(&mutexCasesInserees);
			while(nbCasesInserees!=-1)
			{
				EffaceCarre(casesInserees[nbCasesInserees].ligne,casesInserees[nbCasesInserees].colonne);
				tab[casesInserees[nbCasesInserees].ligne][casesInserees[nbCasesInserees].colonne]=0;
				pthread_mutex_lock(&mutexCasesInserees);
				nbCasesInserees--;
				pthread_mutex_unlock(&mutexCasesInserees);
			}
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees=0;
			pthread_mutex_unlock(&mutexCasesInserees);
		}
  }
}
Ejemplo n.º 5
0
/******************************************THREAD BILLE*************************************************
*Controle une bille à l'ecran. Se charge d'afficher la bille dans l'interface, de déplacer celle-ci et
*d'effacer l'image de la bille sur la case qu'elle quitte.
*
********************************************************************************************************/
void* threadBille(void* p)
{
  S_BILLE MaBille;
  timespec_t tempsNano;
  int l, c, ok = 0, inZone = 0;
  sigset_t masque, demasque;

  memcpy(&MaBille, p,sizeof(S_BILLE)); // On copie la structure reçue
  pthread_mutex_unlock(&mutexLanceBille);// On lache le mutex pour que le thread lanceur puisse reutiliser sa structure

  pthread_setspecific(CleBille, (void*)&MaBille);//On met un pointeur vers la structure bille en variable spécifique

  //Masque qui accepte le SIGTRAP
  sigfillset(&demasque);
  sigdelset(&demasque, SIGTRAP);

  //Masque qui refuse tous les signaux
  sigfillset(&masque);

  pthread_mutex_lock(&mutexTableau); //Tableau bloqué pour pouvoir choisir l'endroit ou apparaitre et se dessiner.
  do
  {
    l = rand()%11+4;
    
    if(l > 5 && l < 13)
    {
      c = rand()%4+4;
      if(c > 5)
      c+=7;
    }

    else
      c = rand()%11+4;

    if(tab[l][c] == VIDE)
    {
      tab[l][c] = BILLE;
      ok = 1;
    }

  }while(!ok);

  MaBille.L = l;
  MaBille.C = c;
  DessineBille(GRISE, l, c); // On dessine et on met dans le tableau
  tab[l][c] = BILLE;
  pthread_mutex_unlock(&mutexTableau);

  tempsNano.tv_sec = 0;
  tempsNano.tv_nsec = 500000000L;
  nanosleep(&tempsNano, NULL); //La bille reste grise 0,5 sec

  DessineBille(MaBille.couleur, MaBille.L, MaBille.C); //puis on la color

  tempsNano.tv_sec = 0;
  tempsNano.tv_nsec = 350000000L; //init du temps d'attente de la bille

  while(c > 0 && c < 18 && l > 0 && l < 18) // tant qu'on ne sort pas du tableau
  {
    nanosleep(&tempsNano, NULL); //attente de 0,35 sec
    
    pthread_sigmask(SIG_SETMASK, &masque, NULL); // On masque SIGTRAP pour pas être bloqué alors qu'on tient le mutex

    pthread_mutex_lock(&mutexTableau); // et on prend le mutex

    if(MaBille.dir == GAUCHE) // Si ma bille va à gauche
    {
      if(tab[l][c-1] == VIDE) // On vérifie qu'on se deplace sur une cse libre
      {
        if((ZoneMagnetique(l, c-1)) == 1 && inZone == 0) //On verifie si on va rentrer dans la zone magnetique (et si on y est pas deja)
        {
          attenteZone(l, c-1); // On va se mettre sur la variable de condition et rester bloquer si on ne peut pas rentrer
          inZone = 1;// On est autorisé à rentrer dans la zone et on met une sorte de bool à 1 pour indiquer qu'on est dedans.
        }
        else if (inZone == 1 && (ZoneMagnetique(l, c-1)) == 0) // Si on est deja dans la zone et qu'on en sort
        {
          pthread_cond_signal(&condZoneMagnetique);// On envoit un signal pour debloquer une bille en attente
          inZone = 0; // Et on est plus dans la zone
        }


        tab[l][c] = VIDE; //On met l'ancienne case à vide
        EffaceCarre(l,c); //On efface le dessin dela bille sur l'ancienne case
        c -= 1;
        DessineBille(MaBille.couleur, l, c); // On dessine sur la nouvelle case
        tab[l][c] = BILLE; // la nouvelle case contient une bille
      }
      else // La case sur laquelle on va aller est pleine
      {
        MaBille.dir = DROITE; // on change de direction
      }
    }
    else if(MaBille.dir == DROITE)
    {
      if(tab[l][c+1] == VIDE)
      {

        if((ZoneMagnetique(l, c+1)) == 1 && inZone == 0)
        {
          attenteZone(l, c+1);
          inZone = 1;
        }
        else if (inZone == 1 && (ZoneMagnetique(l, c+1)) == 0)
        {
          pthread_cond_signal(&condZoneMagnetique);
          inZone = 0;
        }

        tab[l][c] = VIDE;
        EffaceCarre(l,c);
        c += 1;
        DessineBille(MaBille.couleur, l, c);
        tab[l][c] = BILLE;
      }
      else
      {
        MaBille.dir = GAUCHE;
      }

    }
    else if(MaBille.dir == HAUT)
    {
      if(tab[l+1][c] == VIDE)
      {
        if((ZoneMagnetique(l+1, c)) == 1 && inZone == 0)
        {
          attenteZone(l+1, c);
          inZone = 1;
        }
        else if (inZone == 1 && (ZoneMagnetique(l+1, c)) == 0)
        {
          pthread_cond_signal(&condZoneMagnetique);
          inZone = 0;
        }

        tab[l][c] = VIDE;
        EffaceCarre(l,c);
        l += 1;
        DessineBille(MaBille.couleur, l, c);
        tab[l][c] = BILLE;
      }
      else
      {
          MaBille.dir = BAS;
      }
    }
    else //BAS
    {
      if(tab[l-1][c] == VIDE)
      {

        if((ZoneMagnetique(l-1, c)) == 1 && inZone == 0)
        {
          attenteZone(l-1, c);
          inZone = 1;
        }
        else if (inZone == 1 && (ZoneMagnetique(l-1, c)) == 0)
        {
          pthread_cond_signal(&condZoneMagnetique);
          inZone = 0;
        }

        tab[l][c] = VIDE;

        EffaceCarre(l,c);
        l -= 1;
        DessineBille(MaBille.couleur, l, c);
        tab[l][c] = BILLE;
      }
      else
      {
          MaBille.dir = HAUT;
      }
    }
    pthread_mutex_unlock(&mutexTableau); // On lache la mutex
    MaBille.C = c; 
    MaBille.L = l;
    pthread_sigmask(SIG_SETMASK, &demasque, NULL); //On accepte le signal SIGTRAP
  }

  /******LA BILLE SORT DU TERRAIN***************************/
  nanosleep(&tempsNano, NULL); // derniere attente avant de sortir du tableau


  pthread_mutex_lock(&mutexBillesSorties);// On prend la mutex bille sortie

  //On met dans le vecteur globale des billes sorties notre structure
    billesSorties[indiceI].couleur = MaBille.couleur;
    billesSorties[indiceI].L = MaBille.L;
    billesSorties[indiceI].C = MaBille.C;
    billesSorties[indiceI].dir = MaBille.dir;

    indiceI++;

    if(indiceI >= 10)
      indiceI = 0;

  pthread_cond_signal(&condSortie); //On reveil le ramsaseur 
  pthread_mutex_unlock(&mutexBillesSorties);

  delBille(MaBille.couleur, MaBille.dir);// MAJ des infos sur les billes

  EffaceCarre(l,c); // On efface le carré sur laquelle la bille est morte :(
  tab[l][c] = VIDE;

  pthread_setspecific(CleBille, NULL); // Pointeur de la variable specific == NULL;

  pthread_exit(0);
}
Ejemplo n.º 6
0
void* threadGravite(void*)
{
	int i,j,tmp;
	struct timespec temps;
	temps.tv_sec=0;
	temps.tv_nsec=500000000;

	while(1)
	{
		pthread_mutex_lock(&mutexAnalyse);
		while(nbAnalyses<pieceEnCours.nbCases)
			pthread_cond_wait(&condAnalyse,&mutexAnalyse);
		printf("%d%d\n",nbLignesCompletes,nbColonnesCompletes);
		if(nbLignesCompletes == 0 && nbColonnesCompletes == 0)
		{
			nbAnalyses=0;
		}
		else
		{
			printf("ICICICICI\n");
			TriTableau(colonnesCompletes,nbColonnesCompletes);
			TriTableau(lignesCompletes,nbLignesCompletes);
			printf("OKOKOKOK\n");
			printf("colonnes:\n");
			for(i=0;i<nbColonnesCompletes;i++)
			{printf("c: %d\n",colonnesCompletes[i]);}
			printf("Lignes:\n");
			for(i=0;i<nbLignesCompletes;i++)
			{printf("l: %d\n",lignesCompletes[i]);}
			for(i=0;i<nbColonnesCompletes && colonnesCompletes[i]<5;i++)//Recule colonne <5
			{
				nanosleep(&temps,NULL);

					tmp=colonnesCompletes[i];
					while(tmp!=0)
					{
						for(j=0;j<14;j++)
						{
							tab[j][tmp]=tab[j][tmp-1];
							if(tab[j][tmp]==0)
							{
								EffaceCarre(j,tmp);
							}
							else
							{
								DessineSprite(j,tmp,BRIQUE);
							}
						}
						tmp--;
					}
					for(j=0;j<14;j++)
					{
						EffaceCarre(j,0);
						tab[j][0]=0;
					}
					//AJOUT 5 POINTS
					pthread_mutex_unlock(&mutexScore);
					score+=5;
					MAJScore++;
					pthread_mutex_unlock(&mutexScore);
					pthread_cond_signal(&condScore);
				}
				for(i=nbColonnesCompletes-1;i!=-1 && colonnesCompletes[i]>=5;i--)	//Recule Colonne >=5
				{
					nanosleep(&temps,NULL);
					tmp=colonnesCompletes[i];
					while(tmp!=10)
					{
						for(j=0;j<14;j++)
						{
							tab[j][tmp]=tab[j][tmp+1];
							if(tab[j][tmp]==0)
							{
								EffaceCarre(j,tmp);
							}
							else
							{
								DessineSprite(j,tmp,BRIQUE);
							}
						}
						tmp++;
					}
					for(j=0;j<14;j++)
					{
						EffaceCarre(j,9);
						tab[j][9]=0;
					}
					//AJOUT 5 POINTS
					pthread_mutex_unlock(&mutexScore);
					score+=5;
					MAJScore++;
					pthread_mutex_unlock(&mutexScore);
					pthread_cond_signal(&condScore);
				}
			for(i=0;i<nbLignesCompletes && lignesCompletes[i]<7;i++)//Recule Ligne<7
			{
				nanosleep(&temps,NULL);

					tmp=lignesCompletes[i];
					while(tmp!=0)
					{
						for(j=0;j<10;j++)
						{
							tab[tmp][j]=tab[tmp-1][j];
							if(tab[tmp][j]==0)
							{
								EffaceCarre(tmp,j);
							}
							else
							{
								DessineSprite(tmp,j,BRIQUE);
							}
						}
						tmp--;
					}
					for(j=0;j<10;j++)
					{
						EffaceCarre(0,j);
						tab[0][j]=0;
					}
					//AJOUT 5 POINTS
					pthread_mutex_unlock(&mutexScore);
					score+=5;
					MAJScore++;
					pthread_mutex_unlock(&mutexScore);
					pthread_cond_signal(&condScore);
				}
				for(i=nbLignesCompletes-1;i!=-1 && lignesCompletes[i]>=7;i--)//Recule Ligne>=7
				{
					nanosleep(&temps,NULL);
					tmp=lignesCompletes[i];
					while(tmp!=14)
					{
						for(j=0;j<10;j++)
						{
							tab[tmp][j]=tab[tmp+1][j];
							if(tab[tmp][j]==0)
							{
								EffaceCarre(tmp,j);
							}
							else
							{
								DessineSprite(tmp,j,BRIQUE);
							}
						}
						tmp++;
					}
					for(j=0;j<10;j++)
					{
						EffaceCarre(13,j);
						tab[13][j]=0;
					}
					//AJOUT 5 POINTS
					pthread_mutex_unlock(&mutexScore);
					score+=5;
					MAJScore++;
					pthread_mutex_unlock(&mutexScore);
					pthread_cond_signal(&condScore);
				}
			nbAnalyses=0;
			nbColonnesCompletes=0;
			nbLignesCompletes=0;
		}
		pthread_mutex_unlock(&mutexAnalyse);
		//pthread_kill(threadHandleFinPartie,SIGUSR2);
	}
}
Ejemplo n.º 7
0
void* threadPiece(void*)
{
	int choixPiece,i,j,tour,Lmin,Cmin,trouve;
	srand(time(NULL));
	trouve=1;
	while(1)
	{
		if(trouve==1)
		{
			/****************************************************/
			memcpy(&pieceEnCours,&pieces[/*rand()%7*/6],sizeof(PIECE));
			tour=(rand()%4);
			tour=1;
			for(i=0;i<tour;i++)
			{
				RotationPiece(&pieceEnCours);	//Rotation de la piece entre 0 et 3 fois
			}
			for(i=3;i<=6;i++)
			{
				for(j=15;j<=18;j++)
				{
					EffaceCarre(i,j);
				}
			}
			for(i=0;i<NB_CASES;i++)	
			{
				DessineSprite(pieceEnCours.cases[i].ligne+3,pieceEnCours.cases[i].colonne+15,pieceEnCours.professeur);
			}
		}
		pthread_mutex_lock(&mutexCasesInserees);
		while(nbCasesInserees<pieceEnCours.nbCases)
			pthread_cond_wait(&condCasesInserees,&mutexCasesInserees);
		pthread_mutex_unlock(&mutexCasesInserees);
		//verification piece
		Lmin=15;Cmin=11;
		for(i=0;i<pieceEnCours.nbCases;i++)
		{
			if(casesInserees[i].ligne<Lmin)
				Lmin=casesInserees[i].ligne;
			if(casesInserees[i].colonne<Cmin)
				Cmin=casesInserees[i].colonne;
		}
		//comparer pieces
		trouve=1;
		for(j=0;j<pieceEnCours.nbCases && trouve !=0;j++)
		{
			trouve=0;
			for(i=0;i<pieceEnCours.nbCases && trouve!=1;i++)
			{
				if(casesInserees[j].ligne-Lmin==pieceEnCours.cases[i].ligne &&	casesInserees[j].colonne-Cmin==pieceEnCours.cases[i].colonne)
					trouve=1;
			}
		}
		if(trouve==1) //trouvé
		{
			for(i=0;i<pieceEnCours.nbCases;i++)
			{
				DessineSprite(casesInserees[i].ligne,casesInserees[i].colonne,BRIQUE);
				tab[casesInserees[i].ligne][casesInserees[i].colonne]=BRIQUE;
				pthread_kill(tabThreadCases[casesInserees[i].ligne][casesInserees[i].colonne],SIGUSR1);
			}
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees=0;
			pthread_mutex_unlock(&mutexCasesInserees);
			pthread_mutex_lock(&mutexScore);
				score+=1;
				MAJScore=1;
			pthread_mutex_unlock(&mutexScore);
			pthread_cond_signal(&condScore);
		}
		else	//non trouvé
		{
			for(i=0;i<pieceEnCours.nbCases;i++)
			{
				EffaceCarre(casesInserees[i].ligne,casesInserees[i].colonne);
				tab[casesInserees[i].ligne][casesInserees[i].colonne]=0;
			}
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees=0;
			pthread_mutex_unlock(&mutexCasesInserees);
		}
	}
}
Ejemplo n.º 8
0
void * threadEvent(void *p)
{
	int i;
	char ok = 0;
	EVENT_GRILLE_SDL event;
	struct timespec bad_click_time;
	bad_click_time.tv_sec = 0;
	bad_click_time.tv_nsec = 250000000;

	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

	while(!ok)
	{
		event = ReadEvent();
		switch(event.type)
		{
			case CROIX:
				ok = 1;
				break;

			case CLIC_GAUCHE:
				if (!traitementEnCours)
				{
					if (event.colonne < 10 && nbCasesInserees < 4)
					{
						if (tab[event.ligne][event.colonne] == VIDE)
						{
							DessineSprite(event.ligne, event.colonne, pieceEnCours.professeur);

							pthread_mutex_lock(&mutexCasesInserees);
							casesInserees[nbCasesInserees].ligne = event.ligne;
							casesInserees[nbCasesInserees].colonne = event.colonne;
							++nbCasesInserees;
							pthread_mutex_unlock(&mutexCasesInserees);
							pthread_cond_signal(&condCasesInserees);

							tab[event.ligne][event.colonne] = pieceEnCours.professeur;
							// printf("\ntab[%d][%d] = %d\n", event.ligne, event.colonne, tab[event.ligne][event.colonne]);

							if (nbCasesInserees == 4)
							{
								pthread_mutex_lock(&mutexTraitement);
								traitementEnCours = 1;
								pthread_mutex_unlock(&mutexTraitement);
								DessineSprite(12, 11, VOYANT_BLEU);
							}
						}
					}
					else
					{
						// Click hors de la zone de jeu (traitement = 0)
						DessineSprite(12, 11, VOYANT_ROUGE);
						nanosleep(&bad_click_time, NULL);
						DessineSprite(12, 11, VOYANT_VERT);
					}
				}
				else
				{
					// Si on clique pendant un traitement
					DessineSprite(12, 11, VOYANT_ROUGE);
					nanosleep(&bad_click_time, NULL);
					DessineSprite(12, 11, VOYANT_BLEU);
				}
				break;

			case CLIC_DROIT:
				printf("Clic droit recu: nous allons effacer %d cases.\n", nbCasesInserees);

				for (i = 0 ; i < nbCasesInserees ; ++i)
				{
					EffaceCarre(casesInserees[i].ligne, casesInserees[i].colonne);
					tab[casesInserees[i].ligne][casesInserees[i].colonne] = VIDE;
				}

				pthread_mutex_lock(&mutexCasesInserees);
				nbCasesInserees = 0;
				pthread_mutex_unlock(&mutexCasesInserees);

			case CLAVIER:
				break;
		}
	}
	// Quitter le jeu (réveil du Main)
	pthread_cancel(threadHandleFinPartie);
}
Ejemplo n.º 9
0
void * threadPiece(void *p)
{
	int rot, i, j, col_min, ligne_min, pieceValidee;
	CASE casesVerif[NB_CASES];

	pthread_mutex_lock(&mutexPieceEnCours); // petit lock pour pouvoir unlock juste en dessous :D

	while (1)
	{
		pieceEnCours = pieces[rand() % 7];
		// pieceEnCours = pieces[0];
		rot = rand() % 4;
		
		for (i = 0 ; i < rot ; ++i)
			RotationPiece(&pieceEnCours);

		TranslationCases(pieceEnCours.cases, pieceEnCours.nbCases);

		// Tri sur ligne/colonne
		qsort(pieceEnCours.cases, pieceEnCours.nbCases , sizeof(CASE), compare_case);

		// On autorise le thread fin à vérifier si on peut insérer la nouvelle pièce
		pthread_mutex_unlock(&mutexPieceEnCours);

		// Effacement de la zone "pièce en cours"
		for (i = 0 ; i < 4 ; ++i)
		{
			for (j = 0 ; j < 4 ; ++j)
			{
				EffaceCarre(3 + i , 15 + j );
			}
		}

		// Affichage de la pièce en cours:
		for (i = 0 ; i < pieceEnCours.nbCases ; ++i)
		{
			DessineSprite(3 + pieceEnCours.cases[i].ligne, 15 + pieceEnCours.cases[i].colonne, pieceEnCours.professeur);
		}

		pieceValidee = 0;
		while (!pieceValidee)
		{
			// On attend que toutes les pièces soient insérées par le joueur
			pthread_mutex_lock(&mutexCasesInserees);
			while (nbCasesInserees < pieceEnCours.nbCases)
			{
				pthread_cond_wait(&condCasesInserees, &mutexCasesInserees);
			}
			pthread_mutex_unlock(&mutexCasesInserees);

			// Tri des cases insérées
			qsort(casesInserees, nbCasesInserees, sizeof(CASE), compare_case);

			// Vérification de la position des cases insérées par rapport à la pièce en cours
			memcpy(casesVerif, casesInserees, sizeof(CASE) * NB_CASES);
			TranslationCases(casesVerif, nbCasesInserees);

			pieceValidee = 1;
			for (i = 0 ; i < nbCasesInserees && pieceValidee == 1 ; ++i)
			{
				if (compare_case(&(pieceEnCours.cases[i]), &(casesVerif[i])) != 0)
					pieceValidee = 0;
			}

			if (pieceValidee)
			{
				for (i = 0 ; i < nbCasesInserees ; ++i)
				{
					tab[casesInserees[i].ligne][casesInserees[i].colonne] = BRIQUE;
					DessineSprite(casesInserees[i].ligne, casesInserees[i].colonne, BRIQUE);
				}

				// On réveille le threadScore et on incrémente le score
				pthread_mutex_lock(&mutexScore);
				++score;
				MAJScore = 1;
				pthread_mutex_unlock(&mutexScore);
				pthread_cond_signal(&condScore);

				// On empêche le thread Fin de lire la pièce avant que la nouvelle ne soit générée
				pthread_mutex_lock(&mutexPieceEnCours);

				// On réveille les 4 threads case
				for (i = 0 ; i < nbCasesInserees ; ++i)
				{
					pthread_kill(threadHandleCase[casesInserees[i].ligne][casesInserees[i].colonne], SIGUSR1);
				}
			}
			else
			{
				for (i = 0 ; i < nbCasesInserees ; ++i)
				{
					EffaceCarre(casesInserees[i].ligne, casesInserees[i].colonne);
					tab[casesInserees[i].ligne][casesInserees[i].colonne] = VIDE;
				}

				pthread_mutex_lock(&mutexTraitement);
				traitementEnCours = 0;
				pthread_mutex_unlock(&mutexTraitement);
				DessineSprite(12, 11, VOYANT_VERT);
			}
			pthread_mutex_lock(&mutexCasesInserees);
			nbCasesInserees = 0;
			pthread_mutex_unlock(&mutexCasesInserees);
		}
	}
}
Ejemplo n.º 10
-1
void * threadGravite(void *)
{
	int i, j, x, y;
	struct timespec observation, effet_graphique;
	observation.tv_sec = 2;
	observation.tv_nsec = 0;
	effet_graphique.tv_sec = 0;
	effet_graphique.tv_nsec = 500000000;

	while (1)
	{
		// On attend que toutes les analyses soient effectuées
		pthread_mutex_lock(&mutexAnalyse);
		while (nbAnalyses < pieceEnCours.nbCases)
		{
			pthread_cond_wait(&condAnalyse, &mutexAnalyse);
		}
		pthread_mutex_unlock(&mutexAnalyse);

		if (nbLignesCompletes == 0 && nbColonnesCompletes == 0)
		{
			printf("\n(GRAVITE) Rien d'intéressant dans ce move\n");
			pthread_mutex_lock(&mutexAnalyse);
			nbAnalyses = 0;
			pthread_mutex_unlock(&mutexAnalyse);
		}
		else // Il fat supprimer des lignes/colonnes
		{
			printf("(GRAVITE) Gravité activée!\n");
			printf("(GRAVITE) Suppression de %d lignes et %d colonnes:\n", nbLignesCompletes, nbColonnesCompletes);
			nanosleep(&observation, NULL);

			if (nbColonnesCompletes != 0)
			{
				// Tri des colonnes complètes afin de supprimer d'abbord les colonnes de gauche
				pthread_mutex_lock(&mutexAnalyse);
				qsort(colonnesCompletes, nbColonnesCompletes, sizeof(int), compare_ints);
				pthread_mutex_unlock(&mutexAnalyse);

				for (x = 0, y = 0 ; x < nbColonnesCompletes ; ++x) // Traitement pour chaque colonne complète
				{
					// Colonnes de gauche
					if (colonnesCompletes[x] < 5)
					{
						// Décalage des éléments vers la droite
						for (i = 0 ; i < NB_LIGNES ; ++i)
						{
							for (j = colonnesCompletes[x] ; j > 0 ; --j)
							{
								tab[i][j] = tab[i][j-1];
								if (tab[i][j] == VIDE)
									EffaceCarre(i, j);
								else
									DessineSprite(i, j, tab[i][j]);
							}
							tab[i][0] = VIDE;
							EffaceCarre(i, 0);
						}
						++y; // Y comptera le nombre de fois que nous avons traité des colonnes de gauche
						printf("Colonne %d supprimée.\n", colonnesCompletes[x]);
					}
					else // Colonnes de droite
					{
						// Décalage des éléments vers la gauche
						for (i = 0 ; i < NB_LIGNES ; ++i)
						{
							for (j = colonnesCompletes[nbColonnesCompletes-1-x + y] ; j < 9 ; ++j)
							{
								tab[i][j] = tab[i][j+1];
								if (tab[i][j] == VIDE)
									EffaceCarre(i, j);
								else
									DessineSprite(i, j, tab[i][j]);
							}
							tab[i][9] = VIDE;
							EffaceCarre(i, 9);
						}
						printf("Colonne %d supprimée.\n", colonnesCompletes[nbColonnesCompletes-1-x + y]);
					}

					nanosleep(&effet_graphique, NULL);
				}
			}

			if (nbLignesCompletes != 0)
			{
				// Tri des lignes complètes afin de supprimer d'abbord les lignes du haut
				pthread_mutex_lock(&mutexAnalyse);
				qsort(lignesCompletes, nbLignesCompletes, sizeof(int), compare_ints);
				pthread_mutex_unlock(&mutexAnalyse);

				for (x = 0, y = 0 ; x < nbLignesCompletes ; ++x) // Traitement pour chaque ligne complète
				{
					// Lignes du haut
					if (lignesCompletes[x] < 7)
					{
						// Décalage des éléments vers le bas
						for (j = 0 ; j < 10 ; ++j)
						{
							for (i = lignesCompletes[x] ; i > 0 ; --i)
							{
								tab[i][j] = tab[i-1][j];
								if (tab[i][j] == VIDE)
									EffaceCarre(i, j);
								else
									DessineSprite(i, j, tab[i][j]);
							}
							tab[0][j] = VIDE;
							EffaceCarre(0, j);
						}
						++y; // Y Comptera le nombre de fois que l'on a traité des lignes en haut
						printf("Ligne %d supprimée.\n", lignesCompletes[x]);
					}
					else // Lignes du bas
					{
						// Décalage des éléments vers le haut
						for (j = 0 ; j < 10 ; ++j)
						{
							for (i = lignesCompletes[nbLignesCompletes-1-x+y] ; i < NB_LIGNES-1 ; ++i)
							{
								tab[i][j] = tab[i+1][j];
								if (tab[i][j] == VIDE)
									EffaceCarre(i, j);
								else
									DessineSprite(i, j, tab[i][j]);
							}
							tab[NB_LIGNES-1][j] = VIDE;
							EffaceCarre(NB_LIGNES-1, j);
						}
						printf("Ligne %d supprimée.\n", lignesCompletes[nbLignesCompletes-1-x+y]);
					}
					
					nanosleep(&effet_graphique, NULL);
				}
			}

			// Ajout des points au score
			pthread_mutex_lock(&mutexScore);
			score += nbColonnesCompletes * COLONNE_COMPLETE;
			score += nbLignesCompletes * LIGNE_COMPLETE;
			MAJScore = 1;
			pthread_mutex_unlock(&mutexScore);
			pthread_cond_signal(&condScore);

			pthread_mutex_lock(&mutexAnalyse);
			nbColonnesCompletes = 0;
			nbLignesCompletes = 0;
			nbAnalyses = 0;
			pthread_mutex_unlock(&mutexAnalyse);
		}
		// Dans tous les cas:
		pthread_kill(threadHandleFinPartie, SIGUSR2);
	}
}