/*______________________________________________________________________
 * mastermind
 * par Martin Robinson
 * c'est un jeu
 * ______________________________________________________________________
 * preprocesseur
 */
#pragma once
#ifndef _MASTERMIND
#define _MASTERMIND

#include <vector>

using namespace std;

/*_______________________________________________________________________
 * defenition d'objet
 */

//---------------------------objet ligne caché---------------------------
//semblable à l'objet analyse
//il sert de classe de base 
//contien le code aléatoire sans répétition
//------------------------------------------------------------------------
class master{
protected:
    vector<int> _arr;                                   //tableau de couleur
    enum {vide, rouge, jaune, vert, bleu, orange, blanc, violet, fuchsia};
public:
    master();                                           //constructeur avec random
    ~master();
    //setter
    void setColor(const int index, const int color);    //entree de couleur sécurisé
    //getter
    const int getColor(const int index)const;           //saisie de couleur
    //testeur
    bool have(const int color)const;                    //vérification de présence de couleur
};

//-------------------------objet ligne joué-------------------------------
//ce sont les 12 ligne que le joueur pourra modifier
//c'est littéralement l'objet combinaison

//------------------------------------------------------------------------

class mind:public master{
public:
    mind();                                             //constructeur
    ~mind();                                            //destructeur
    //testeur
    int matchingColor(const master & ref)const;         //compteur de couleur présente
    int rightPlace(const master & ref)const;            //compteur de couleur à la bonne place
    bool done();                                        //detection de ligne completé
    int& operator[](const int index);                   //surcharge des crochets
};

//--------------------------objet partie----------------------------------
//cet objet est le jeux en soit
//------------------------------------------------------------------------

class masterMind{
    vector<mind> _turn;                     //les douzes combinaisons à jouer
    int _current;                           //la ligne en cours
protected:
    master _hidden;                         //la ligne caché
public:
    masterMind();                           //constructeur
    ~masterMind();                          //destructeur
    //testeur
    bool done();                            //verification de partie terminé
    bool win();                             //verification de partie gagné
    //mutator
    void inc();                             //incrémentation de ligne   (iterator)
    mind& currentM();                       //retourn la ligne courant  (iterator)
    mind& operator[](const int index);      //surcharge d'operator tableau
                                            //pas très sécurisable...mais les consignes
                                            //sont les consignes :oP
};

#endif
