Un morpion qui a la classe

Soyez le premier à donner votre avis sur cette source.

Vue 7 235 fois - Téléchargée 493 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

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

Slt,
Comment faire pour l'éxécuter?
Messages postés
9
Date d'inscription
jeudi 28 avril 2005
Statut
Membre
Dernière intervention
11 juin 2007

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

un peu de commentaire aurait été bien dans le code lol
Messages postés
13
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
13 juillet 2005

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

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.