IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Boucler le contenu d'un ENUM


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Par défaut Boucler le contenu d'un ENUM
    Bonjour à tous,

    Je suis en train de créer un petit jeu d'échecs afin de créer une IA.
    Pour représenter les positions j'ai fait 2enums :

    - POS_LETTER
    - POS_NUMBER

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum POS_LETTER {   POS_A = 1,
                        POS_B = 2,
                        POS_C = 3,
                        POS_D = 4,
                        POS_E = 5,
                        POS_F = 6,
                        POS_G = 7,
                        POS_H = 8 };
    Maintenant j'utilise donc pour créer des positions ce type de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Position
    {
        public:
     
        Position(POS_LETTER, POS_NUMBER); // Constructeur
     
        private:
     
     
        POS_LETTER letter;
        POS_NUMBER number;
    };
    Jusqu'ici tout fonctionne bien mais le problème est que j'aimerai pouvoir boucler sur ces positions et faire donc un for dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(POS_LETTER letterPawn=POS_A; letterPawn<=POS_H; letterPawn++)
    Mais j'ai une erreur sur l'opérateur++ inconnu pour POS_LETTER, ce qui est fortement compréhensible.. J'aimerai donc savoir comment je peux mis prendre pour boucler le contenu d'un enum ??

    Merci à tous.

    PS: Bien sur je pourrais faire un simple for(int i=1; i<=8; i++) mais ce n'est pas ce que je cherche...

  2. #2
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonjour,

    cette précédente discussion devrait t'aider.

  3. #3
    Membre confirmé Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Par défaut
    Je ne peux pas vraiment me satisfaire de cette réponse car il faut convertir en int qui vont se suivre 0,1,2,3,...
    Et j'ai des cas ou les valeurs sont par exemple égales à 1,3,3,5,9,...

    Il n'y a aucune autre solution ??

  4. #4
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonsoir,

    si ça te convient, tu peux ne pas utiliser d'énumération mais des variables constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class POS_LETTER 
    {   
    public:
    short const POS_A = 1;
    short const POS_B = 2;
    short const POS_C = 3;
    short const POS_D = 4;
    short const POS_E = 5;
    short const POS_F = 6;
    short const POS_G = 7;
    short const POS_H = 8;
    };
    Dans ce cas, tu peux utiliser le patron de singleton pour n'instancier qu'une seule fois ta classe (cf la faq).
    Tu peux aussi faire ta propre classe d'énumération!

  5. #5
    Membre confirmé Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Par défaut
    Ouai c'est vrai que ça peut être intéressant, mais je penses que niveau performance il y aura pas mal de perte...

    Sinon je peux faire une fonction nextPos qui retourne la position suivante... Qui reviendrai à recréer un operator++, en parlant de ça.. Ce n'est pas possible de l'ajouter à l'énumération ?? Comme ça se serait réglé :p

  6. #6
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Citation Envoyé par CactO_o's Voir le message
    Sinon je peux faire une fonction nextPos qui retourne la position suivante... Qui reviendrai à recréer un operator++, en parlant de ça.. Ce n'est pas possible de l'ajouter à l'énumération ?? Comme ça se serait réglé :p
    Ca me paraît contre-nature mais sinon je ne sais pas s'il est techniquement possible de surcharger l'opérateur ++ pour une énumération.
    Tu devrais essayer par toi-même.

    Entre nous, l'argument des performances ne tient pas ici parce que ton énumération va contenir peu de valeurs.

  7. #7
    Membre confirmé Avatar de CactO_o's
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 98
    Par défaut
    Ouai c'est vrai que ça peut être intéressant, mais je penses que niveau performance il y aura pas mal de perte...

    Sinon je peux faire une fonction nextPos qui retourne la position suivante... Qui reviendrai à recréer un operator++, en parlant de ça.. Ce n'est pas possible de l'ajouter à l'énumération ?? Comme ça se serait réglé :p

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    Je me demande si tu ne prends pas le problème à l'envers:

    Dans un jeu d'échec, tu as 64 positions valides qui ne changent absolument pas (de A1 à H8), et qui acceptent de recevoir une pièce de l'échiquier.

    Lorsqu'une pièce se déplace, il se s'agit pas de modifier la position à laquelle la pièce se trouve, mais bel et bien de changer de position.

    Pièces et positions sont créées "une bonne fois pour toutes" au moment du lancement du jeu .

    Comme il est tout aussi possible qu'une position n'ait pas de pièces qui se trouve sur elle, il est possible qu'une pièce ne se trouve sur aucune position (quand elle a été prise). La relation pièce <--> position doit donc en tenir compte (utiliser des pointeurs pour représenter cette relation )

    Une pièce doit pouvoir renvoyer la position à laquelle elle se trouve et une position doit pouvoir renvoyer la pièce qui se trouve dessus, s'il y en a une.

    Une position doit, également simplement renvoyer sa position en verticale (lettres) et horizontale (chiffres) et, essentiellement, être comparée à une autre en terme d'égalité.

    Un échiquier maintient un ensemble de 64 position et est en mesure de renvoyer un pointeur vers l'une d'elle en particulier sur base des positions horizontales et verticales ( Position *getPosition(POS_LETTER, POS_NUMBER) )

    Il maintient également un ensemble de pièces susceptibles de se trouver sur l'échiquier.

    Un joueur reçoit un ensemble de pièces, correctement placées sur l'échiquier, en début de partie et s'occupe de les faire se déplacer.

    Il doit faire la distinction entre les pièces encore présentes sur l'échiquier et celle que son adversaire lui a prises.

    Une partie s'occupe de gérer les deux joueurs et de leur donner l'ensemble de pièces adéquat.

    Son rôle est de veiller au bon déroulement d'une partie.

    Au final, tu aurais quelque chose de proche de

    les énumérations sympa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    enum POS_LETTER {   POS_A = 1,
                        POS_B = 2,
                        POS_C = 3,
                        POS_D = 4,
                        POS_E = 5,
                        POS_F = 6,
                        POS_G = 7,
                        POS_H = 8 };
    enum POS_NUMBER {   POS_1 = 1,
                        POS_2 = 2,
                        POS_3 = 3,
                        POS_4 = 4,
                        POS_5 = 5,
                        POS_6 = 6,
                        POS_7 = 7,
                        POS_8 = 8 };
    enum Color
    {
        white =0,
        black
    };
    les positions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Position
    {
        friend class Game;
        public:
            Position( POS_LETTER x, POS_Number y):
            bool hasPiece() const{return piece_!=NULL;}
            Piece * piece(){return piece_;}
            void pieceIn(Piece* p)
            {
                /* s'il y a déjà une pièce sur cette position, elle est prise
                 * par l'adversaire et elle se trouve donc sur "aucune position"
                 */
                 if(piece_ && piece_!=p)
                     piece_->leave(NULL);
                  piece_ = p;
            }
            void pieceOut(); // quand une pièce part
            {
                 piece_=NULL;
            } 
            POS_LETTER verticlaPos() const{return letter;}
            POS_NUMBER horizontalPos() const{return number;}
        private:
            POS_LETTER letter;
            POS_NUMBER number;
     
            Piece * piece_;
    };
    les pieces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Piece
    {
        friend class Game;
         public:
             Piece(Position * p, Color c):position_(p),color_(c){}
             virtual ~Piece(){}
             /* permet de s'assurer qu'un déplacement est autorisé
              * par le type réel de la piece (à implémenter pour 
              * chaque type de pièce dérivé ;))
              */
             virtual bool followRules(Position target) const = 0;
             bool isAlive() const{return position_!=NULL;}
             bol leave(Position * destination)
             {
                 if(!followRules(destination))
                     return false;
                 if( destination && ! canMove(destination)
                     return false; // on essaye d'aller sur une position "amie"
                 position_->pieceOut(); // signale à la position actuelle que la
                                        // piece part
                 position_ = destination;
                 if(position_)
                     position_->pieceIn(this); // signale à la destination que la piece
                                               // arrive dessus (si elle n'a pas été prise)
                 return true;
             }
             bool canMove(Position * target)
             {
                 Piece * temp=target->piece();
                 return (temp && temp->color()!=color_) || temp==NULL;
             }
             Color color() const{return color_;}
             Position * position() const{return position_;}
    };
    Les classes dérivées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    class Pion : public Piece
    {
        public:
            Pion(Position* , Color);
            virtual ~Pion();
            virtual bool followRules() const;
    };
    class Roi: public Piece
    {
        public:
            Roi(Position* , Color);
            virtual ~Roi();
            virtual bool followRules() const;
    };
    class Dame : public Piece
    {
        public:
            Dame (Position* , Color);
            virtual ~Dame ();
            virtual bool followRules() const;
    };
    class Tour: public Piece
    {
        public:
            Tour(Position* , Color);
            virtual ~Tour();
            virtual bool followRules() const;
    };
    class Cavalier : public Piece
    {
        public:
            Cavalier (Position* , Color);
            virtual ~Cavalier ();
            virtual bool followRules() const;
    };
    class Fou : public Piece
    {
        public:
            Fou (Position* , Color);
            virtual ~Fou ();
            virtual bool followRules() const;
    };
    Il manque sans doute pas mal de chose, dont les classes Echiquier et Partie, mais je ne vais pas tout faire pour toi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Enum contenu dans une table
    Par Babas007 dans le forum Hibernate
    Réponses: 3
    Dernier message: 21/04/2011, 18h15
  2. introspection recuperer contenu enum
    Par pod67 dans le forum C#
    Réponses: 5
    Dernier message: 26/08/2008, 15h01
  3. boucler sur des enum
    Par Haywire dans le forum Langage
    Réponses: 2
    Dernier message: 05/03/2008, 21h38
  4. [c#] Contenu de enum
    Par gilles641 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2006, 12h34
  5. Réponses: 1
    Dernier message: 04/04/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo