[Avis & Amélioration] Morpion
Salut à tous, étant débutant dans ce langage, je souhaiterai avoir des avis sur mon code(améliorations du code, organisation etc.).
Je vous laisse mon code source afin de voir ce qu'il en est:
Main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <iostream>
#include "Game.h"
using namespace std;
int main(){
Game g;
g.play();
return 0;
} |
Game.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#ifndef GAME_H
#define GAME_H
#include <array>
enum PlayerChar {
Empty, // Empty cell
Round, // Round piece / player1
Cross // Cross piece / player2
};
class Game {
public:
Game();
void play(); // Lance le jeu(appel des différentes méthodes)
private:
void resetBoard(); // Efface le plateau
void printBoard() const; // Affiche le plateau
void switchPlayer(); // Change de joueur après avoir jouer
char getPlayer(PlayerChar& p); // Retourne le joueur courant
void putPiece(); // Place piece du joueur
bool isSlotEmpty(int slot) const; // Retourne TRUE si le slot est vide
bool isBoardFull() const; // Retourne TRUE si le plateau est plein
bool checkLine() const; // Retourne TRUE si ligne gagnante
bool checkColumn() const; // Retourne TRUE si colonne gagnante
bool checkDiagonal() const; // Retourne TRUE si diagonale gagnante
bool checkWon() const; // Retourne TRUE si le jeu est gagné
std::array<PlayerChar, 9> mBoard; // Plateau de jeu
PlayerChar mPlayer; // Joueur courrant
int mTurn; // Nombre de tours joués
};
#endif // GAME_H |
Game.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#include "Game.h"
#include <iostream>
Game::Game(): mPlayer(Round), mTurn(1){
resetBoard();
}
void Game::resetBoard() {
mBoard.fill(Empty);
}
void Game::printBoard() const {
std::cout << std::endl << std::endl;
if(checkWon())
std::cout << " VICTOIRE" << std::endl;
else
std::cout << " Tour n°" << mTurn << std::endl;
std::cout << "+---+---+---+" << std::endl;
for(size_t i = 0; i < mBoard.max_size(); i++) {
std::cout << "| ";
switch(mBoard[i]) {
case Round:
std::cout << " O ";
break;
case Cross:
std::cout << " X ";
break;
case Empty:
std::cout << " " << i+1 << " ";
break;
default:
break;
}
std::cout << " ";
if ((i+1) % 3 == 0 && i != 0) {
std::cout << "|" << std::endl;
std::cout << "+---+---+---+" << std::endl;
}
}
}
void Game::play() {
while(!isBoardFull() && !checkWon()) {
printBoard();
putPiece();
switchPlayer();
mTurn++;
}
switchPlayer();
printBoard();
std::cout << std::endl;
if(isBoardFull() && !checkWon())
std::cout << "Match nul !";
if(checkWon()) {
std::cout << "Joueur [";
std::cout << getPlayer(mPlayer);
std::cout << "]";
std::cout << " a gagné la partie en ";
std::cout << mTurn - 1 << " coups !";
}
std::cout << std::endl;
}
void Game::switchPlayer() {
if(mPlayer == Cross) mPlayer = Round;
else mPlayer = Cross;
}
char Game::getPlayer(PlayerChar& p) {
return( (p == Cross) ? 'X' : 'O');
}
void Game::putPiece() {
std::cout << "Joueur [";
std::cout << getPlayer(mPlayer);
std::cout << "]" << std::endl;
int slot(-1);
while(slot < 1 || slot > 9 || !isSlotEmpty(slot - 1)) {
std::cout << "Case: ";
std::cin >> slot;
}
mBoard[slot - 1] = mPlayer;
}
bool Game::isSlotEmpty(int slot) const {
return(mBoard[slot] == Empty);
}
bool Game::checkLine() const {
bool res = false;
for(size_t i = 0; i < mBoard.max_size(); i += 3) {
if(!isSlotEmpty(i)) {
if(mBoard[i] == mBoard[i+1] && mBoard[i] == mBoard[i+2]) {
res = true;
}
}
}
return res;
}
bool Game::checkColumn() const {
bool res = false;
for(size_t i = 0; i < 3; i++) {
if(!isSlotEmpty(i)) {
if(mBoard[i] == mBoard[i+3] && mBoard[i] == mBoard[i+6]) {
res = true;
}
}
}
return res;
}
bool Game::checkDiagonal() const {
bool res = false;
for(size_t i = 0; i < mBoard.max_size(); i++) {
if(!isSlotEmpty(0)) {
if(mBoard[0] == mBoard[4] && mBoard[0] == mBoard[8]) {
res = true;
}
}
if(!isSlotEmpty(2)) {
if(mBoard[2] == mBoard[4] && mBoard[2] == mBoard[6]) {
res = true;
}
}
}
return res;
}
bool Game::isBoardFull() const {
bool res = true;
for(size_t i = 0; i < mBoard.max_size(); i++) {
if(mBoard[i] == Empty) {
res = false;
}
}
return res;
}
bool Game::checkWon() const {
if(checkLine() || checkDiagonal() || checkColumn()) {
return true;
} else {
return false;
}
} |
Merci et bonne journée,