Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include <time.h>
- #include <windows.h>
- /*TODO: sauvegarde de fichier*/
- typedef struct Level{ //structure qui regroupe les points gagnés, le but de points, le nombre de coups autorisés et le nb de coups utilisés
- char ** tableau[20][40];
- int pointS;
- int pointF;
- int pointP;
- int pointO;
- int pointM;
- int goalS;
- int goalF;
- int goalP;
- int goalO;
- int goalM;
- int allowedMoves;
- int * usedMoves;
- }t_level;
- //tous les éléments musicaux sont dans ce bloc
- int music(int pitch, int length, int time){//renvoie une fréquence (pitch) qui dure une longueur (length) et pause le systeme pendant
- Beep(pitch, length);
- Sleep(time);
- return(0);
- }
- void soundMove(){music(440, 100, 1);}
- void soundSelect(){music(200,100,1);}
- void soundAfterMove(){music(600,100,1);}
- void GameOverSound(){music(375, 500, 0);music(300, 500,0);music(200, 500, 0);}
- void WelcomeSound(){music(200, 500, 0);music(300, 500,0);music(400, 500, 0);}
- void DingSound(){music(700,150,1);}
- void WonSound(){music(300, 400, 0);music(300, 250,0);music(400, 700, 0);}
- //fonction qui va permettre de compter le nombre de points gagnés par fruit/légume
- void verification(char tab[20][40], t_level unNiveau, int point[5]){ //fonction qui va permettre de compter le nombre de points gagnés par fruit/légume
- int a=0; //nous permet de savoir si on a une ligne de 5 ou non
- int i, j, k, l, n=0, m;
- char temp;
- for(i=0;i<20;i++){
- for(j=0;j<40;j++){
- if(tab[i][j]!='.'){
- while(nothingToSuppr(tab)==0){ //boucle infinie qui ne se termine qu'une fois les tests effectués
- //on commence par tester les 5== de suite en ligne et en colonne
- if((tab[i][j]!='.')&&((tab[i][j]==tab[i+1][j] && tab[i][j]==tab[i+2][j] && tab[i][j]==tab[i+3][j] && tab[i][j]==tab[i+4][j]) || (tab[i][j]==tab[i][j+1] && tab[i][j]==tab[i][j+2] && tab[i][j]==tab[i][j+3] && tab[i][j]==tab[i][j+4]))){
- temp=tab[i][j];
- for (k=0;k<20;k++){
- for(l=0;l<40;l++){
- if(tab[k][l]==temp){n++;deleteCase(tab,k,l);} //ici, on cherche toutes les cases du tableau de même lettre que les 5 identiques
- }
- }
- if(temp=='S'){point[0]+=n;}
- if(temp=='F'){point[1]+=n;}
- if(temp=='P'){point[2]+=n;}
- if(temp=='O'){point[3]+=n;}
- if(temp=='M'){point[4]+=n;}
- break; //bien noter la fonction break ici qui permet au while(1) de ne pas tourner à l'infini !
- } //puis les 4== en colonne
- else if((tab[i][j]!='.')&&(tab[i][j]==tab[i+1][j] && tab[i][j]==tab[i+2][j] && tab[i][j]==tab[i+3][j])){
- if(tab[i][j]=='S') {point[0]+=8;}
- if(tab[i][j]=='F') {point[1]+=8;}
- if(tab[i][j]=='P') {point[2]+=8;}
- if(tab[i][j]=='O') {point[3]+=8;}
- if(tab[i][j]=='M') {point[4]+=8;}
- for(m=0;m<4;m++){//on teste sur chaque case si il y en a deux sur les cotés (croix et L)
- if(tab[i+m][j-2]==tab[i+m][j-1] && tab[i+m][j-1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i+m,j-2);deleteCase(tab,i+m,j-1);}
- if(tab[i+m][j-1]==tab[i+m][j+1] && tab[i+m][j-1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i+m,j-1);deleteCase(tab,i+m,j+1);}
- if(tab[i+m][j+1]==tab[i+m][j+2] && tab[i+m][j+1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i+m,j+1);deleteCase(tab,i+m,j+2);}
- }
- deleteCase(tab,i,j);deleteCase(tab,i+1,j);deleteCase(tab,i+2,j);deleteCase(tab,i+3,j);
- break;
- } //maintenant, les 4== en ligne
- else if((tab[i][j]!='.')&&(tab[i][j]==tab[i][j+1] && tab[i][j]==tab[i][j+2] && tab[i][j]==tab[i][j+3])){
- if(tab[i][j]=='S') {point[0]+=8;}
- if(tab[i][j]=='F') {point[1]+=8;}
- if(tab[i][j]=='P') {point[2]+=8;}
- if(tab[i][j]=='O') {point[3]+=8;}
- if(tab[i][j]=='M') {point[4]+=8;}
- for(m=0;m<4;m++){//on teste sur chaque case si il y en a deux sur les cotés (croix et L)
- if(tab[i-2][j+m]==tab[i-1][j+m] && tab[i-1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i-1,j+m);deleteCase(tab,i-2,j+m);}
- if(tab[i-1][j+m]==tab[i+1][j+m] && tab[i+1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i-1,j+m);deleteCase(tab,i+1,j+m);}
- if(tab[i+1][j+m]==tab[i+2][j+m] && tab[i+1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=6;}
- if(tab[i][j]=='F') {point[1]+=6;}
- if(tab[i][j]=='P') {point[2]+=6;}
- if(tab[i][j]=='O') {point[3]+=6;}
- if(tab[i][j]=='M') {point[4]+=6;}
- deleteCase(tab,i+1,j+m);deleteCase(tab,i+2,j+m);}
- }
- deleteCase(tab,i,j);deleteCase(tab,i,j+1);deleteCase(tab,i,j+2);deleteCase(tab,i,j+3);
- break;
- } //et enfin les 3== en colonne
- else if((tab[i][j]!='.')&&(tab[i][j]==tab[i+1][j] && tab[i][j]==tab[i+2][j])){
- if(tab[i][j]=='S') {point[0]+=3;}
- if(tab[i][j]=='F') {point[1]+=3;}
- if(tab[i][j]=='P') {point[2]+=3;}
- if(tab[i][j]=='O') {point[3]+=3;}
- if(tab[i][j]=='M') {point[4]+=3;}
- for(m=0;m<3;m++){//on teste sur chaque case si il y en a deux sur les cotés (croix et L)
- if(tab[i+m][j-2]==tab[i+m][j-1] && tab[i+m][j-1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i+m,j-2);deleteCase(tab,i+m,j-1);}
- if(tab[i+m][j-1]==tab[i+m][j+1] && tab[i+m][j-1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i+m,j-1);deleteCase(tab,i+m,j+1);}
- if(tab[i+m][j+1]==tab[i+m][j+2] && tab[i+m][j+1]==tab[i+m][j]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i+m,j+2);deleteCase(tab,i+m,j+1);}
- }
- deleteCase(tab,i,j);deleteCase(tab,i+1,j);deleteCase(tab,i+2,j);
- break;
- } //au tour des 3== en ligne
- else if((tab[i][j]!='.')&&(tab[i][j]==tab[i][j+1] && tab[i][j]==tab[i][j+2])){
- if(tab[i][j]=='S') {point[0]+=3;}
- if(tab[i][j]=='F') {point[1]+=3;}
- if(tab[i][j]=='P') {point[2]+=3;}
- if(tab[i][j]=='O') {point[3]+=3;}
- if(tab[i][j]=='M') {point[4]+=3;}
- for(m=0;m<3;m++){//on teste sur chaque case si il y en a deux sur les cotés (croix et L)
- if(tab[i-2][j+m]==tab[i-1][j+m] && tab[i-1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i-1,j+m);deleteCase(tab,i-2,j+m);}
- if(tab[i-1][j+m]==tab[i+1][j+m] && tab[i+1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i-1,j+m);deleteCase(tab,i+1,j+m);}
- if(tab[i+1][j+m]==tab[i+2][j+m] && tab[i+1][j+m]==tab[i][j+m]){
- if(tab[i][j]=='S') {point[0]+=9;}
- if(tab[i][j]=='F') {point[1]+=9;}
- if(tab[i][j]=='P') {point[2]+=9;}
- if(tab[i][j]=='O') {point[3]+=9;}
- if(tab[i][j]=='M') {point[4]+=9;}
- deleteCase(tab,i+1,j+m);deleteCase(tab,i+2,j+m);}
- }
- deleteCase(tab,i,j);deleteCase(tab,i,j+1);deleteCase(tab,i,j+2);
- break;
- }
- else break; //dans TOUS les cas, il y aura un break qui permettre de sortir du while(1)
- }//fin de la boucle infinie while(1)
- }
- }
- }
- //affichage des points
- gotoligcol(7,90);color(3,0);printf("\t\t Score : ");color(15,0);
- gotoligcol(9,90);if(point[0]>=unNiveau.goalS){color(0,2);}else{color(2,0);}printf("\t Points S : %d / %d \t\t", point[0], unNiveau.goalS);gotoligcol(9,128);color(15,0);printf("\t\t");
- gotoligcol(10,90);if(point[1]>=unNiveau.goalF){color(0,2);}else{color(2,0);}printf("\t Points F : %d / %d \t\t", point[1], unNiveau.goalF);gotoligcol(10,128);color(15,0);printf("\t\t");
- gotoligcol(11,90);if(point[2]>=unNiveau.goalP){color(0,2);}else{color(2,0);}printf("\t Points P : %d / %d \t\t", point[2], unNiveau.goalP);gotoligcol(11,128);color(15,0);printf("\t\t");
- gotoligcol(12,90);if(point[3]>=unNiveau.goalO){color(0,2);}else{color(2,0);}printf("\t Points O : %d / %d \t\t", point[3], unNiveau.goalO);gotoligcol(12,128);color(15,0);printf("\t\t");
- gotoligcol(13,90);if(point[4]>=unNiveau.goalM){color(0,2);}else{color(2,0);}printf("\t Points M : %d / %d \t\t", point[4], unNiveau.goalM);gotoligcol(13,128);color(15,0);printf("\t\t");
- }
- int ligneDeCinq(char tab[20][40]){ //permet d'utiliser refill au lieu de refill2 lorsqu'on à une suite de 5 lettres (sinon le jeu tourne pendant 10 min...)
- int i, j, a=0;
- for(i=0; i<20; i++){
- for(j=0;j<40;j++){
- if((tab[i][j]==tab[i+1][j] && tab[i][j]==tab[i+2][j] && tab[i][j]==tab[i+3][j] && tab[i][j]==tab[i+4][j]) || (tab[i][j]==tab[i][j+1] && tab[i][j]==tab[i][j+2] && tab[i][j]==tab[i][j+3] && tab[i][j]==tab[i][j+4])){
- a=1;
- }
- }
- }
- return a;
- }
- int nothingToSuppr(char tab[20][40]){//fonction qui vérifie dans un tableau et rend 0 si il y a des séries de 3 lettres identiques, 1 sinon.
- int a = 1; int i, j;
- for(i=0; i<20; i++){
- for(j=0; j<40; j++){
- if((tab[i][j]!='.') && ((tab[i][j]==tab[i+1][j] && tab[i][j]==tab[i+2][j]) || (tab[i][j]==tab[i][j+1] && tab[i][j]==tab[i][j+2]))){a=0;}
- }
- }
- return a;
- }
- void color(int t,int f){//fonction pour la couleur
- HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(H,f*16+t);
- }
- void gotoligcol( int lig, int col){//gotoligcol déplace le curseur à la ligne et colonne voulue
- COORD mycoord;
- mycoord.X = col;
- mycoord.Y = lig;
- SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), mycoord );
- }
- void echangercoo(int lig,int col, int i, int j, char tab[20][40])
- { //permet de changer les coordonnées de deux lettres côte à côte
- char X;
- char temp;
- X=getch();
- switch (X)
- {
- case 's':
- if (lig<40){gotoligcol(lig,col);
- temp=tab[i][j];
- tab[i][j]=tab[i+1][j];
- tab[i+1][j]=temp;
- gotoligcol(0,0);
- affichage(tab);}else{gotoligcol(0,0);affichage(tab);}
- soundAfterMove();
- break;
- case 'a':
- if (col>7){gotoligcol(lig,col);
- temp=tab[i][j];
- tab[i][j]=tab[i][j-1];
- tab[i][j-1]=temp;
- gotoligcol(0,0);
- affichage(tab);}else{gotoligcol(0,0);affichage(tab);}
- soundAfterMove();
- break;
- case 'd':
- if(col<85){gotoligcol(lig,col);
- temp=tab[i][j];
- tab[i][j]=tab[i][j+1];
- tab[i][j+1]=temp;
- gotoligcol(0,0);
- affichage(tab);}else{gotoligcol(0,0);affichage(tab);}
- soundAfterMove();
- break;
- case 'w':
- if (lig>3){gotoligcol(lig,col);
- temp=tab[i][j];
- tab[i][j]=tab[i-1][j];
- tab[i-1][j]=temp;
- gotoligcol(0,0);
- affichage(tab);}else{gotoligcol(0,0);affichage(tab);}
- soundAfterMove();
- break;
- default :
- gotoligcol(0,0);affichage(tab);
- soundAfterMove();
- break;
- }
- }
- void curseur(int lig, int col, char tab[20][40], t_level unNiveau, int lesPoints[5])
- { //déplace uniquement le curseur en appelant gotoligco. Si le joueur appuit sur la touche "ESPACE", alors elle appelle echangercoo
- int nbcoup=unNiveau.allowedMoves;
- gotoligcol(50,4);color(8,0);printf("Appuyez sur 0 pour quitter");color(15,0);
- gotoligcol(4, 90); color(12,0);printf("Coups restants : %d ", nbcoup);color(15,0);
- gotoligcol(7,90);color(3,0);printf("\t\t Score : ");color(15,0);
- gotoligcol(9,90);if(lesPoints[0]>=unNiveau.goalS){color(0,2);}else{color(2,0);}printf("\t Points S : %d / %d \t\t", lesPoints[0], unNiveau.goalS);gotoligcol(9,130);color(15,0);printf("\t\t");
- gotoligcol(10,90);if(lesPoints[1]>=unNiveau.goalF){color(0,2);}else{color(2,0);}printf("\t Points F : %d / %d \t\t", lesPoints[1], unNiveau.goalF);gotoligcol(10,130);color(15,0);printf("\t\t");
- gotoligcol(11,90);if(lesPoints[2]>=unNiveau.goalP){color(0,2);}else{color(2,0);}printf("\t Points P : %d / %d \t\t", lesPoints[2], unNiveau.goalP);gotoligcol(11,130);color(15,0);printf(" \t\t");
- gotoligcol(12,90);if(lesPoints[3]>=unNiveau.goalO){color(0,2);}else{color(2,0);}printf("\t Points O : %d / %d \t\t", lesPoints[3], unNiveau.goalO);gotoligcol(12,130);color(15,0);printf("\t\t");
- gotoligcol(13,90);if(lesPoints[4]>=unNiveau.goalM){color(0,2);}else{color(2,0);}printf("\t Points M : %d / %d \t\t", lesPoints[4], unNiveau.goalM);gotoligcol(13,130);color(15,0);printf("\t\t");
- char choix=getch();
- int i, j;
- i=0; j=0;
- do
- {
- choix=getch();
- switch(choix)
- {
- case 's':
- if(lig<40){lig+=2; i++;}
- gotoligcol(lig,col);
- soundMove();
- break;
- case 'a':
- if(col>7){col-=2; j--;}
- gotoligcol(lig,col);
- soundMove();
- break;
- case 'd':
- if(col<85){col+=2; j++;}
- gotoligcol(lig,col);
- soundMove();
- break;
- case 'w':
- if(lig>3){lig-=2; i--;}
- gotoligcol(lig,col);
- soundMove();
- break;
- case 'p':
- gotoligcol(0,0);printf("Case %d %d : %c \t", i, j, tab[i][j]);
- break;
- case ' ':
- gotoligcol(lig,col);
- soundSelect();
- nbcoup--;
- tab[i][j]+=32;
- if(tab[i][j]=='s'){color(13, 0);}
- if(tab[i][j]=='f'){color(12, 0);}
- if(tab[i][j]=='p'){color(10, 0);}
- if(tab[i][j]=='o'){color(9, 0);}
- if(tab[i][j]=='m'){color(3, 0);}
- printf("%c",tab[i][j]);
- gotoligcol(4, 90); if(nbcoup<6){color(0,12);}else{color(12,0);};printf("Coups restants : %d ", nbcoup);
- color(15, 0);
- echangercoo(lig, col, i,j, tab);
- while(nothingToSuppr(tab)==0){verification(tab,unNiveau,lesPoints);gotoligcol(0,0); affichage(tab);DingSound();Sleep(100);if(ligneDeCinq(tab)==1){refill(tab);}else{refill2(tab);}gotoligcol(0,0);affichage(tab);Sleep(100);
- if(lesPoints[0]>1000 && lesPoints[1]>1000 && lesPoints[2]>1000 && lesPoints[3]>1000 && lesPoints[4]>1000){break;}}
- break;
- case '0' :
- system("cls");
- color(15,0);
- printf("\n\n\n\n\n\n\n\t\t\t\t Au-revoir! \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
- exit(0);
- break;
- default :
- gotoligcol(lig,col);
- break;
- }
- }
- while (nbcoup>0 && !won(unNiveau, lesPoints));
- if(nbcoup==0){//animation GAME OVER
- waitFor(3);system("cls");
- printf("\n\n\t\t\tVous n'avez plus de coups!");
- color(12,0);
- printf("\n\n\n"
- "\n\t ________ ________ \n"
- "\t / _____/_____ _____ ____ \\_____ \\___ __ ___________ \n"
- "\t/ \\ ___\\__ \\ / \\_/ __ \\ / | \\ \\/ // __ \\_ __ \\ \n"
- "\t\\ \\_\\ \\/ __ \\| Y Y \\ ___/ / | \\ /\\ ___/| | \\/ \n"
- "\t \\______ (____ /__|_| /\\___ > \\_______ /\\_/ \\___ >__| \n"
- "\t \\/ \\/ \\/ \\/ \\/ \\/ ");
- color(15,0);
- GameOverSound();
- getch();
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- }
- if(won(unNiveau, lesPoints)){//animation GAME WON
- int i;
- WonSound();
- for(i=0; i<30;i++){
- system("cls");
- int laCouleur = (i%9)+1;
- Sleep(50);
- color(laCouleur,0);
- gotoligcol(15,30);printf("Y88b d88P .d88888b. 888 888 888 888 .d88888b. 888b 888 \n");
- gotoligcol(16,30);printf(" Y88b d88P d88P' 'Y88b 888 888 888 o 888 d88P' 'Y88b 8888b 888 \n");
- gotoligcol(17,30);printf(" Y88o88P 888 888 888 888 888 d8b 888 888 888 88888b 888 \n");
- gotoligcol(18,30);printf(" Y888P 888 888 888 888 888 d888b 888 888 888 888Y88b 888 \n");
- gotoligcol(19,30);printf(" 888 888 888 888 888 888d88888b888 888 888 888 Y88b888 \n");
- gotoligcol(20,30);printf(" 888 888 888 888 888 88888P Y88888 888 888 888 Y88888 \n");
- gotoligcol(21,30);printf(" 888 Y88b. .d88P Y88b. .d88P 8888P Y8888 Y88b. .d88P 888 Y8888 \n");
- gotoligcol(22,30);printf(" 888 'Y88888P' 'Y88888P' 888P Y888 'Y88888P' 888 Y888 \n");
- Sleep(50);
- }
- color(12,0);gotoligcol(28,37); printf("Voulez vous enregistrer votre magnifique victoire? Y: oui N : non\n\n\n");color(15,0);
- }
- }
- int won(t_level unNiveau, int lesPoints[5]){//fonction qui teste si le niveau est gagné
- if(lesPoints[0]>=unNiveau.goalS && lesPoints[1]>=unNiveau.goalF && lesPoints[2]>=unNiveau.goalP && lesPoints[3]>=unNiveau.goalO &&lesPoints[4]>=unNiveau.goalM){return 1;}
- else {return 0;}
- }
- void waitFor (unsigned int secs) { //fonction qui pause
- unsigned int retTime;
- retTime = time(0) + secs; // Get finishing time.
- while (time(0) < retTime); // Loop until it arrives.
- }
- void deleteCase(char tab[20][40], int i, int j){ //supprime une case en la remplacant par un '.'
- tab[i][j]='.';
- }
- void supprimer(char tab[20][40]){ //si cette fonction détecte 3 lettres de suite en ligne ou colonne, elle les supprime. Cette fonction est utilisée lors de la création du tableau uniquement
- int i, j;
- for(i=0; i<20; i++){
- for(j=0; j<40; j++){
- if((tab[i][j]==tab[i-1][j] && tab[i][j]==tab[i-2][j])){deleteCase(tab, i, j);deleteCase(tab, i-1, j);deleteCase(tab, i-2, j);}
- if(tab[i][j]==tab[i][j-1] && tab[i][j]==tab[i][j-2]){deleteCase(tab, i, j); deleteCase(tab, i, j-1); deleteCase(tab, i, j-2);}
- }
- }
- }
- void fillCase(char tab[20][40], int i, int j){ //remplit une case
- //ici on prend une case particuliere et on utilise rand() pour lui donner aléatoirement une valeur
- //la fonction rand() a pris comme paramètre le temps dans la fonction fillTab pour que les suites de valeurs soient "réellement" aléatoires
- int variable = rand()%5;
- if(variable==0){tab[i][j]='S';}
- if(variable==1){tab[i][j]='F';}
- if(variable==2){tab[i][j]='P';}
- if(variable==3){tab[i][j]='O';}
- if(variable==4){tab[i][j]='M';}
- }
- void affichage(char tab[20][40]){ //affiche le tableau
- //affichage basique d'un tableau
- int i, j;
- printf("\n\n");
- for(i=0; i<20; i++ ){
- printf("\n ");
- for(j=0; j<40; j++){
- if((tab[i][j]>='a') && (tab[i][j]<='z')){tab[i][j]-=32;}
- if(tab[i][j]=='S'){color(13, 0);}
- if(tab[i][j]=='F'){color(12, 0);}
- if(tab[i][j]=='P'){color(10, 0);}
- if(tab[i][j]=='O'){color(9, 0);}
- if(tab[i][j]=='M'){color(3, 0);}
- printf("%c ", tab[i][j]);
- color(15,0);
- }
- printf("\n");
- }
- }
- void fillTab(char tab[20][40]){ //parcourt le tableau et rempli les cases une par une, en appelant fillCase
- int i, j;
- for(i=0; i<20; i++){
- for(j=0; j<40; j++){
- fillCase(tab, i, j);
- }
- }
- }
- int thereIsEmpty(char tab[20][40]){ //si une case est supprimée, vérifie que celles d'au dessus sont supprimée aussi
- int i, j, k;
- int alors = 0;
- for(i=0; i<20; i++){
- for(j=0;j<40;j++){
- if(tab[i][j]=='.'){
- for(k=i-1; k>=0; k--){
- if(tab[k][j]!='.'){alors = 1;}
- }
- }
- }
- }
- return alors;
- }
- void refill2(char tab[20][40]){ //refill2 est la même fonction que refill mais elle note un temps de pause avant de faire descendre les lettres
- int i, j;
- char temp;
- while(thereIsEmpty(tab)){
- for(i=1; i<20; i++){
- for(j=0; j<40; j++){
- if(tab[i][j]=='.'){
- temp=tab[i][j];
- tab[i][j]=tab[i-1][j];
- tab[i-1][j]=temp;
- Sleep(1);
- gotoligcol(0,0);affichage(tab);
- }
- }
- }
- }
- for(i=0; i< 20; i++){
- for(j=0;j<40; j++){
- if(tab[i][j]!='S' && tab[i][j]!='F' && tab[i][j]!='P' && tab[i][j]!='O' && tab[i][j]!='M'){fillCase(tab, i, j);}
- }
- }
- }
- void refill(char tab[20][40]){ //elle remplit instantanément, sans marquer de pause. Utilisée pour la création du tableau et pour le cas des 5 lettres de suite
- int i, j;
- char temp;
- while(thereIsEmpty(tab)){
- for(i=1; i<20; i++){
- for(j=0; j<40; j++){
- if(tab[i][j]=='.'){
- temp=tab[i][j];
- tab[i][j]=tab[i-1][j];
- tab[i-1][j]=temp;
- }
- }
- }
- }
- for(i=0; i< 20; i++){
- for(j=0;j<40; j++){
- if(tab[i][j]!='S' && tab[i][j]!='F' && tab[i][j]!='P' && tab[i][j]!='O' && tab[i][j]!='M'){fillCase(tab, i, j);}
- }
- }
- }
- int isClean(char tab[20][40]){ //renvoie 0 si y'a quelque chose à supprimer.
- /*noter que les deux fonctions isClean et clean ne cherchent que des combinaisons à 3 lettres puisqu'elles ne servent qu'a préparer la matrice "en fond"
- avant de commencer à jouer */
- int isIt = 0;
- int i, j;
- for(i=0; i<20; i++){
- for(j=0; j<40; j++){
- if((tab[i][j]==tab[i-1][j] && tab[i][j]==tab[i-2][j])){isIt=1;}
- if(tab[i][j]==tab[i][j-1] && tab[i][j]==tab[i][j-2]){isIt=1;}
- }
- }
- return isIt;
- }
- void clean(char tab[20][40]){ //"nettoie" le tableau tant qu'il y a quelque chose à supprimer
- while(isClean(tab)){
- supprimer(tab);
- refill(tab);
- }
- }
- void play(t_level unNiveau){ //
- int lesPoints[5] = {0,0,0,0,0}; //on va se servir de ce tableau pour compter les points
- affichage(unNiveau.tableau);
- curseur(3, 7, unNiveau.tableau, unNiveau, lesPoints); //on place le curseur sur la ligne 3, colonne 7 (premiere case du tableau)
- }
- void menu(t_level niveau1, t_level niveau2){
- char choix;
- color(11,0);
- gotoligcol(5,30); printf("888b d888 8888888888 888b 888 888 888 ");
- gotoligcol(6,30); printf("8888b d8888 888 8888b 888 888 888 ");
- gotoligcol(7,30); printf("88888b.d88888 888 88888b 888 888 888 ");
- gotoligcol(8,30); printf("888Y88888P888 8888888 888Y88b 888 888 888 ");
- gotoligcol(9,30); printf("888 Y888P 888 888 888 Y88b888 888 888 ");
- gotoligcol(10,30);printf("888 Y8P 888 888 888 Y88888 888 888 ");
- gotoligcol(11,30);printf("888 ^ 888 888 888 Y8888 Y88b. .d88P ");
- gotoligcol(12,30);printf("888 888 8888888888 888 Y888 ^Y88888P^ ");
- color(15,0);
- gotoligcol(15,20);color(2,0);printf("******* 1. Niveau 1 : 10 fraises, 20 oignons et 10 mandarines en 40 coups");
- gotoligcol(17,20);printf("******* 2. Niveau 2 : 25 soleils, 15 pommes, 10 fraises et 15 oignons en 50 coups");
- gotoligcol(19,20);printf("******* 3. Voir les meilleurs scores");
- gotoligcol(21,20);printf("******* 4. Afficher les regles");
- gotoligcol(23,20);color(8,0); printf("******* 0. Quitter");
- printf("\n\n \t");
- choix = getch();
- color(15,0);
- switch(choix){
- case '1' :
- system("cls");
- play(niveau1);
- break;
- case '2' :
- system("cls");
- play(niveau2);
- break;
- case '3' :
- printf("\n option pas encore accessible");
- break;
- case '4' :
- system("cls");
- color(12, 0);
- printf("\n\n \t Regles du jeu :");
- color(15,0);
- printf("\n\n \t\t 2 : Aller vers le bas \n \t\t 4 : Aller vers la gauche \n \t\t 6 : Aller vers la droite \n \t\t 8 : Aller vers le haut");
- printf("\n\n \t\t La touche espace selectionne un element du tableau et vous pouvez alors le deplacer en utilisant les touches 2, 4, 6 et 8.");
- printf("\n\n \t\t Dans chaque niveau vous devez atteindre un certain nombre de points fruits en un nombre limité de coups.");
- printf("\n\n \t\t Vous obtenez des points en creant des combinaisons d'au moins 3 memes fruits, des croix ou des L. \n \t\t Faire une suite de 5 fruits supprime tous les fruits du meme type sur le terrain.");
- color(12,0);printf("\n\n \t\t\t Points FRAISE : F");
- color(13,0);printf("\n\n \t\t\t Points SOLEIL : S");
- color(10,0);printf("\n\n \t\t\t Points POMME : P");
- color(9,0);printf("\n\n \t\t\t Points OIGON : O");
- color(3,0);printf("\n\n \t\t\t Points MANDARINE : M");
- color(4,0);
- printf("\n\n");
- printf("\n \t\t Appuyez sur une touche pour revenir au menu.");
- color(15,0);
- getch();
- system("cls");
- menu(niveau1, niveau2);
- break;
- case '0' :
- printf("\n\n \t\tAu-revoir! \n\n");
- break;
- default : color(12,0);printf("\n\t\tCommande invalide.");
- menu(niveau1, niveau2);
- break;
- }
- }
- int main()
- {
- srand((unsigned)time(NULL));
- t_level niveau1, niveau2;
- {//mise en place des niveaux
- fillTab(niveau1.tableau);clean(niveau1.tableau);niveau1.allowedMoves=40;niveau1.goalS=0;niveau1.goalF=10;niveau1.goalP=0;niveau1.goalO=20;niveau1.goalM=10;niveau1.pointF=0;niveau1.pointM=0;niveau1.pointO=0;niveau1.pointP=0;niveau1.pointS=0; //mise en place du niveau1
- fillTab(niveau2.tableau);clean(niveau2.tableau);niveau2.allowedMoves=50;niveau2.goalS=25;niveau2.goalF=10;niveau2.goalP=15;niveau2.goalO=15;niveau2.goalM=0;niveau2.pointF=0;niveau2.pointM=0;niveau2.pointO=0;niveau2.pointP=0;niveau2.pointS=0;} //mise en place du niveau2
- printf("\n\n \t\t\t\t Bienvenue sur \n\n");
- color(11, 0);
- printf("\n\n\t\t8888888b. 888 d8888 888b 888 88888888888 d8888 888b d888 8888888 8888888888P "
- "\n\n\t\t888 Y88b 888 d88888 8888b 888 888 d88888 8888b d8888 888 d88P "
- "\n\n\t\t888 888 888 d88P888 88888b 888 888 d88P888 88888b.d88888 888 d88P "
- "\n\n\t\t888 d88P 888 d88P 888 888Y88b 888 888 d88P 888 888Y88888P888 888 d88P "
- "\n\n\t\t8888888PP 888 d88P 888 888 Y88b888 888 d88P 888 888 Y888P 888 888 d88P "
- "\n\n\t\t888 888 d88P 888 888 Y88888 888 d88P 888 888 Y8P 888 888 d88P "
- "\n\n\t\t888 888 d8888888888 888 Y8888 888 d8888888888 888 888 888 d88P "
- "\n\n\t\t888 88888888 d88P 888 888 Y888 888 d88P 888 888 888 8888888 d8888888888 \n\n");
- color(2,0); printf("\n\n\t\t\t\t\t Un jeu ecrit par Axel Cante, Mohammed Mahfoud et Emilien Boucaud.");
- color(12, 0);
- printf("\n\n\t\t\t\t Appuyez sur une touche pour jouer"); color(15,0);
- WelcomeSound();
- getch();
- system("cls");
- menu(niveau1, niveau2);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement