Un morpion qui a la classe

0/5 (18 avis)

Vue 7 734 fois - Téléchargée 514 fois

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

Ajouter un commentaire Commentaires
cs_skawll
Messages postés
1
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
19 mai 2010

19 mai 2010 à 12:05
Slt,
Comment faire pour l'éxécuter?
Mic32768
Messages postés
9
Date d'inscription
jeudi 28 avril 2005
Statut
Membre
Dernière intervention
11 juin 2007

12 juin 2007 à 17:58
Félicitations pour ta source, vraiment bien codée!
cs_zozor
Messages postés
1
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
5 septembre 2006

5 sept. 2006 à 22:53
un peu de commentaire aurait été bien dans le code lol
Vishnouu
Messages postés
13
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
13 juillet 2005

30 juin 2005 à 14:12
ok merci (et dsl pour le double post)
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

30 juin 2005 à 00:22
Afficher les 18 commentaires

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.