Langage C-morpion
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Langage C-morpion



  1. #1
    invite54cf936c

    Langage C-morpion


    ------

    Bonjour !
    Je suis en premier année en école d'ingénieur, et nous devons réaliser un morpion en langage C à l'aide du logiciel code blocks.
    Mon programme semble fini, compile, mais ne marche pas !
    Il s'arrête à différents endroits...
    Que faire ?
    Code:
    //TP5-6
    //24/11/2009
    //Céline THIS
    //Programme : morpion
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define DIM 5
    
    
    //---------------------------déclaration des types structurés------------------------
    
      struct joueur {//définition de la structure contenant le nom et la marque de chaque joueur
            char nom[25];
            char marque;
        };
        typedef struct joueur s_joueur;
    
    
        struct cellule {//définition de la structure représentant chaque case du tableau, contenant 2 marques : case libre ou non, case piégée ou non
            int permutation;//si=1 : piège, si=0 : affichage de la marque du joueur
            int libre;//si=-1 : cellule libre
        };
        typedef struct cellule s_cellule ;
    
    
    
        //---------------------------déclaration des sous-programmes-----------------
    
        void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[]);
        void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int joueur, int permutation);
        int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM]);
        void Changement_joueur(int joueur,int resultat,int libre);
    
        //-----------------------------programme principal----------------------------
    
        int main()
    {
        int cases_vides_restantes=25;
        int joueur=0;
        int libre;
        int alignement_par_colonne=0;
        int alignement_par_ligne=0;
        int permutation;
        int ligne,colonne;
        int resultat;
    
        s_joueur tab_j[2];
         s_cellule grille[DIM][DIM]=
            {{{0,-1},{0,-1},{0,-1},{0,-1},{1,-1}},
            {{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
            {{0,-1},{0,-1},{1,-1},{0,-1},{0,-1}},
            {{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
            {{1,-1},{0,-1},{0,-1},{0,-1},{0,-1}}};
    
    
        printf("BIENVENUE SUR LE MORPION PIEGE\n\n\nLE PREMIER QUI ALIGNE 3 PIONS HORIZONTALEMENT OU VERTICALEMENT A GAGNE !!!\n\n\nATTENTION : Certaines cases transformeront le pion joue en pion adverse.\n\n");
        printf("Entrez le nom du joueur 1 : ");
        scanf("%s",tab_j[0].nom);
        printf("Entrez la marque du joueur 1 : ");
        scanf("%s",&tab_j[0].marque);
    
        printf("Entrez le nom du joueur 2 : ");
        scanf("%s",tab_j[1].nom);
        printf("Entrez la marque du joueur 2 : ");
        scanf("%s",&tab_j[1].marque);
    
        Affichage_grille (grille,tab_j);
    
        do
            { Pose_pion (tab_j,grille,joueur,permutation);
              printf("GNiark");
              Affichage_grille (grille,tab_j);
              cases_vides_restantes--;
              printf("GNiark2");
              Verification_fin(ligne,colonne,grille);
              printf("GNiark3");
              Changement_joueur(joueur, resultat, libre);
            }
    
        while(resultat==0&&cases_vides_restantes!=0);
    
    
        return 0;
    }
    
    
    void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int permutation, int joueur)
    {
        int ligne, colonne;
        int j;
    
    
            j=joueur;
            printf ("C'est a %s de jouer.\n", tab_j[j].nom);
            printf ("Entrer la ligne : ");
            scanf("%d",&ligne);
            ligne=ligne-1;
            printf("Entrer la colonne : ");
            scanf("%d",&colonne);
            colonne=colonne-1;
    
            if (permutation==0)
                    printf("_%c_|",tab_j[j].marque);
            if (permutation==1)
                    printf("_%c_|",tab_j[j+1].marque);
    
    
    
    }
    
    
    
    void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[])
    {
    int ligne,colonne;
    
           for(ligne=0;ligne<DIM;ligne++)
            {   printf("\n");
                for(colonne=0;colonne<DIM;colonne++)
                {if(tab[ligne][colonne].libre==-1)
                    {printf("_%c_|",tab_j[tab[ligne][colonne].libre].marque);
                    }
                printf("  |");
                }
            }
    
             printf("\n");
    }
    
    
    
    
    
    
    int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM])
    {
    
        int resultat=0;
    
    
        if ((tab[ligne-1][0].libre==tab[ligne-1][1].libre)&&(tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre!=-1))
            resultat=1;
    
         if ((tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre!=-1))
            resultat=1;
    
         if ((tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre==tab[ligne-1][4].libre)&&(tab[ligne-1][4].libre!=-1))
            resultat=1;
    
        if ((tab[0][colonne-1].libre==tab[1][colonne-1].libre)&&(tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre!=-1))
            resultat=1;
    
        if ((tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre!=-1))
            resultat=1;
    
        if ((tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre==tab[4][colonne-1].libre)&&(tab[4][colonne-1].libre!=-1))
            resultat=1;
    
    
        return resultat;
    
    }
    
    
    void Changement_joueur(int joueur,int resultat,int libre)
    {
        if (resultat==0&&libre==0)
            {
                if (joueur==0)
                    joueur==1;
                else
                    joueur==0;
    
    
            }
    
     }

    -----
    Dernière modification par yoda1234 ; 07/01/2010 à 17h01.

  2. #2
    Coincoin

    Re : Langage C-morpion

    Salut,
    Il s'arrête à différents endroits...
    Comment ? Où ?
    Encore une victoire de Canard !

  3. #3
    invite54cf936c

    Re : Langage C-morpion

    Il n'affiche pas le nom du joueur qui doit jouer, affiche la grille mais sans la marque du joueur qui vient de jouer... :/
    Et l'exécution s'arrête dans la boucle do while, juste avant l'exécution du sous programme "vérification_fin"

  4. #4
    PA5CAL

    Re : Langage C-morpion

    Bonjour

    Le sujet aurait plutôt sa place dans la rubrique informatique. Ici, c'est le forum électronique. Par ailleurs, afin que le code garde un semblant de lisibilité, il faut l'inclure dans le message à l'aides des balises [CODE] (bouton "#" au-dessus de la zone d'édition).
    Citation Envoyé par ceeline Voir le message
    Il n'affiche pas le nom du joueur qui doit jouer,
    Peut-être est-ce dû au fait que la saisie de l'information "marque" est erronée (il s'agit d'un simple caractère, et non d'une chaîne à zéro terminal) et écrase les données de la pile (je n'ai pas le même compilateur, alors je ne peux pas reproduire le problème et je vois le nom du joueur chez moi, mais je pense que ça vient de là).

    Citation Envoyé par ceeline Voir le message
    affiche la grille mais sans la marque du joueur qui vient de jouer... :/
    D'un autre côté, je ne vois pas que la grille a été modifiée après que le joueur a joué.
    Citation Envoyé par ceeline Voir le message
    Et l'exécution s'arrête dans la boucle do while, juste avant l'exécution du sous programme "vérification_fin"
    Chez moi, le programme quitte normalement la boucle do...while parce que la variable n'a été initialisée nulle part, et contient la même valeur non nulle depuis le départ.


    Je pense qu'il va falloir revoir les cours de langages C...

  5. A voir en vidéo sur Futura
  6. #5
    Seb.26

    Re : Langage C-morpion

    Je me permet de remettre ton code en forme :
    ( comme disais PASCAL5, utilise la balise [C0DE] : c'est le bouton avec le # )

    Code:
    //TP5-6
    //24/11/2009
    //Céline THIS
    //Programme : morpion
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define DIM 5
    
    
    //---------------------------déclaration des types structurés------------------------
    
    struct joueur {//définition de la structure contenant le nom et la marque de chaque joueur
    char nom[25];
    char marque;
    };
    typedef struct joueur s_joueur;
    
    struct cellule {//définition de la structure représentant chaque case du tableau, contenant 2 marques : case libre ou non, case piégée ou non
    int permutation;//si=1 : piège, si=0 : affichage de la marque du joueur
    int libre;//si=-1 : cellule libre
    };
    typedef struct cellule s_cellule ;
    
    
    
    //---------------------------déclaration des sous-programmes-----------------
    
    void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[]);
    void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int joueur, int permutation);
    int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM]);
    void Changement_joueur(int joueur,int resultat,int libre);
    
    //-----------------------------programme principal----------------------------
    
    int main()
    {
    int cases_vides_restantes=25;
    int joueur=0;
    int libre;
    int alignement_par_colonne=0;
    int alignement_par_ligne=0;
    int permutation;
    int ligne,colonne;
    int resultat;
    
    s_joueur tab_j[2];
    s_cellule grille[DIM][DIM]=
    {{{0,-1},{0,-1},{0,-1},{0,-1},{1,-1}},
    {{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
    {{0,-1},{0,-1},{1,-1},{0,-1},{0,-1}},
    {{0,-1},{0,-1},{0,-1},{0,-1},{0,-1}},
    {{1,-1},{0,-1},{0,-1},{0,-1},{0,-1}}};
    
    
    printf("BIENVENUE SUR LE MORPION PIEGE\n\n\nLE PREMIER QUI ALIGNE 3 PIONS HORIZONTALEMENT OU VERTICALEMENT A GAGNE !!!\n\n\nATTENTION : Certaines cases transformeront le pion joue en pion adverse.\n\n");
    printf("Entrez le nom du joueur 1 : ");
    scanf("%s",tab_j[0].nom);
    printf("Entrez la marque du joueur 1 : ");
    scanf("%s",&tab_j[0].marque);
    
    printf("Entrez le nom du joueur 2 : ");
    scanf("%s",tab_j[1].nom);
    printf("Entrez la marque du joueur 2 : ");
    scanf("%s",&tab_j[1].marque);
    
    Affichage_grille (grille,tab_j);
    
    do
    { Pose_pion (tab_j,grille,joueur,permutati on);
    printf("GNiark");
    Affichage_grille (grille,tab_j);
    cases_vides_restantes--;
    printf("GNiark2");
    Verification_fin(ligne,colonne ,grille);
    printf("GNiark3");
    Changement_joueur(joueur, resultat, libre);
    }
    
    while(resultat==0&&cases_vides _restantes!=0);
    
    
    return 0;
    }
    
    
    void Pose_pion (s_joueur tab_j[],s_cellule tab[DIM][DIM],int permutation, int joueur)
    {
    int ligne, colonne;
    int j;
    
    
    j=joueur;
    printf ("C'est a %s de jouer.\n", tab_j[j].nom);
    printf ("Entrer la ligne : ");
    scanf("%d",&ligne);
    ligne=ligne-1;
    printf("Entrer la colonne : ");
    scanf("%d",&colonne);
    colonne=colonne-1;
    
    if (permutation==0)
    printf("_%c_|",tab_j[j].marque);
    if (permutation==1)
    printf("_%c_|",tab_j[j+1].marque);
    
    
    
    }
    
    
    
    void Affichage_grille (s_cellule tab[DIM][DIM],s_joueur tab_j[])
    {
    int ligne,colonne;
    
    for(ligne=0;ligne<DIM;ligne++)
    { printf("\n");
    for(colonne=0;colonne<DIM;colo nne++)
    {if(tab[ligne][colonne].libre==-1)
    {printf("_%c_|",tab_j[tab[ligne][colonne].libre].marque);
    }
    printf(" |");
    }
    }
    
    printf("\n");
    }
    
    
    
    
    
    
    int Verification_fin(int ligne,int colonne,s_cellule tab[DIM][DIM])
    {
    
    int resultat=0;
    
    
    if ((tab[ligne-1][0].libre==tab[ligne-1][1].libre)&&(tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre!=-1))
    resultat=1;
    
    if ((tab[ligne-1][1].libre==tab[ligne-1][2].libre)&&(tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre!=-1))
    resultat=1;
    
    if ((tab[ligne-1][2].libre==tab[ligne-1][3].libre)&&(tab[ligne-1][3].libre==tab[ligne-1][4].libre)&&(tab[ligne-1][4].libre!=-1))
    resultat=1;
    
    if ((tab[0][colonne-1].libre==tab[1][colonne-1].libre)&&(tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre!=-1))
    resultat=1;
    
    if ((tab[1][colonne-1].libre==tab[2][colonne-1].libre)&&(tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre!=-1))
    resultat=1;
    
    if ((tab[2][colonne-1].libre==tab[3][colonne-1].libre)&&(tab[3][colonne-1].libre==tab[4][colonne-1].libre)&&(tab[4][colonne-1].libre!=-1))
    resultat=1;
    
    
    return resultat;
    
    }
    
    
    void Changement_joueur(int joueur,int resultat,int libre)
    {
    if (resultat==0&&libre==0)
    {
    if (joueur==0)
    joueur==1;
    else
    joueur==0;
    
    
    }
    
    }
    * ensuite, un peu de lecture :
    http://xrenault.developpez.com/tutoriels/c/scanf/

    * de plus :
    > Où écris tu le pion dans ton tableau ? (voir Pose_pion )
    > On ne gagne pas en alignant sur les diagonales ?
    > Pourquoi pas simplement un 'X' et un 'O' pour les pions des joueurs ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. #6
    freepicbasic

    Re : Langage C-morpion

    if (joueur==0)
    joueur==1;
    else
    joueur==0;

    le == est une comparaison booléenne
    joueur=1; est une assignation


    pose_pion
    le paramètre tab n'est jamais utilisé pourquoi?

    des variables pas initialisées
    permutation
    ligne
    colonne
    resultat
    libre

    ça c'est bloquant, comment les variables changent elles ?
    while(resultat==0 && cases_vides _restantes!=0);


    alignement_par_ligne n'est pas utilisé
    alignement_par_colonne n'est pas utilisé
    A+, pat

  8. #7
    Seb.26

    Re : Langage C-morpion

    Citation Envoyé par freepicbasic Voir le message
    if (joueur==0)
    joueur==1;
    else
    joueur==0;

    le == est une comparaison booléenne
    joueur=1; est une assignation
    De plus, 'joueur' est un paramètre passé par valeur à la fonction ... donc une variable locale ... ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. #8
    freepicbasic

    Post Re : Langage C-morpion

    Citation Envoyé par Seb.26 Voir le message
    De plus, 'joueur' est un paramètre passé par valeur à la fonction ... donc une variable locale ... ...
    Bien vu !
    J'ai pas vérifier le contenu non plus , faudrait corriger tout ça avant...


    Code:
    void Changement_joueur(int *joueur,int resultat,int libre)
    {
    if ( resultat==0 && libre==0)
    {
          if (*joueur==0)
               *joueur=1;
          else
              *joueur==0;
    }
    appeller en mettant &joueur

    notez bien que
    *joueur ^= 1 ; /* remplaçait les 5 lignes */

    Code:
    void Changement_joueur(int *joueur,int resultat,int libre)
    {
       if ( (resultat + libre)==0) *joueur ^= 1 ;
    }
    A+, pat

  10. #9
    Jack
    Modérateur

    Re : Langage C-morpion

    Sujet déplacé d'élec en info

Discussions similaires

  1. de langage C en langage assembleur
    Par invite284746c1 dans le forum Électronique
    Réponses: 1
    Dernier message: 14/05/2009, 12h42
  2. Langage C
    Par invited92bca68 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 16/11/2008, 13h33
  3. Langage C
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 14/02/2007, 19h47
  4. langage c
    Par invite131aec15 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 31/08/2006, 21h38
Découvrez nos comparatifs produits sur l'informatique et les technologies.