Code Jeu de la vie C++ avec classes et vecteurs [Résolu]

Messages postés
1
Date d'inscription
mercredi 3 avril 2019
Statut
Membre
Dernière intervention
3 avril 2019
-
Bonjour à tous,

Débutant en c++, je suis dans le cadre de mes études amené à coder le jeu de la vie en C++. Les "contraintes" étant que je dois coder en utilisant les classes (orienté objet) et utiliser les tableaux dynamiques avec vector <vector <> > que je n'ai jamais utilisé.
Cependant, à peine au tout début pour créer une grille par défaut et avec uniquement des 0 je rencontre un problème. Le programme compile mais ne m'affiche rien. Voilà le code :
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;

class GRILLE {
    
    private :
    
    int NbLignes, NbColonnes;
    int NbCellules;
    int NbCellulesVie;
    vector<vector<bool> > g;
    
    public :
    
    GRILLE();
    GRILLE(int, int);
    GRILLE(GRILLE &);
    ~GRILLE();
    void affiche();
    int GetNbLignes() const {return NbLignes;};
    int GetDimY() const {return NbColonnes;};
    int GetNbCellules() const {return NbCellules;};
    int GetNbCellulesVie() const {return NbCellulesVie;};
    void SetDimX(int);
    void SetDimY(int);
    void SetNbCellules(int);
    void SetNbCellulesVie(int);
};

GRILLE::GRILLE(){
    NbLignes = 10;
    NbColonnes = 10;
    NbCellules = 100;
    NbCellulesVie = 100;
    vector<vector<bool> > g(NbColonnes);
    for(int i(0); i < NbColonnes; ++i) {
        g[i] = vector<bool> (NbLignes);
    }
    for(int i=0; i < g.size(); ++i) {
        for(int j=0; j < g[i].size(); ++j) {
            g[i][j] = false;
        }
    }
}

void GRILLE::affiche(){
    for (int i=0;i<g.size();i++){
        for(int j=0; j < g[i].size(); ++j){
            if (j == g.size()-1)
            {
                if (g[i][j]) cout << " 1 "<< endl;
                else cout << " 0 " << endl;
            }
            else
            {
                if (g[i][j]) cout << " 1 ";
                else cout << " 0 ";
            }
        }
    }
}

GRILLE::GRILLE( int a ,  int b){
    cout<<"Appel constructeur "<<NbLignes<<" "<<NbColonnes<<" "<<NbCellules<<" "<<NbCellulesVie<<endl;
    NbLignes = sqrt(a);
    NbColonnes = sqrt(a);
    NbCellules = a;
    NbCellulesVie = b;
    vector<vector<bool> > g(NbColonnes);
    for(int i(0); i < NbColonnes; ++i) {
        g[i] = vector<bool>(NbLignes);
    }
}

GRILLE::GRILLE(GRILLE& A){
    NbLignes = A.NbLignes;
    NbColonnes= A.NbColonnes;
    NbCellules = A.NbCellules;
    NbCellulesVie = A.NbCellulesVie;
}

GRILLE::~GRILLE(){
    NbLignes = 0;
    NbColonnes = 0;
    NbCellules = 0;
    NbCellulesVie = 0;
    for(int i(0); i < g.size(); ++i) {
        for(int j(0); j < g[i].size(); ++j) {
            g[i][j] = false;
        }
    }
}


void GRILLE::SetDimX(int NbLignes_){
    NbLignes = NbLignes_;
}
void GRILLE::SetDimY(int NbColonnes_){
    NbColonnes = NbColonnes_;
}
void GRILLE::SetNbCellules(int NbCellules_){
    NbCellules = NbCellules_;
}
void GRILLE::SetNbCellulesVie(int NbCellulesVie_){
    NbCellulesVie = NbCellulesVie_;
}



int main() {
    

    GRILLE b;
    
    b.affiche();
    
    
    
}


Si vous aviez une idée de où ca bloque deja à ce stade, je vous en serait reconnaissant.
Merci d'avance
Afficher la suite 

Votre réponse

2 réponses

Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
Bonjour.

Plusieurs petits soucis:
  • Evite les using namespace, c'est dégeux. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace/
  • Plutôt que de faire un vector de vector (bien chiant à manipuler) fait un seul vector. Vu que la taille est fixe, tu peux faire x * taille + y pour accéder à une élément. Tu peux représenter deux dimensions avec une seule avec cette technique.
  • Dans l'idéal, un std::array serait bien mieux qu'un std::vector (mais si ça t'es imposé, on va le laisser).
  • Compile avec les flags de warnings, et avec une version récente du C++ (C++11 ou plus).


Quelques points de "style:"
  • Les attributs sont généralement préfixé par _
  • Les classes commencent par des majuscules, le reste, non.
  • En anglais c'est mieux généralement


Je t'ai corrigé ton code, et j'ai ajouté quelques trucs sympa dedans qui devrait t'aider.

#include <iostream>
#include <vector>

class Grid
{
public:
  Grid();
  Grid(int width, int height);
  Grid(Grid& grid);
  ~Grid();

  void print(std::ostream& out) const;
  int getNbRows() const {return _nbRows;};
  int getNbCols() const {return _nbCols;};
  // Get a cell
  char operator()(int x, int y) const;
  // Set a cell
  char& operator()(int x, int y);

private:
  int _nbRows;
  int _nbCols;
  std::vector<char> _grid;
};

std::ostream& operator<<(std::ostream& out, const Grid& grid)
{
  grid.print(out);
  return out;
}

Grid::Grid()
  : Grid(10, 10)
{
}

Grid::Grid(Grid& grid)
  : _nbRows(grid._nbRows),
    _nbCols(grid._nbCols),
    _grid(grid._grid)
{
}

Grid::Grid(int width, int height)
  : _nbRows(height), _nbCols(width)
{
  std::cout << "Appel constructeur " << _nbRows << " " << _nbCols << " " << std::endl;
  _grid.resize(width * height);
  for (auto& cell : _grid)
    cell = '.';
}

Grid::~Grid()
{
}

void Grid::print(std::ostream& out) const
{
  for (int x = 0; x < _nbRows; x++)
  {
    for (int y = 0; y < _nbCols; y++)
    {
      out << (*this)(x, y);
    }
    out << std::endl;
  }
}

char Grid::operator()(int x, int y) const
{
  return _grid[x * _nbRows + y];
}

char& Grid::operator()(int x, int y)
{
  return _grid[x * _nbRows + y];
}


int main() {
  Grid b;
  b.print(std::cout);
  b(0, 0) = 'x';
  b(2, 3) = 'y';
  b(9, 9) = 'z';
  // On peut faire afficher aussi directement comme ceci grâce à la surcharge que l'on a écrit
  std::cout << "After insert\n" << b << std::endl;
}

Commenter la réponse de cptpingu
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
J'ai oublié de préciser:
Remplace dans ton constructeur:
vector<vector<bool> > g(NbColonnes);

par
g.resize(NbColonnes);


Et ça ira mieux dans ton code. En fait, tu initialisais un nouveau "g" local à la fonction, et qui disparaissait ensuite. Tu ne touchais pas au "vrai g".


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.