Gomoku (morpion revisité) code C

Fermé
jauneam Messages postés 2 Date d'inscription vendredi 6 avril 2018 Statut Membre Dernière intervention 17 avril 2018 - Modifié le 6 avril 2018 à 09:52
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 17 avril 2018 à 18:26
bonjour je suis en ecole d'ingé et je commence à programmer en C.
on doit créer un morpion etj'ai un premier tableau qui affiche le damier et on cherche à superposer un autre plateau pour afficher les points pouvez vous m'aider?
voici mon code !
la tableau est de 11X11



Version 1.0


*
**
***
****
*****
******
*******
********
*********
**********
***********
************
*************
**************
***************
****************/

// LIBRAIRIES
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Couleur
#include <windows.h>  // Fonctions avancées
#define Regle "./regles_du_jeu.txt" //Définition constante pour fichier règles du jeu
#define Credit "./A_propos.txt" //Constante pour fichier A propos


/** HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);     <=A METTRE AU DBT DE CHAQUE SOUS PROGRAGRAMME   **/ // HANDLE : fenetre sous windows


// PARAMETRES

#define C 11 // Nombre de lignes et de colonnes sur le plateau
/*#define Regles "./regles_gomoku.txt"
  #define Credits "./credits" */

// DEFINITION STRUCTURES

typedef struct plateau {
            int nbligne;
            int nbcolonne;
             char terrain [C][C];
                } plateau;



// DECLARATION DES SOUS-PROGRAMMES

int Regles();
int Credits();
int affichage(struct plateau * gomoku);
int affichage_init(struct plateau * gomoku);
int affichage_pl(struct plateau *gomoku);

int main()
{
    int quitter=0;
    plateau gomoku; //plateau fixe
    plateau mobile; //plateau modifié entre chaque coup

    //initialisation ecran
    SetConsoleOutputCP(1252); //affiche les accents
    HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
    system("cls");



/******************************************** MENU PRINCIPAL ********************************************/

int choix;
printf("\n\nBienvenue sur notre jeu de qualité : le Gomoku\nQue voulez-vous faire ?\n\n");
printf("Choisir une option :\n");
printf("1.Jouer au jeu \n");
printf("2.Afficher les règles du jeu \n");
printf("3.Résultat des parties précédentes \n");
printf("4.A propos \n");
printf("5.Quitter \n");
 scanf("%d",&choix);



    switch (choix)

        {
            case 1:


affichage_init(&gomoku);
affichage_pl(&gomoku);
affichage_pl2(&gomoku);


  break;


            case 2 : Regles();

                break;

            case 3 :

            //  Appel à l'historique des résultats

                break;


            case 4 : Credits();

            break;

 case 5 :

             system("cls");
   quitter=1;
   break;


default : printf("Mauvaise demande, veuillez réessayer\n");


  };

 while (quitter==0);//on veut quitter le jeu
 printf("Au revoir\n\n");

 // initialisation du jeu
/*affichage_init(&gomoku);

 if(choix=1) {
affichage_pl(&gomoku);}*/

 return 0;
}

/************************* SOUS PROGRAMME AFFICHAGE PLATEAU ***********************************/
/****************************** TERRAIN INITIAL ***********************************************/
int affichage_init(struct plateau * gomoku)
{
    char plateau_gomoku [C][C]={"opopopopopo",  // o: noir
                                "popopopopop",  // p: jaune
                                "opopopopopo",
                                "popopopopop",
                                "opopopopopo",
                                "popopopopop",
                                "opopopopopo",
                                "popopopopop",
                                "opopopopopo",
                                "popopopopop",
                                "opopopopopo"};

    int i,j;


    gomoku->nbcolonne=C;
    gomoku->nbligne=C;

    for (j=0;j<gomoku->nbligne; j++)
    {
        for (i=0; i<gomoku->nbcolonne; i++)
        {
           gomoku->terrain[j][i]=plateau_gomoku[j][i]; }

        }
        return 0;
    }


/********************************* TERRAIN AVEC LES PIONS *************************************/

int affichage_pl2(struct plateau * mobile)
{
    char plateau_mobile[C][C]={"           ",
                                 "           ",
                                 "           ",
                                 "           ",
                                 "           ",
                                 "     X     ",
                                 "           ",
                                 "           ",
                                 "           ",
                                 "           ",
                                 "           "};
int i,j;


    mobile->nbcolonne=C;
    mobile->nbligne=C;

    for (j=0;j<mobile->nbligne; j++)
    {
        for (i=0; i<mobile->nbcolonne; i++)
        {
           mobile->terrain[j][i]=plateau_mobile[j][i]; }

        }
        return 0;
    }
/******************************** CONVERSION DES COULEURS ET AFFICHAGE PLATEAU **********************************/

