Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*pour compiler ce fichier : gcc -o EXEC PICROSS.c -Wall -lncurses
- Pour installer la librairie complète ncurses sur votre machine via le terminal, il faut taper la commande : sudo apt-get install libncurses*
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <ncurses.h>
- #include <unistd.h>
- #include <math.h>
- #include <signal.h>
- #include <string.h>
- #include <termios.h>
- #include <fcntl.h>
- int L, C; /*L pour désigner la ligne et C la colonne du clic de la souris*/
- //gcc -o arun arun.c -Wall -lncruses
- /**Initialisation de ncurses**/
- void ncurses_initialiser() {
- initscr(); /* Démarre le mode ncurses */
- cbreak(); /* Pour les saisies clavier (desac. mise en buffer) */
- noecho(); /* Désactive l'affichage des caractères saisis */
- keypad(stdscr, TRUE); /* Active les touches spécifiques */
- refresh(); /* Met a jour l'affichage */
- curs_set(FALSE); /* Masque le curseur */
- }
- /**Initialisation des couleurs**/
- void ncurses_couleurs() {
- /* Vérification du support de la couleur */
- if(has_colors() == FALSE) {
- endwin();
- fprintf(stderr, "Le terminal ne supporte pas les couleurs.\n");
- exit(EXIT_FAILURE);
- }
- /* Activation des couleurs */
- start_color();
- //init_color(COLOR_BLACK, 1000, 1000, 1000);
- init_pair(1, COLOR_WHITE, COLOR_BLACK);
- init_pair(2, COLOR_GREEN, COLOR_BLACK);
- }
- /**Initialisation de la souris**/
- void ncurses_souris() {
- if(!mousemask(ALL_MOUSE_EVENTS, NULL)) {
- endwin();
- fprintf(stderr, "Erreur lors de l'initialisation de la souris.\n");
- exit(EXIT_FAILURE);
- }
- if(has_mouse() != TRUE) {
- endwin();
- fprintf(stderr, "Aucune souris n'est détectée.\n");
- exit(EXIT_FAILURE);
- }
- }
- /**Pour récupérer les coordonnées (x,y) du clic de la souris**/
- int click_souris()
- {
- MEVENT event ;
- int ch;
- while((ch = getch()) != KEY_F(1))
- {
- switch(ch)
- {
- case KEY_F(2): /*Pour quitter la boucle*/
- return 1;
- case KEY_MOUSE:
- if(getmouse(&event) == OK)
- {
- C = event.x;
- L = event.y;
- if(event.bstate & BUTTON1_CLICKED)
- {
- return 0;
- }
- }
- }
- }
- return 0;
- }
- void initTAB(int size, int iArray[]){//initialise un tableau 1D à 0
- int i;
- for(i=0 ; i<size ; i++){
- iArray[i]=0;
- }
- }
- void initArray(int lin, int col,int iArray[lin][col]){//initialize un tableau à 2 dimension
- int i,j;
- for(i=0; i<lin; i++){
- for(j=0; j<col; j++){
- iArray[i][j]=0;
- }
- }
- }
- void alea(int nblin, int nbcol, int TABbis[nblin][nbcol]){// choisit un nombre aléatoire entre 0 1
- int i,j;
- for(i=0; i<nblin; i++){
- for(j=0; j<nbcol; j++){
- if(rand()%2==0){// si le nombre aléatoireest paire
- TABbis[i][j]=1;// la case en question prend 1 sinon 2
- }else{
- TABbis[i][j]=2;
- }}}}
- void col_init(int nblin, int nbcol, int dim2, int TAB[nblin][nbcol] ,int Tab2[nblin][dim2]){//permet d'avoir le nombre de cases correctes sur les colonnes
- int i,j,k;
- for (i=0;i<nblin;i++){
- j=0;
- k=0;
- while(j<nbcol){
- if(TAB[i][j]==2){
- while(TAB[i][j]==2 && j<nbcol){
- Tab2[i][k]++;
- j++;
- }
- k++;
- }
- j++;
- }}}
- void lin_init(int nblin, int nbcol, int dim1, int TAB[nblin][nbcol] ,int Tab3[dim1][nbcol]){// permet d'avoir le nombre de cases correctes sur les lignes
- int i,j,k;
- for(i=0; i<nbcol;i++){
- j=0;
- k=0;
- while(j<nblin){
- if (TAB[i][j]==2){
- while(TAB[j][i]==2 && j<nblin){
- Tab3[k][i]++;
- j++;
- }
- k++;
- }
- j++;
- }}}
- void dimension (char image, int *nblin, int *nbcol){//si le joueur veut utiliser le mode image on commence par les dimensions de celle ci
- char ima[7] = "./X.txt";
- ima[2]=image;//image= la lettre entrée par l'utilisateur (1ère position position)-> on change le chemain d'accès avec le tableau
- FILE *FIC;
- FIC = fopen(ima, "r"); //ouvre le fichier, r pour read
- if(FIC==NULL){//si l'image ne correspond pas
- endwin();//restore le terminal (quitte lncurse)
- printf("impossible de trouver l'image: %s \n", ima);
- exit(-1);//on quitte le jeux
- }else{//sinon
- fscanf(FIC,"%d %d", nblin, nbcol);// on commence par prendre les dimension de l'image
- fclose(FIC);//ferme le flux
- }
- }
- void RemplisageImage(char image, int nblin, int nbcol, int TABbis[nblin][nbcol]){//remplie le tableau de jeux avec les données du fichier .txt
- char ima[7] = "./X.txt";
- int i, j, temp;
- ima[2]=image;// même principe que précédemment
- FILE *FIC;
- FIC = fopen(ima, "r");
- fseek(FIC, 1, SEEK_SET);//définie la position du fichier sur le flux à l'endroit indiqué (seek_set signifie au début du fichier)
- for(i=0 ; i<nblin ; i++){
- for(j=0 ; j<nbcol ; j++){
- fscanf(FIC,"%d", &temp);
- TABbis[i][j] = temp+1;//remplie la matrice
- }
- }
- }
- /*Pour récupérer les données saisies par l'utilisateur sans bloquer le jeu*/
- char key_pressed() {
- struct termios oldterm, newterm;
- int oldfd;
- char c, result = 0;
- tcgetattr (STDIN_FILENO, &oldterm);
- newterm = oldterm;
- newterm.c_lflag &= ~(ICANON | ECHO);
- tcsetattr (STDIN_FILENO, TCSANOW, &newterm);
- oldfd = fcntl(STDIN_FILENO, F_GETFL, 0);
- fcntl (STDIN_FILENO, F_SETFL, oldfd | O_NONBLOCK);
- c = getchar();
- tcsetattr (STDIN_FILENO, TCSANOW, &oldterm);
- fcntl (STDIN_FILENO, F_SETFL, oldfd);
- if (c != EOF) {
- ungetc(c, stdin);
- result = getchar();
- }
- return result;
- }
- void ShowArray (int lin, int col, int dim1, int dim2, int iArray[lin][col], int iArray_2[dim1][col],int iArray_3[lin][dim2],int indice_l[],int indice_c[]){//cette fonction permet l'affichage du tableau de jeux
- int i,j;
- //ligne supérieur
- move(0, dim2*4);
- addch(ACS_ULCORNER);
- for(i=0 ; i< col-1; i++){
- addch(ACS_HLINE);// -
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_TTEE);// T
- }
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_URCORNER);// coin en heut à droite
- printw("\n");
- for(i = 0 ; i < dim1 ; i++){
- move(i+1, dim2*4);
- for(j = 0 ; j < col ; j++){
- addch(ACS_VLINE);
- if(indice_c[j]==1){
- if(i==0){printw(" v");}//si la ligne/colonne est complété
- else{printw(" ");}
- }else{
- if(iArray_2[i][j] == 0 && i!=0){printw(" ");}
- else{printw("%3d", iArray_2[i][j]);}
- }
- }
- addch(ACS_VLINE);// |
- printw("\n");
- }
- addch(ACS_ULCORNER);// coin en haut à gauche
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- for(i = 0 ; i < lin ; i++){
- if(i!=0){
- addch(ACS_LTEE);// L
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- }
- for(j=1 ; j< dim2 + col ; j++){
- if(j<dim2){
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- }else{
- addch(ACS_PLUS);// +
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- }
- }
- addch(ACS_RTEE);// T vers la droite
- printw("\n");
- addch(ACS_VLINE);
- if(indice_l[i] == 0){
- printw("%3d", iArray_3[i][0]);// %3d 3 éspaces à afficher
- for(j=1 ; j < dim2 ; j++){ //tab aide ligne
- if(iArray_3[i][j] == 0 && j != 0){printw(" ");}
- else{printw(" %3d", iArray_3[i][j]);}
- }
- }else{
- move(2+dim1+i*2, (dim2-1)*4+3);
- printw("v");
- }
- for(j=0 ; j<col ; j++){ //tab jeu
- addch(ACS_VLINE);
- switch(iArray[i][j]){
- case 1:
- printw(" x ");//1 clique
- break;
- case 2:
- addch(ACS_CKBOARD);//2 clique (gros rectangle)
- addch(ACS_CKBOARD);
- addch(ACS_CKBOARD);
- break;
- default:
- printw(" ");//si on clique une 3 ème fois
- break;
- }
- }
- addch(ACS_VLINE);
- printw("\n");
- }
- addch(ACS_LLCORNER);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- for(j=1 ; j< dim2 + col ; j++){
- if(j<dim2){
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- }else{
- addch(ACS_BTEE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- addch(ACS_HLINE);
- }
- }
- addch(ACS_LRCORNER);
- printw("\n");
- }
- void action(int lin, int col, int TABJ[lin][col], int TAB[lin][col], int numl, int numc, int decol, int delin, int indice_l[], int indice_c[]){//permet de modifier le plateau de jeux en même temps que le joueur joue
- int nbcol, nblin, i;
- nbcol = (numc-(decol*4)-2)/4;
- nblin = (numl-(delin+1))/2;
- if(nbcol>=0 && nblin>=0 && nbcol<col && nblin<lin && (numc-(decol*4)-2)%4==0 && (numl-(delin+2))%2==0){
- TABJ[nblin][nbcol] = (TABJ[nblin][nbcol]+1)%3;
- }
- for(i=0; i<col ; i++){
- if(TABJ[nblin][i]==TAB[nblin][i]){indice_l[nblin]=1;}
- else{
- indice_l[nblin]=0;
- break;
- }
- }
- for(i=0; i<lin ; i++){
- if(TABJ[i][nbcol]==TAB[i][nbcol]){indice_c[nbcol]=1;}
- else{
- indice_c[nbcol]=0;
- break;
- }
- }
- }
- int Fin_de_partie(int size, int iArray[]);
- void LANCEMENT_PARTIE(int choix){
- //initiallisation de la partie
- int lin, col;
- char num;
- if(choix == 0){//dimension pour le mode image pré-configuré
- clear();
- printw("choisissez votre image en saisissant la lettre qui convient");
- scanw("%c", &num);
- dimension(num, &lin, &col);
- }else{ //choix des dimensions pour le mode aléatoire
- do{
- clear();
- move(5,2);
- printw("entrez un nombre de ligne (>0) :");
- if(scanw("%d", &lin)!=1){
- endwin();
- printf("input error\n");
- exit(-1);
- }
- }while(lin<=0);
- do{
- clear();
- move(5,2);
- printw("entrez un nombre de colonne (>0) :");
- if(scanw("%d", &col)!=1){
- endwin();
- printf("input error\n");
- exit(-1);
- }
- }while(col<=0);
- }
- int TAB[lin][col];
- if(choix == 0){
- RemplisageImage(num, lin, col, TAB);
- } //mode image
- else{ //mode aléa
- srand(time(NULL));
- alea(lin, col, TAB);
- }
- int i, j, TABJ[lin][col], indice_l[lin], indice_c[col];
- if(col%2 == 0){i = col/2; }
- else{ i = (col/2) +1; }
- int TAB_Gauche[lin][i];
- if(lin%2 == 0){
- j = lin/2; }
- else{
- j = (lin/2) +1; }
- int TAB_Haut[j][col];
- initArray(lin, col, TABJ);//PB
- initArray(lin, i, TAB_Gauche);
- initArray(j, col, TAB_Haut);
- //col_init(lin, col, i, TAB, TAB_Gauche);
- lin_init(lin, col, j, TAB, TAB_Haut);
- initTAB(lin, indice_l);
- initTAB(lin, indice_c);
- //lancement de la partie
- do{
- clear();
- ShowArray(lin, col, j, i, TABJ, TAB_Haut, TAB_Gauche, indice_l, indice_c);
- printw("\n");
- click_souris();
- action(lin, col, TABJ, TAB, L, C, i, j, indice_l, indice_c);
- }while(Fin_de_partie(lin, indice_l) == 0);
- clear();
- move(5,2);
- printw("félicitation vous avez gagné (tapez entrer)");
- scanw("");
- }
- int LANCEMENT_JEU(){
- int i, j, choix=-1;
- char PICROSS;//affichage du jeux
- FILE *FIC;
- FIC = fopen("PICROSS.txt", "r");
- while((PICROSS = fgetc(FIC))!= EOF){
- printw("%c", PICROSS);
- }
- fclose(FIC);
- move(10,0);//mode
- printw("Jouer en mode aléatoire ou a avec une image (il y en a 3 disponibles) ?\n" );
- for(i=0 ; i<2 ; i++){
- addch(ACS_ULCORNER);
- for(j=1 ; j<=9 ; j++){
- addch(ACS_HLINE);
- }
- addch(ACS_URCORNER);
- printw(" ");
- }
- printw("\n");
- addch(ACS_VLINE);
- printw("aléatoire");
- addch(ACS_VLINE);
- printw(" ");
- addch(ACS_VLINE);
- printw("image ");
- addch(ACS_VLINE);
- printw("\n");
- for(i=0 ; i<2 ; i++){
- addch(ACS_LLCORNER);
- for(j=1 ; j<=9 ; j++){
- addch(ACS_HLINE);
- }
- addch(ACS_LRCORNER);
- printw(" ");
- }
- do{
- click_souris();
- if((L<=13) && (L>=11)){
- if(C>=0 && C<=10){
- choix=1;
- }
- else{
- if(C>=15 && C<=25){choix=0;}
- }
- }
- }while(choix == -1);
- return choix;
- }
- int Fin_de_partie(int size, int iArray[]){
- int i;
- for(i=0 ; i<size ; i++){
- if(iArray[i] == 0){
- return 0;
- }
- }
- return 1;
- }
- int main(int argc, char *argv[]) {
- int choix;
- int jouer;
- do{
- ncurses_initialiser(); //Initialisation de ncurses
- ncurses_souris();
- clear();
- choix = LANCEMENT_JEU(); // début du jeux
- LANCEMENT_PARTIE(choix); //Lancement du jeu
- endwin(); // Suspendre la session ncurses et restaurer le terminal
- printf("continuez la partie ? (1 pour oui et 2 pour non)");
- //ffluch(stdin);
- scanf("%d", &jouer);
- }while(jouer ==1);
- printf("\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement