Bonjour !

Je suis ici pour vous demander conseil et aide suite à plusieurs d'arrachage de cheveux sur mon programme
Je vous explique :

J'ai comme projet d'écrire un puissance 4 en C, mais un puissance 4 amélioré avec entre autre :
  • La supression des jetons formant un puissance 4
  • Un score qui comptabilise le nombre de puissance 4 fait par le joueur 1 et 2
  • Et pour seule condition de fin de partie un temps limite (de 3 min par exemple)


Le gros du code semble fonctionner, sauf la gravité qui permet aux jetons de combler les vides quand il y a puissance 4. Je m'explique, quand un puissance 4 est détecté, la gravité fait son travail, mais au tour suivant tout les jetons disparaissent.....

Un peu compliqué à expliquer, mais je vous laisse le code source à votre disposition, en espérant avoir été un peu clair
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#include <stdio.h> //Déclaration des librairies et des constantes
#include <stdlib.h>
#include <time.h>
 
#define LIGNE 7
#define COLONNE 6
 
clock_t tempsDebut, tempsFin;
char grille[COLONNE][LIGNE]; //Innitialisation des variables globales
char X='X';
char O='O';
 
char j1[20]; //Stockage des noms des joueurs
char j2[20];
 
int resultat;
int abscice;
int p;
 
p = 0;  //Mise à zéro de certaines variables globales
abscice = 0;
 
 
void menu(){
    printf("\n *******************************************************\n");
    printf("\n ********** PUISSANCE 4 ********************************\n");
    printf("\n ***********Projet L3DIM *******************************\n");
    printf("\n ***********Milon Cyril ********************************\n");
    printf("\n ***********Version 1.0 ********************************\n");
    printf("\n *******************************************************\n");
 
    printf("Quel est le nom du Joueur 1 ?"); //Les joueurs choisissent leurs noms
    scanf("%s", &j1);       //stockage des noms dans j1
    printf("Et celui du Joueur 2 ?");
    scanf("%s",&j2);        //stockage des noms dans j2
}
 
void affichagegrille(){ //Affichage de la grille
    int i,j;
    printf("| 0 | 1 | 2 | 3 | 4 | 5 | 6 |\n");
    printf("|---|---|---|---|---|---|---|\n");
 
    for(i=0; i<COLONNE; i++){
        printf("|");
 
        for(j=0; j<LIGNE; j++){
            printf(" %c |", grille[j][i]);
        }
 
        printf("\n");
        printf("|---|---|---|---|---|---|---|\n");
    }
 
    printf("| 0 | 1 | 2 | 3 | 4 | 5 | 6 |\n\n\n");
}
 
void remplissage(){ //Remplissage de la grille par des valeurs "nulle"
    int w,n;
    for(w=0; w<LIGNE; w++){
        for(n=0; n<COLONNE; n++){
            grille[w][n]=' ';
        }
    }
}
 
void coup(char joueur[20], char grille[COLONNE][LIGNE]){ //Le joueur doit choisir la colonne dans laquelle il veut jouer
    int resultat;
 
    printf("A %s de jouer! Entrez les coordonnees: ", joueur); //le joueur va choisir la colonne dans laquelle il veut jouer
    printf("\nChoisissez une colonne! => ");
    scanf("%d", &abscice);
 
    while((abscice>6) || (abscice<0)){ //Condition qui vérifie si la colonne choisie par le joueur rentre dans le champs du tableau
        printf("Entrez une colonne correct!\n\n");
        printf("Choisissez une colonne! => ");
        scanf("%d", &abscice);
    }
 
    while((grille[abscice][0]==X) || (grille[abscice][0]==O)){ //Condition pour savoir si la colonne est pleine ou non, sinon le joueur doit en choisir une autre
        printf("La colonne est pleine!\n\n");
        printf("Choisissez une colonne! => ");
        scanf("%d", &abscice);
    }
 
    for(p=5; p>=0; p--){ //systeme de gravité pour déterminer ou le jeton doit être placé
 
        if(grille[abscice][p]==' '){
 
            if(joueur==j1){         //on determine quel joueur est en train de jouer
                grille[abscice][p]=X;
                break;
            }
 
            else{
                grille[abscice][p]=O;
                break;
            }
        }
    }
 
}
 