int affichage_pl(struct plateau * gomoku ){
     int affichage_pl2(struct plateau * mobile){
HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(H,15*16); // H, couleur du fond*16 + couleur de l'écriture

system("cls");

printf("\tA  B  C  D  E  F  G  H  I  J  K");
printf("\n\n");

    int i,j,couleur;
    gomoku->nbcolonne=C;
    gomoku->nbligne=C;

    for (i=0; i<gomoku->nbligne; i++){
      if(i<9)                               // Alignement des cases en fonction du numero de la ligne
          printf("  %d    ", i+1);
      else printf (" %d    ", i+1);
//printf("%d %d",  gomoku->nbligne, gomoku->nbcolonne);

     for (j=0; j<gomoku->nbcolonne; j++){
        if (gomoku->terrain[i][j]=='o') couleur=0; //noir
        if (gomoku->terrain[i][j]=='p') couleur=14; //jaune

        SetConsoleTextAttribute(H,couleur*16);
        printf("   ", *gomoku);
     }

     printf("   ", *mobile);
//SetConsoleTextAttribute(H,15*16);
printf("  \n");

    }

return 0;
    }}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 11 avril 2018 à 11:32
Salut,

Il y a beaucoup de problèmes dans ton code et étant sous Linux, ce n'est pas facile de tester tout cela.

D'abord, il doit manquer /* en ligne 1

en ligne 30, le commentaire est faux. Le handle n'est utile que si une fonction Windows doit l'utiliser dans le contexte dans lequel tu le déclares.

en lignes 52 et 53 tu annonces des prototypes de fonctions qui ne sont pas dans le code, ce qui produit une erreur de liaison.

en ligne 62, dans main(), tu définis
plateau mobile;
, mais cette variable n'est pas initialisée, ni utilisée.

en ligne 66 dans main() tu déclares H, mais tu ne l'utilises pas dans main().

en lignes 92 et 93, tu appelles affichage_pl(), puis affichage_pl2() avec un pointeur vers "gomoku", alors que :

- affichage_pl() semble conçue pour afficher le plateau, tu devrais donc passer &gomoku et &mobile afin que la fonction puisse soit afficher un blanc de la couleur correspondante au damier si la case dans mobile est vide, soit autre chose avec la bonne couleur de fond s'il y a quelque chose dans mobile à cette case

- affichage_pl2() n'affiche rien, elle semble conçue pour initialiser mobile, or : (1) tu lui passes &gomoku et non &mobile : et (2) tu l'appelles après affichage_pl(). Elle est donc mal nommée, son paramètre est erroné et tu devrais l'appeler après la fonction affichage_init() et avant affichage_pl()

en ligne 206 à l'intérieur de la fonction affichage_pl(), tu insères une autre fonction affichage_pl2() contenant le code de affichage_pl(). Il y a trois problèmes avec cela :

- le code à l'intérieur de affichage_pl() n'est jamais exécuté, puisqu'il n'est jamais réellement appelé

- la déclaration de fonctions à l'intérieur de fonctions n'est pas du C standard (gcc le gère comme une extension au C)

- de toutes façons cela n'a aucun sens, puisque tu implémentes déjà par ailleurs une fonction affichage_pl2() qui a son propre code

en ligne 231
printf("   ", *gomoku);
: (1) produit un warning, car tu mets un argument à printf sans spécificateur (l'argument ne sert donc à rien, printf affiche juste les espaces) ; (2) de toutes façons le type est inadéquat, car c'est une struct ; (3) tu dois, à ce moment, soit :

- afficher un blanc coloré avec la couleur de fond correspondant à la case du damier (ce que semble faire le code, bien que maladroitement)
- afficher un caractère de la couleur que tu veux avec la couleur de fond correspondant à la case du damier contenant quelque chose


Alternativement, tu peux utiliser SetConsoleCursorPosition() de l'API Windows, pour placer ton curseur à l'endroit souhaité avant d'écrire.

https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044844545&id=1043284392

ou si ton conio.h dispose de gotoxy(), utiliser directement cette fonction.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 11 avril 2018 à 11:34
note que les numéros de ligne auxquels je me réfère sont ceux produits par le forum, qui semblent se décaler sur certaines lignes - ils sont donc approximatifs

note aussi que, du point de vue de la conception, utiliser une struct pour stocker la couleur de fond du damier n'est pas forcément nécessaire, et qu'il devrait être assez facile de déterminer si la couleur de fond d'une case d'un damier, à partir de ses coordonnées, doit être jaune ou noire, ou simplement d'alterner entre ces deux couleurs entre chaque printf sensé afficher une case consécutivement.
0
jauneam Messages postés 2 Date d'inscription vendredi 6 avril 2018 Statut Membre Dernière intervention 17 avril 2018
17 avril 2018 à 08:22
merci beaucoup !!!
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
17 avril 2018 à 18:26
de rien, bon courage pour ton projet :-)
0