zestysoccio
Messages postés1Date d'inscriptionmercredi 3 avril 2019StatutMembreDernière intervention 3 avril 2019
-
Modifié le 3 avril 2019 à 13:21
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 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 :
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;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023124 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".