int gravite(char grille[COLONNE][LIGNE]){   //systeme de gravité quand un p4 est detecté, les jetons du p4 se suprimment et la gravité rentre en compte
    int i,j;
    i = 0;
    j = 0;
 
    for(i=6; i >= 0; i--){
        for(j=5; j >= 0; j--){
            if(grille[i][j]=' ' && (grille[i][j-1]=='X' || grille[i][j-1]=='O')){
                grille[i][j]=grille[i][j-1];
                grille[i][j-1]= ' ';
            }
        }
    }
}
 
int verification(char grille[COLONNE][LIGNE]){  //vérification d'un puissance 4 en testant toute les possibilités
                                                //on connait la derniere position du jeton joué grace aux variables globales "abscice" et "p"
 
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice-1][p]) &&
        (grille [abscice][p] == grille [abscice-2][p]) && (grille [abscice][p] == grille [abscice-3][p]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice-1][p]= ' ';
        grille[abscice-2][p]= ' ';
        grille[abscice-3][p]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice+1][p]) &&
        (grille [abscice][p] == grille [abscice+2][p]) && (grille [abscice][p] == grille [abscice+3][p]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice+1][p]= ' ';
        grille[abscice+2][p]= ' ';
        grille[abscice+3][p]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice][p+1]) &&
        (grille [abscice][p] == grille [abscice][p+2]) && (grille [abscice][p] == grille [abscice][p+3]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice][p+1]= ' ';
        grille[abscice][p+2]= ' ';
        grille[abscice][p+3]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice][p-1]) &&
        (grille [abscice][p] == grille [abscice][p-2]) && (grille [abscice][p] == grille [abscice][p-3]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice][p-1]= ' ';
        grille[abscice][p-2]= ' ';
        grille[abscice][p-3]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice+1][p-1]) &&
        (grille [abscice][p] == grille [abscice+2][p-2]) && (grille [abscice][p] == grille [abscice+3][p-3]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice+1][p-1]= ' ';
        grille[abscice+2][p-2]= ' ';
        grille[abscice+3][p-3]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    if ((grille[abscice][p] != ' ') && (grille [abscice][p] == grille [abscice-1][p+1]) &&
        (grille [abscice][p] == grille [abscice-2][p+2]) && (grille [abscice][p] == grille [abscice-3][p+3]) )
    {
        grille[abscice][p]= ' ';
        grille[abscice-1][p+1]= ' ';
        grille[abscice-2][p+2]= ' ';
        grille[abscice-3][p+3]= ' ';
 
        return 1; /* Fin du jeu */
    }
 
    return 0;   //Le jeu continue
}
 
 
int main(){
 
    int compteur=0, scorej1=0, scorej2=0;   //mise à zéro des variables de comptage et de score
 
    menu();
 
    printf("C'est l'heure du DU DU DU DU DU DUEL!!!!!!\n\n\n\n");
    remplissage();
    affichagegrille();
 
    do{
 
        coup(j1,grille); //le joueur 1 joue son jeton
        affichagegrille();
        compteur++;
        resultat=verification(grille);
 
        if(resultat == 1){      //si la vérification repond par 1 le joueur 1 gagne 4 points
            gravite(grille);
            printf("Bien joue %s! Vous remportez la partie, vous gagnez un cookie !",j1);
            scorej1 = scorej1 + 4;
 
            resultat=0;
            p = 0;
            abscice = 0;
        }
 
        coup(j2,grille);    //le joueur 2 joue son jeton
        affichagegrille(grille);
        compteur++;
        resultat=verification(grille);
 
 
        if(resultat== 1){   //Même chose, le joueur2 gagne 4 points
            gravite(grille);
            printf("Bien joue %s! Vous remportez la partie, vous gagnez une chocolatine !",j2);
            scorej2= scorej2 +4;
 
            resultat=0;
            p = 0;
            abscice = 0;
        }
        //sinon on recommence jusqu'a ce que le tableau soit plein
    }
 
    while(compteur!=42);
 
    if(compteur==42){
        compteur =0;
        char grille[COLONNE][LIGNE] = {{0}};
        return(0);
    }
}
Merci d'avance et bonne journée

Lykette