Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "graphdsu.h"
- #include <math.h>
- #include <time.h>
- #include <unistd.h>
- #include <string.h>
- #define NBCOL 10 //Nombre de colonnes de la grille
- #define NBLIG 8 //Nom de lignes de la grille
- #define LARG 60 //Taille des cases en pixel
- #define NBCOUL 6 //Nombre de couleurs possibles par me
- //Formes
- #define RECTANGLE 0
- #define CERCLE 1
- #define TRIANGLE 2
- typedef struct Case Case;
- struct Case
- {
- int m_forme; /*valeur prise dans {0,1,2} */
- int m_couleur; /*valeur comprise entre 1 et NBCOUL*/
- int m_ligne; /*valeur comprise entre 1 et NBLIG */
- int m_colonne; /*valeur comprise entre 1 et NBCOL */
- };
- typedef Case Grille[NBLIG][NBCOL];
- void init_case(Case *Pcase); //Initialise la case
- void dessin_case(Case *Pcase,int Pcoul_fond); //Dessine la case
- void init_grille(Grille Pgrille); //Initialise la grille
- void copie_case(Case *Pcase_1, Case *Pcase_2); //Copie une case dans une autre
- void faire_tomber(Grille Pgrille, Case *Pcase_bas, int Phauteur); //Fait tomber les case
- int eliminer_sequence(Grille Pgrille, int Ppassage, int *Pnb_seq); //Elimine la séquence de cases
- int jouer(Grille Pgrille);
- void echange(Case *Pcase_1, Case *Pcase_2);
- int recherche_seq_hori_forme(Grille Pgrille, Case *Pcase, Case** Pcase_gauche);
- int recherche_seq_hori_couleur(Grille Pgrille, Case *Pcase, Case** Pcase_gauche);
- int recherche_seq_verti_forme(Grille Pgrille, Case *Pcase, Case** Pcase_bas);
- int recherche_seq_verti_couleur(Grille Pgrille, Case *Pcase, Case** Pcase_bas);
- int main()
- {
- srand(time(NULL));
- Grille grille_jeu;
- Initialiser(NBCOL * (LARG) + 300, NBLIG * (LARG));
- init_grille(grille_jeu);
- return 0;
- }
- void init_case(Case *Pcase)
- {
- Pcase->m_forme = rand() % 3;
- int couleur;
- do {couleur = (rand() % 6);}while (couleur == 1);
- Pcase->m_couleur = couleur;
- }
- void dessin_case(Case *Pcase, int Pcoul_fond)
- {
- int x0,y0,x1,y1;
- int x_centre,y_centre,r;
- int x2,y2,x3,y3;
- ChangeCouleur(Pcoul_fond);
- y0 = Pcase->m_ligne * LARG;
- x0 = Pcase->m_colonne * LARG;
- y1 = Pcase->m_ligne * LARG + LARG;
- x1 = Pcase->m_colonne * LARG + LARG;
- RectanglePlein(x0,y0,x1,y1);
- ChangeCouleur(Pcase->m_couleur);
- switch(Pcase->m_forme)
- {
- case 0:
- x0 = x0 + 5;
- y0 = y0 + 5;
- x1 = x1 - 5;
- y1 = y1 - 5;
- RectanglePlein(x0,y0,x1,y1);
- break;
- case 1:
- x_centre = x1 - (LARG / 2);
- y_centre = y1 - (LARG / 2);
- r = (LARG / 2) - 5;
- CerclePlein(x_centre, y_centre, r);
- break;
- case 2:
- x3 = x0 + 5;
- y3 = y0 + LARG - 5;
- x2 = x1 - 5;
- y2 = y1 - 5;
- y1 = y0 + 5;
- x1 = (x1 + x0) / 2;
- TrianglePlein(x3, y3, x1, y1, x2, y2);
- break;
- }
- }
- void init_grille(Grille Pgrille)
- {
- int i,j;
- for(i = 0; i < NBLIG; i++)
- {
- for(j = 0; j < NBCOL; j++)
- {
- init_case(&Pgrille[i][j]);
- Pgrille[i][j].m_ligne = i;
- Pgrille[i][j].m_colonne = j;
- dessin_case(&Pgrille[i][j],1);
- }
- }
- }
- int recherche_seq_hori_forme(Grille Pgrille, Case* Pcase, Case** Pcase_gauche)
- {
- int i;
- int longueur = 0;
- int longueur_droite = 0;
- int longueur_gauche = 0;
- for (i = Pcase->m_colonne; i < NBCOL; i++)
- {
- if (Pgrille[Pcase->m_ligne][i].m_forme == Pgrille[Pcase->m_ligne][i+1].m_forme && (i+1 < NBCOL) && Pgrille[Pcase->m_ligne][i].m_forme == Pcase->m_forme)
- {
- longueur_droite++;
- }
- else
- {
- break;
- }
- }
- for (i = Pcase->m_colonne; i >= 0; i--)
- {
- if (Pgrille[Pcase->m_ligne][i].m_forme == Pgrille[Pcase->m_ligne][i-1].m_forme && (i-1 >= 0) && Pgrille[Pcase->m_ligne][i].m_forme == Pcase->m_forme)
- {
- longueur_gauche++;
- }
- else
- {
- break;
- }
- }
- longueur = longueur_droite + longueur_gauche + 1;
- if (longueur < 5)
- {
- *Pcase_gauche = NULL;
- return 0;
- }
- else
- {
- *Pcase_gauche = &Pgrille[Pcase->m_ligne][i];
- return longueur;
- }
- }
- int recherche_seq_hori_couleur(Grille Pgrille, Case* Pcase, Case** Pcase_gauche)
- {
- int i;
- int longueur = 0;
- int longueur_droite = 0;
- int longueur_gauche = 0;
- for (i = Pcase->m_colonne; i < NBCOL; i++)
- {
- if (Pgrille[Pcase->m_ligne][i].m_couleur == Pgrille[Pcase->m_ligne][i+1].m_couleur && (i+1 < NBCOL) && Pgrille[Pcase->m_ligne][i].m_couleur == Pcase->m_couleur)
- {
- longueur_droite++;
- }
- else
- {
- break;
- }
- }
- for (i = Pcase->m_colonne; i >= 0; i--)
- {
- if (Pgrille[Pcase->m_ligne][i].m_couleur == Pgrille[Pcase->m_ligne][i-1].m_couleur && (i-1 >= 0) && Pgrille[Pcase->m_ligne][i].m_couleur == Pcase->m_couleur)
- {
- longueur_gauche++;
- }
- else
- {
- break;
- }
- }
- longueur = longueur_droite + longueur_gauche + 1;
- if (longueur < 3)
- {
- *Pcase_gauche = NULL;
- return 0;
- }
- else
- {
- *Pcase_gauche = &Pgrille[Pcase->m_ligne][i];
- return longueur;
- }
- }
- int recherche_seq_verti_forme(Grille Pgrille, Case* Pcase, Case** Pcase_bas)
- {
- int i;
- int longueur = 0;
- int longueur_haut = 0;
- int longueur_bas = 0;
- for (i = Pcase->m_ligne; i >= 0; i--)
- {
- if (Pgrille[i][Pcase->m_colonne].m_forme == Pgrille[i-1][Pcase->m_colonne].m_forme && (i-1 >= 0) && Pgrille[i][Pcase->m_colonne].m_forme == Pcase->m_forme)
- {
- longueur_haut++;
- }
- else
- {
- break;
- }
- }
- for (i = Pcase->m_ligne; i < NBLIG; i++)
- {
- if (Pgrille[i][Pcase->m_colonne].m_forme == Pgrille[i+1][Pcase->m_colonne].m_forme && (i+1 < NBLIG) && Pgrille[i][Pcase->m_colonne].m_forme == Pcase->m_forme)
- {
- longueur_bas++;
- }
- else
- {
- break;
- }
- }
- longueur = longueur_bas + longueur_haut + 1;
- if (longueur < 5)
- {
- *Pcase_bas = NULL;
- return 0;
- }
- else
- {
- *Pcase_bas = &Pgrille[i][Pcase->m_colonne];
- return longueur;
- }
- }
- int recherche_seq_verti_couleur(Grille Pgrille, Case* Pcase, Case** Pcase_bas)
- {
- int i;
- int longueur = 0;
- int longueur_haut = 0;
- int longueur_bas = 0;
- for (i = Pcase->m_ligne; i >= 0; i--)
- {
- if (Pgrille[i][Pcase->m_colonne].m_couleur == Pgrille[i-1][Pcase->m_colonne].m_couleur && (i-1 >= 0) && Pgrille[i][Pcase->m_colonne].m_couleur == Pcase->m_couleur)
- {
- longueur_haut++;
- }
- else
- {
- break;
- }
- }
- for (i = Pcase->m_ligne; i < NBLIG; i++)
- {
- if (Pgrille[i][Pcase->m_colonne].m_couleur == Pgrille[i+1][Pcase->m_colonne].m_couleur && (i+1 < NBLIG) && Pgrille[i][Pcase->m_colonne].m_couleur == Pcase->m_couleur)
- {
- longueur_bas++;
- }
- else
- {
- break;
- }
- }
- longueur = longueur_bas + longueur_haut + 1;
- if (longueur < 3)
- {
- *Pcase_bas = NULL;
- return 0;
- }
- else
- {
- *Pcase_bas = &Pgrille[i][Pcase->m_colonne];
- return longueur;
- }
- }
- void copie_case(Case *Pcase_1, Case *Pcase_2)
- {
- /*
- int tmp1,tmp2;
- tmp1 = Pcase_1->m_forme;
- tmp2 = Pcase_1->m_couleur;
- Pcase_1->m_forme = Pcase_2->m_forme;
- Pcase_1->m_couleur = Pcase_2->m_couleur;
- Pcase_2->m_forme = tmp1;
- Pcase_2->m_couleur = tmp2;
- */
- *Pcase_1 = *Pcase_2;
- }
- int eliminer_sequence(Grille Pgrille, int Ppassage, int *Pnb_seq)
- {
- int i;
- int j;
- int k;
- int l = 0;
- int hauteur_forme;
- int hauteur_couleur;
- int hauteur_verticale_forme;
- int hauteur_verticale_couleur;
- int score = 0;
- int couleur;
- Case *case_bas;
- for (i = 0; i < NBLIG; i++)
- {
- for (j = 0; j < NBCOL; j++)
- {
- hauteur_forme = recherche_seq_hori_forme(Pgrille,&Pgrille[i][j],&case_bas);
- if (hauteur_forme != 0)
- {
- if (Ppassage == 1)
- {
- for (l = case_bas->m_colonne; l < case_bas->m_colonne + hauteur_forme; l++)
- {
- dessin_case(&Pgrille[case_bas->m_ligne][l],0);
- }
- sleep(1);
- }
- for (l = case_bas->m_ligne; l >= 0; l--)
- {
- if (l != 0)
- {
- for (k = case_bas->m_colonne; k < (case_bas->m_colonne) + hauteur_forme; k++)
- {
- copie_case(&Pgrille[l][k],&Pgrille[l-1][k]);
- dessin_case(&Pgrille[l][k],1);
- }
- }
- else
- {
- for (k = case_bas->m_colonne; k < (case_bas->m_colonne) + hauteur_forme; k++)
- {
- Pgrille[l][k].m_forme=rand() % 3;
- do {couleur = (rand() % 6);}while (couleur == 1);
- Pgrille[l][k].m_couleur = couleur;
- dessin_case(&Pgrille[l][k],1);
- }
- }
- }
- score = score + hauteur_forme;
- (*Pnb_seq)++;
- i = 0;
- j = 0;
- }
- hauteur_verticale_forme = recherche_seq_verti_forme(Pgrille,&Pgrille[i][j],&case_bas);
- if (hauteur_verticale_forme != 0)
- {
- if (Ppassage == 1)
- {
- for (l = case_bas->m_ligne; l < case_bas->m_ligne + hauteur_verticale_forme; l++)
- {
- dessin_case(&Pgrille[l][case_bas->m_colonne],0);
- }
- sleep(1);
- }
- for (k = case_bas->m_ligne + hauteur_verticale_forme-1; k >= 0; k--)
- {
- if ((k-hauteur_verticale_forme) >= 0)
- {
- copie_case(&Pgrille[k][case_bas->m_colonne],&Pgrille[k - hauteur_verticale_couleur][case_bas->m_colonne]);
- dessin_case(&Pgrille[k][case_bas->m_colonne],1);
- }
- else
- {
- Pgrille[k][case_bas->m_colonne].m_forme=rand()%3;
- do {couleur = (rand() % 6);}while (couleur == 1);
- Pgrille[l][k].m_couleur = couleur;
- dessin_case(&Pgrille[k][case_bas->m_colonne],1);
- }
- }
- score = score + hauteur_verticale_forme;
- (*Pnb_seq)++;
- i = 0;
- j = 0;
- }
- hauteur_couleur = recherche_seq_hori_couleur(Pgrille,&Pgrille[i][j],&case_bas);
- if (hauteur_couleur != 0)
- {
- if (Ppassage == 1)
- {
- for (l = case_bas->m_colonne; l < case_bas->m_colonne+hauteur_couleur; l++)
- {
- dessin_case(&Pgrille[case_bas->m_ligne][l],0);
- }
- sleep(1);
- }
- for (l = (case_bas->m_ligne); l >= 0; l--)
- {
- if (l != 0)
- {
- for (k = case_bas->m_colonne; k < (case_bas->m_colonne)+hauteur_couleur; k++)
- {
- copie_case(&Pgrille[l][k],&Pgrille[l-1][k]);
- dessin_case(&Pgrille[l][k],1);
- }
- }
- else
- {
- for (k = case_bas->m_colonne; k < (case_bas->m_colonne) + hauteur_couleur; k++)
- {
- Pgrille[l][k].m_forme=rand()%3;
- do {couleur = (rand() % 6);}while (couleur == 1);
- Pgrille[l][k].m_couleur = couleur;
- dessin_case(&Pgrille[l][k],1);
- }
- }
- }
- score = score + hauteur_couleur;
- (*Pnb_seq)++;
- i = 0;
- j = 0;
- }
- hauteur_verticale_couleur = recherche_seq_verti_couleur(Pgrille,&Pgrille[i][j],&case_bas);
- if (hauteur_verticale_couleur != 0)
- {
- if (Ppassage == 1)
- {
- for (l = case_bas->m_ligne; l < case_bas->m_ligne + hauteur_verticale_couleur; l++)
- {
- dessin_case(&Pgrille[l][case_bas->m_colonne],0);
- }
- sleep(1);
- }
- for (k = case_bas->m_ligne + hauteur_verticale_couleur-1; k >= 0; k--)
- {
- if ((k - hauteur_verticale_couleur) >= 0)
- {
- copie_case(&Pgrille[k][case_bas->m_colonne],&Pgrille[k-hauteur_verticale_couleur][case_bas->m_colonne]);
- dessin_case(&Pgrille[k][case_bas->m_colonne],1);
- }
- else
- {
- Pgrille[k][case_bas->m_colonne].m_forme=rand()%3;
- do {couleur = (rand() % 6);}while (couleur == 1);
- Pgrille[l][k].m_couleur = couleur;
- dessin_case(&Pgrille[k][case_bas->m_colonne],1);
- }
- }
- score = score + hauteur_verticale_couleur;
- (*Pnb_seq)++;
- i = 0;
- j = 0;
- }
- }
- }
- return score;
- }
- int jouer(Grille Pgrille)
- {
- int fond = 1;
- int cpt_fond = 0;
- int x = 0;
- int y = 0;
- int temp_x = -1;
- int temp_y = -1;
- int x_fond;
- int y_fond;
- int passage = 0;
- int echange = 0;
- int point = 0;
- int nb_seq = 0;
- int temps = 10;
- int score = 0;
- int cpt = 1;
- int nb = 1;
- char point_score_1[100] = {0};
- char point_score_2[100] = {0};
- char point_score_3[100] = {0};
- char date_1[100] = {0};
- char date_2[100] = {0};
- char date_3[100] = {0};
- Case *case_bas;
- time_t t;
- char date_heure[64] = {0};
- FILE* fichier = NULL;
- fichier = fopen("score.txt","r+");
- if (fichier == NULL)
- {
- fichier = fopen("score.txt", "w+");
- }
- ChangerCouleur(0);
- date_1[0] = '\0';
- fscanf(fichier,"%[^;]",date_1);
- if (strlen(date_1) != 0)
- {
- EcrireDessus(NBCOL * LARG+10,320,date_1);
- }
- point_score_1[0] = '\0';
- fscanf(fichier,";%[^;]",point_score_1);
- if (strlen(point_score_1) != 0)
- {
- EcrireDessus(NBCOL * LARG+10,340,point_score_1);
- }
- date_2[0] = '\0';
- fscanf(fichier,";%[^;]",date_2);
- if (strlen(date_2)!=0){
- EcrireDessus(NBCOL*LARG+10,360,date_2);
- }
- point_score_2[0] = '\0';
- fscanf(fichier,";%[^;]",point_score_2);
- if (strlen(point_score_2) != 0)
- {
- EcrireDessus(NBCOL * LARG+10,380,point_score_2);
- }
- date_3[0] = '\0';
- fscanf(fichier,";%[^;]",date_3);
- if (strlen(date_3) != 0)
- {
- EcrireDessus(NBCOL * LARG+10,400,date_3);
- }
- point_score_3[0] = '\0';
- fscanf(fichier,";%s",point_score_3);
- if (strlen(point_score_3) != 0)
- {
- EcrireDessus(NBCOL * LARG+10,420,point_score_3);
- }
- while(!(x > NBCOL * LARG- LARG && y > NBLIG * LARG - LARG))
- {
- if (temps == 0)
- {
- break;
- }
- else
- {
- timer(&temps);
- }
- echange = 0;
- if (passage == 0)
- {
- eliminer_sequence(Pgrille,passage,&nb_seq);
- nb_seq = 0;
- }
- else
- {
- if (cpt_fond == 0)
- {
- cpt_fond = 1;
- fond = 0;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- x_fond = (x/LARG)*LARG;
- y_fond = (y/LARG)*LARG;
- temp_x = x;
- temp_y = y;
- }
- else
- {
- AttendreClicXY(&x,&y);
- if ((x >= x_fond && x <= (x_fond + LARG)) && (y >= y_fond && y <= (y_fond + LARG)))
- {
- fond = 1;
- cpt_fond = 0;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- }
- else
- {
- fond = 0;
- if ((x / LARG == temp_x / LARG + 1 && y / LARG == temp_y / LARG) || (x / LARG == temp_x / LARG - 1 && y / LARG == temp_y / LARG) || (x / LARG == temp_x / LARG && y / LARG == temp_y / LARG - 1) || (x / LARG == temp_x / LARG && y / LARG == temp_y / LARG + 1))
- {
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[temp_y/LARG][temp_x/LARG],fond);
- sleep(1);
- echange(&Pgrille[y/LARG][x/LARG],&Pgrille[temp_y/LARG][temp_x/LARG]);
- fond = 0;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[temp_y/LARG][temp_x/LARG],fond);
- sleep(1);
- echange = 1;
- cpt_fond = 0;
- fond = 1;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[temp_y/LARG][temp_x/LARG],fond);
- if (recherche_seq_verti_couleur(Pgrille,&Pgrille[y/LARG][x/LARG],&case_bas) == 0 && recherche_seq_hori_couleur(Pgrille,&Pgrille[y/LARG][x/LARG],&case_bas) == 0 && recherche_seq_hori_forme(Pgrille,&Pgrille[y/LARG][x/LARG],&case_bas) == 0 && recherche_seq_verti_forme(Pgrille,&Pgrille[y/LARG][x/LARG],&case_bas) == 0)
- {
- echange(&Pgrille[y/LARG][x/LARG],&Pgrille[temp_y/LARG][temp_x/LARG]);
- fond = 0;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[temp_y/LARG][temp_x/LARG],fond);
- sleep(1);
- fond = 1;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[temp_y/LARG][temp_x/LARG],fond);
- }
- }
- else
- {
- cpt_fond = 0;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- sleep(1);
- fond = 1;
- dessin_case(&Pgrille[y/LARG][x/LARG],fond);
- dessin_case(&Pgrille[y_fond/LARG][x_fond/LARG],fond);
- }
- }
- }
- {
- if ((cpt_fond != 0 || passage == 1) && echange == 1)
- sleep(1);
- point = eliminer_sequence(Pgrille,passage,&nb_seq) + point;
- menu(nb_seq * nb_seq * point * 100);
- score = nb_seq * nb_seq * point * 100 + score;
- nb_seq = 0;
- }
- temps--;
- }
- if (passage == 0)
- {
- passage = 1;
- }
- }
- fclose(fichier);
- fichier = fopen("score.txt","r+");
- while (score / nb >= 10)
- {
- nb = nb * 10;
- cpt++;
- }
- time(&t);
- strftime(date_heure,sizeof(date_heure),"%A %d %B %Y - %X",localtime(&t));
- if (score > atoi(point_score_1))
- {
- if (strlen(point_score_2) != 0)
- {
- fprintf(fichier,"%s;%d;%s;%d;%s;%d",date_heure,score,date_1,atoi(point_score_1),date_2,atoi(point_score_2));
- }
- else if (strlen(point_score_1) != 0)
- {
- fprintf(fichier,"%s;%d;%s;%d;",date_heure,score,date_1,atoi(point_score_1));
- }
- else
- {
- fprintf(fichier,"%s;%d;",date_heure,score);
- }
- date_2[0] = '\0';
- fscanf(fichier,"%[^;]",date_2);
- }
- else if (score > atoi(point_score_2))
- {
- if (strlen(point_score_2) != 0)
- {
- fprintf(fichier,"%s;%d;%s;%d;%s;%d",date_1,atoi(point_score_1),date_heure,score,date_2,atoi(point_score_2));
- }
- else
- {
- fprintf(fichier,"%s;%d;%s;%d;",date_1,atoi(point_score_1),date_heure,score);
- }
- date_3[0] = '\0';
- fscanf(fichier,"%[^;]",date_3);
- }
- else if (score>atoi(point_score_3))
- {
- fprintf(fichier,"%s;%d;%s;%d;%s;%d",date_1,atoi(point_score_1),date_2,atoi(point_score_2),date_heure,score);
- }
- fclose(fichier);
- if (x > NBCOL * LARG + 300 - LARG && y > NBLIG * LARG - LARG)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
- void echange(Case *Pcase_1, Case *Pcase_2)
- {
- Case temp;
- temp.m_forme = Pcase_1->m_forme;
- temp.m_couleur = Pcase_1->m_couleur;
- Pcase_1->m_forme = Pcase_2->m_forme;
- Pcase_1->m_couleur = Pcase_2->m_couleur;
- Pcase_2->m_forme = temp.m_forme;
- Pcase_2->m_couleur = temp.m_couleur;
- }
Add Comment
Please, Sign In to add comment