TP Puissance 4

a marqué ce sujet comme résolu.

Bonjour à tous ! J’essaye en ce moment de faire le TP Puissance 4 proposé dans le cours de C. Cependant j’ai un problème que je n’arrive vraiment pas à comprendre après mes recherches. Il s’agit d’un retour à la ligne non voulu.

En effet, j’essaye dans un premier temps de créer puis d’afficher la grille de jeu, pour cela j’ai fait une structure cell contenant un tableau 2D de caractères ainsi qu’un symbole (soit 'O' soit 'X’). J’ai aussi fait une structure grille qui est un tableau 2D de cell. Pour l’affichage d’une cellule, je n’ai pas de problèmes. En revanche, pour afficher toutes la grille j’en ai un. Je voudrais faire un retour à la ligne une fois que mon compteur j (voir le code ci-dessous) arrive à NB_COLONNES-1 sauf qu’un retour à la ligne est fait à chaque affichage de cellule. Je ne vois pas pourquoi ? Peut être qu’un appelle à une fonction engendre automatiquement un retour à la ligne ? Merci d’avance pour votre aide ;)

Voici le code :

puissance4.h :

#ifndef PUISSANCE4_H
#define PUISSANCE4_H

#define NB_LIGNES 6
#define NB_COLONNES 7

struct cell
{
  char case_cell[3][5];
  char symbole;
};

struct grille
{
  struct cell grille_cell[NB_LIGNES][NB_COLONNES];
};

int saisir_coup(int joueur);
struct grille creer_grille(int nb_lignes, int nb_colonnes);
#endif

puissance4.c :

#include <stdio.h>
#include <stdlib.h>
#include "puissance4.h"





struct cell creer_cell()
{
  struct cell* Cellule = malloc(sizeof(struct cell));
  for(int i=0; i<3; i++){
    for(int j=0; j<5; j++){
      if((i==0 && j==0)||(i==2 && j==4)||(i==2 && j==0)||(i==0 && j==4))
	Cellule->case_cell[i][j]='+';
      else if((i==0 || i==2) && (j==1 || j==2 || j==3))
	Cellule->case_cell[i][j]='-'; 
      else if((i==1 && j==0) || (i==1 && j==4))
	Cellule->case_cell[i][j]='|';
      else if((i==1 && j==1)||(i==1 && j==3))
	Cellule->case_cell[i][j]=' ';
    }
  }
  Cellule->symbole = ' ';
  return *Cellule;
}

void afficher_cell(struct cell Cellule)
{
  for(int i=0; i<3; i++){
    for(int j=0; j<5; j++){
      if(j==4)
	printf("%c\n", Cellule.case_cell[i][j]);
      else if(i==1 && j==2)
	printf("%c", Cellule.symbole);
        
      else
	printf("%c", Cellule.case_cell[i][j]);
	
    }
  }
}

struct grille creer_grille(int nb_lignes, int nb_colonnes)
{
  struct grille* Grille = malloc(sizeof(struct grille));
  for(int i=0; i<NB_LIGNES; i++){
    for(int j=0; j<NB_COLONNES; j++){
      Grille->grille_cell[i][j]=creer_cell();
    }
  }
  return *Grille;
}

void afficher_grille(struct grille Grille)
{
  for(int i=0; i<NB_LIGNES; i++){
    for(int j=0; j<NB_COLONNES; j++){
      if(j==NB_COLONNES-1){
	afficher_cell(Grille.grille_cell[i][j]);
	printf("\n");
      }
      else
	afficher_cell(Grille.grille_cell[i][j]);
    }
  }
}


int main(void)
{
  struct grille G1 = creer_grille(NB_LIGNES, NB_COLONNES);
  afficher_grille(G1);

  return 0;
}

Et le résultat en ligne de commande après compilation et execution :

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+
+---+
|   |
+---+

Salut,

Ligne 33, tu reviens à la ligne pour afficher la ligne suivante de ta cellule. C’est de là que ton soucis vient. Mais en vérité, tu as un problème de logique d’affichage. Pour afficher ton tableau, tu ne peux pas afficher les cellules les unes après les autres (ça fera toujours quelque chose comme ce que tu as) : tu dois afficher les lignes du tableau considéré dans son entièreté les unes après les autres.

Je les afficherai comment du coup ? La j’ai essayer de créer et d’afficher le tableau d’une traite mais j’ai une erreur de segmentation et je ne vois pas d’où elle vient.

#include <stdio.h>
#include <stdlib.h>
#include "puissance4.h"

#define NB_LIGNES ((6*2)+1)
#define NB_COLONNES ((7*4)+1)

char** creer_grille()
{
  char** grille = malloc(NB_LIGNES*sizeof(char*));
  for(int i=0; i<NB_LIGNES; i++){
    grille[i] = malloc(NB_COLONNES*sizeof(char));
    for(int j=0; j<NB_COLONNES; j++){
      if((i%2==0) && (j%4==0))
	grille[i][j]='+';
      else if((i%2!=0) && (j%4==0))
	grille[i][j]='|';
      else if((i%2==0) && (j%4!=0))
	grille[i][j]='-';
      else if((i%2!=0)&&(j%4!=0))
	grille[i][j]=' ';
      else if((i%2!=0) && (j%4==0))
	grille[i][j]='|';
    }
  }
  return grille;
}

void afficher_grille(char** grille)
{
  for(int i=0; i<NB_LIGNES; i++){
    for(int j=0; i<NB_COLONNES; j++){
      if(j==NB_COLONNES-1)
	printf("%c\n", grille[i][j]);
      else
	printf("%c", grille[i][j]);
    }
  }
}
	       
	       

int main(void)
{
  char** G1 = creer_grille();
  afficher_grille(G1);

  return 0;

}

L’execution donne ça :

+---+---+---+---+---+---+---+
1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   |   |1+---+---+---+---+---+---+---+1|   |   |   |   |   |   | �Erreur de segmentation (core dumped)

Je ne vois pas pourquoi il y a des '1' qui apparaissent o_O .

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte