Bonjour/bonsoir ! J’ai suivi le cours du site sur le C++ et j’ai décidé de coder un morpion 3–3 pour voir ce que j’avais retenu. Je suis pas à mon coup d’essai en C++ (j’avais déjà un peu lu le cours de gbdivers y’a quelques temps maintenant) et en algorithmique également (on fait du python au lycée).
Je voulais vous montrer ce morceau de code pour avoir des retours sur la façon dont auraient pu être organisées les choses ici. J’imagine aussi que ça doit être bourré d’erreurs niveau utilisation du langage ou même en terme de maintenabilité et d’évolutivité.
Pour ceux qui auront le courage de lire, n’hésitez pas à partager vos avis ! Je vous remercie par avance.
Le code :
#include <iostream>
#include <array>
#include <limits>
struct Grid
{
Grid();
void update(bool player1);
void print();
std::array<char, 9> content;
std::array<std::array<int, 3>, 8> winPositions;
};
bool gameWon(const Grid & grid);
std::size_t checkEntry(std::size_t & entry, const Grid* grid);
void printResults(const bool player1, int counter, const Grid & grid);
int main()
{
Grid grid;
bool player1 { true };;
int counter { 0 };
while (!(gameWon(grid)) && counter != 9) {
grid.update(player1);
grid.print();
player1 = !(player1);
++counter;
}
printResults(!(player1), counter, grid);
return 0;
}
Grid::Grid()
{
content.fill('-');
winPositions[0] = { 0, 1, 2 };
winPositions[1] = { 3, 4, 5 };
winPositions[2] = { 6, 7, 8 };
winPositions[3] = { 0, 3, 6 };
winPositions[4] = { 1, 4, 7 };
winPositions[5] = { 2, 5, 8 };
winPositions[6] = { 0, 4, 8 };
winPositions[7] = { 2, 4, 6 };
}
void Grid::update(bool player1)
{
const int playerNumber { (player1 ? 1 : 2) };
char c { player1 ? 'X' : 'O' };
std::cout << "Player " << playerNumber << ", pick a position (1-9): ";
std::size_t pick { checkEntry(pick, this) };
--pick;
content[pick] = c;
}
void Grid::print()
{
for (std::size_t i { 0 }; i < 9; ++i) {
std::cout << content[i] << ' ';
if (i == 2 || i == 5 || i == 8)
std::cout << std::endl;
}
}
bool gameWon(const Grid & grid)
{
for (const auto & line : grid.winPositions) {
if (grid.content[line[0]] == grid.content[line[1]]
&& grid.content[line[1]] == grid.content[line[2]]
&& grid.content[line[2]] != '-')
return true;
}
return false;
}
std::size_t checkEntry(std::size_t & entry, const Grid* grid)
{
while (!(std::cin >> entry) || entry > 9 || entry < 1 || grid->content[entry-1] != '-') {
std::cout << "Invalid entry, please try again: ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return entry;
}
void printResults(const bool player1, const int counter, const Grid & grid)
{
const int playerNumber { player1 ? 1 : 2 };
if (counter == 9 && !(gameWon(grid)))
std::cout << "It's a draw." << std::endl;
else
std::cout << "Player " << playerNumber << " wins." << std::endl;
}
+0
-0