Code Jeu de la vie C++ avec classes et vecteurs

Résolu
zestysoccio Messages postés 1 Date d'inscription mercredi 3 avril 2019 Statut Membre Dernière intervention 3 avril 2019 - Modifié le 3 avril 2019 à 13:21
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 3 avril 2019 à 13:20
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

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 avril 2019 à 13:00
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;
}

0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 3 avril 2019 à 13:20
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".

0
Rejoignez-nous