IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Bug puissance 4 en C (version améliorée)


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 1
    Points : 4
    Points
    4
    Par défaut Bug puissance 4 en C (version améliorée)
    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

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour et bienvenue,

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    char grille[COLONNE][LIGNE]; //Innitialisation des variables globales

    D'une manière générale, il faudra éviter les variables globales dans tes programme à l'avenir, mais pour le moment, elles sont bien pratiques.

    Par contre, tu sembles dimensionner ton tableau dans l'ordre « COLONNE puis LIGNE » quand tu le déclares en tête de programme et dans tes prototypes de fonction alors que tu l'indexes dans l'autre sens partout où tu utilises des boucles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0; i<COLONNE; i++){
    printf("|");
     
    for(j=0; j<LIGNE; j++){
    printf(" %c |", grille[j][i]);
    … comme le produit des entiers est commutatif et que les éléments d'un tableau en C sont consécutifs en mémoire, tu restes toujours à l'intérieur des limites de ton tableau et le programme ne plante pas, même si tu dépasses les limites d'une des dimensions sans t'en rendre compte. Ça reste un bug qu'il faudra corriger parce que si tu trompes une fois dans une de tes boucles, tes pions vont commencer à se mélanger le long de la diagonale de ta grille de jeu. Ce serait vrai également même si tu avais tout fait dans l'ordre dès le départ mais le moins que l'on puisse dire, c'est que tes déclarations induisent en erreur si jamais tu dois étendre ton programme par la suite.

    Ensutie :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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]= ' ';
                        }
                }
        }

    Tu utilises des constantes dans tes boucles, qui auraient dû être remplacées par « COLONNE » et « LIGNE ». Si tu modifies ces constantes en tête de programme (et c'est à cela qu'elles servent), ton programme ne vas plus fonctionner correctement.

    Par ailleurs, tu as eu la bonne idée de remonter de bas en haut, ce qui est effectivement ce qu'il faut faire mais tu remontes jusqu'à la toute première ligne, numérotée 0, alors que tu références les lignes j et j-1. À la dernière passe, tu sors donc du tableau en provoquant soit une segfault, soit l'écrasement des variables à côté ou du cadre de pile.

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/01/2011, 17h38
  2. Otroc.fr nouvelle version amélioré
    Par lonyc dans le forum Mon site
    Réponses: 1
    Dernier message: 25/06/2010, 21h55
  3. Bug HTTP 400 dans la version 6.0.20
    Par buzuck dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 04/05/2010, 19h22
  4. Réponses: 0
    Dernier message: 09/05/2009, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo