Un morpion qui a la classe

Description

C'est un simple morpion dans lequel je tente de mettre en pratique le début de mes cours en C++.
Etant débutant, il est fort à parier que mon analyse objet n'est pas forcément correcte, mais ce n'est pas le but.
Donc on retrouve ici plusieur notions tels que les classes, les pointeurs etc... mais ceci à petit niveau ;)
Le code se compose de plusieurs fichiers

Source / Exemple :

/* fichier : player.h */ 

class Player {
    private:
        
        int id_player;  //id du joueur
        char nom[20];
        int score;      // score du joueur
        void SetNomPlayer();
        int coordonnees[2]; //coordonnées de x et y
        int val_pion;
        
    protected:
        static int id_auto_player;
    //  void PlayerScorePP();
    
    public: 
        Player(int pion=-1) {val_pion = pion; Init(++id_auto_player);};
        void Init(int num_player);
        char * GetNomPlayer(void){return nom;};
        int GetPionPlayer(void){return val_pion;};
        int GetScorePlayer(void){return score;};
        void SetPionPlayer(int pion){val_pion = pion;};
        void PlayerScorePP(void) {++score;};
        void PlayerInitScore(void) {score = 0;};
        int * PlayerPlay(char min_pos,char max_pos);
        
};

/* fichier : player.cpp */ 

#include <cstdlib>
#include <iostream>
#include "player.h"

using namespace std;

int Player::id_auto_player = 0;

void Player::Init(int num_player) {
    int taille = 0;
    char c;
    id_player =  num_player;
    cout << "Joueur " << id_player << " Indiquez votre nom : ";
    while (taille < 2){ //on boucle si le nom n'est pas d'au moins deux caractères
        taille = 0;  
        while (((c=cin.get()) != '\n' ) && (taille < 18)) {
            nom[taille] = c;
            taille++;
        }
    }
    nom[taille] = '\0'; 
    score = 0;
};

int * Player::PlayerPlay(char min_pos, char max_pos) {
    
    int taille = 0;
    char c;
    coordonnees[0] = -1;
    coordonnees[1] = -1;
    
    
    cout << GetNomPlayer()  <<  " indiquer la position (x-y) :";
    while (((c=cin.get()) != '\n' ) && (taille < 3)) {
        if (taille == 0 && c >= min_pos && c <= max_pos) coordonnees[0]= atoi(&c) - 1; 
        if (taille == 2 && c >= min_pos && c <= max_pos) coordonnees[1]= atoi(&c) - 1;
        taille++;
        
    } 
    if (coordonnees[0] == -1 || coordonnees[1] == -1) {
            coordonnees[0] = -1;
            coordonnees[1] = -1;
    }
    return coordonnees;
};  
    
    

/* fichier plateau.h */

class Plateau {
    private:
        int tableau[3][3];
    public:
        Plateau(void) {InitPlateau();};
        void InitPlateau(void);
        int Pose_pion(int * pion, int val_pion);
        void AffichePlateau(int rond, int croix);
        int Plateau::Ligne(int rond, int croix);
        
};


/* fichier : plateau.cpp */

#include <cstdlib>
#include <iostream>
#include "plateau.h"

using namespace std;


void Plateau::InitPlateau(void) {
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++) tableau[i][j] = 0;
};


int Plateau::Pose_pion(int * pion, int val_pion) {
    int i, j;   
    if (pion[0] == -1) return -1;
    if (tableau[pion[0]][pion[1]] == 0)  {
        tableau[pion[0]][pion[1]] = val_pion;
        return 0;
    }
    return -1;
         
};


void Plateau::AffichePlateau(int rond, int croix) {
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (tableau[i][j] == rond) cout << " O ";
            if (tableau[i][j] == croix) cout << " X ";
            if (tableau[i][j] != rond && tableau[i][j] != croix) cout << "   ";
            if (j != 2) cout << "|";
        }
        if (i!=2) cout << "\n-----------";
        cout << "\n";
    }
                
};


int Plateau::Ligne(int rond, int croix) {
    int i,j; 
    int cumul;
    
    cumul = tableau[0][0] + tableau[1][1] + tableau[2][2];
    if (cumul == rond * 3 || cumul == croix * 3) return 1;
    cumul = tableau[0][2] + tableau[1][1] + tableau[2][0];
    if (cumul == rond * 3 || cumul == croix * 3) return 1;
    
    for (i = 0; i < 3; i++) {
        cumul = 0;
        for (j = 0; j < 3; j++) {
            cumul = cumul + tableau[i][j];
        }
        if (cumul == rond * 3 || cumul == croix * 3) return 1;
    }
    
    for (i = 0; i < 3; i++) {
        cumul = 0;
        for (j = 0; j < 3; j++) {
            cumul = cumul + tableau[j][i];
        }
        if (cumul == rond * 3 || cumul == croix * 3) return 1;
    }
    return 0;
}

 

    

/* fichier morpion_objet.h */

#include <cstdlib>
#include <iostream>
#include "player.h"
#include "plateau.h"

class Game {
    private:
        Plateau plateau;
        Player joueur1;
        Player joueur2;
        int manche;
        
    public:
        Game(void) {joueur2.SetPionPlayer(1); manche=0; InitManche();};
        void InitManche(void) {plateau.InitPlateau();};
        void GetScore(void);
        int GetManche(void) {return manche;};
        void NewManche(void);
        void JoueManche(Player &joueurA, Player &joueurB);
        
};


/* fichier morpion_objet.cpp */

#include "morpion_objet.h" 

using namespace std;

void Game::GetScore(void) {
    cout << joueur1.GetNomPlayer() << " : " << joueur1.GetScorePlayer() << " - ";
    cout << joueur2.GetNomPlayer() << " : " << joueur2.GetScorePlayer() << "\n";
};

void Game::JoueManche(Player &joueurA, Player &joueurB) {
    InitManche();
    for (int i=0; i < 5; i++) {
        system("CLS");
        GetScore();
        plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
        while (plateau.Pose_pion(joueurA.PlayerPlay('1', '3'), joueurA.GetPionPlayer()) == -1) {
            system("CLS");
            GetScore();
            plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
            cout << "Coordonnees invalides (1-1 a 3-3) ou non libre\n";
        }
        if (plateau.Ligne(joueurA.GetPionPlayer(), joueurB.GetPionPlayer())) {
            system("CLS");
            joueurA.PlayerScorePP();
            GetScore();
            plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
            cout << "Gagner \n";
            
            break;
        }
        if (i == 5) break;
        
        system("CLS");
        GetScore();
        plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
        while (plateau.Pose_pion(joueurB.PlayerPlay('1', '3'), joueurB.GetPionPlayer()) == -1) {
            system("CLS");
            GetScore();
            plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
            cout << "Coordonnees invalides (1-1 a 3-3) ou non libre\n";
        }
        if (plateau.Ligne(joueurA.GetPionPlayer(), joueurB.GetPionPlayer())) {
            system("CLS");
            joueurB.PlayerScorePP();
            GetScore();
            plateau.AffichePlateau(joueur1.GetPionPlayer(), joueur2.GetPionPlayer());
            cout << "Gagner \n";
            
            break;
        }
        
    }
        
};

void Game::NewManche(void) {
    
    if ((++manche % 2) == 0) {
        JoueManche(joueur2, joueur1);
    } else {
        JoueManche(joueur1, joueur2);
    }
};

int main(int argc, char *argv[])
{
    Game jeu;
    char reponse = 'O';
    while (true) {
        jeu.NewManche();
        cout << "\n rejouer (O/N)? ";
        cin >> reponse;
        if (reponse == 'N' || reponse == 'n') break;
    }
    system("CLS");
    jeu.GetScore();
    system("PAUSE");
    return EXIT_SUCCESS;
}

Conclusion :

Le projet est réaliser à l'aide de dev-c++, AMHA, largement suffisant pour débuter en C++
le fichier zip reprend l'ensemble des fichiers...

Codes Sources

A voir également

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.