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

 C++ Discussion :

Liens entre classes Jeu/plateau


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Par défaut Liens entre classes Jeu/plateau
    Bonsoir, codeuses,codeurs,

    Problème situé au niveau d'un lien d'un attribut entre 2 classes.
    Je m'explique.
    Pour mes études, je dois réaliser un jeu comportant un plateau, et des joueurs.

    Ici la classe plateau:
    Plateau.h



    Plateau.cpp



    Dans le plateau.cpp, je dis ce que contient l'attribut tableau.
    Si je mets tout ça en lien dans le main, que je lance l'affichage comme il se doit, tout fonctionne.

    Voilà la classe joueur.
    Joueur.h


    Joueur.cpp


    Sans entrer dans le vif du sujet des fonctions, voilà mon soucis.
    La variable tableau crée dans la classe plateau, j'aimerais la réutiliser dans la classe joueur et notamment ses méthodes, car le joueur va rentrer une position et il faudra poser le pion sur le plateau, et je ne sais absolument pas comment le faire, ni mettre le tableau en argument.

    Merci de votre aide, j'espère avoir été clair.
    Soyez indulgents avec moi, j'ai fait du C, du C++ (débute) alors difficile quand même. Si vous voyez des erreurs d'écriture ou autre, signalez le, merci !

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

    Informations professionnelles :
    Activité : aucun

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

    D'abord, pourrais tu faire un copier / coller de ton code en le placant entre les balises [ CODE ] et [ /CODE ] (ou en utilisant le bouton # qui se trouve en haut du formulaire) plutot que de nous fournir des impressions écrans, ce serait beaucoup plus clair

    Ensuite, si des informations doivent être utilisées par des objets de types différents, il est souvent utile d'envisager d'en faire une classe ( ou une structure selon le cas, car la seule différence entre les deux est l'accessibilité par défaut en C++ )

    Par contre, je ne crois sincèrement pas que le joueur doive disposer d'une variable de type Tableau...

    A mon avis, ce qu'il doit manipuler, ce serait plutot ce qui compose le tableau : quelle que chose comme une classe "Case" ou une classe Position"

    Le joueur ne peut, en effet, se trouver à un instant T qu'à un seul endroit sur le plateau (à moins qu'il n'aie le dont d'ubiguité ), et, tout ce qu'il doit pouvoir dire, c'est "je me trouve sur telle ou telle case du plateau" , ou "je me déplace de telle case vers telle case"

    D'ailleurs, en y réfléchissant bien, la case et la position devraient être deux classes différentes :

    La position permettrait de représenter la position du joueur (ou de n'importe quoi d'autre) sur le plateau et l'identifie de manière unique ("A5", "G98"), alors qu'une case est identifiée par une position (il n'y a jamais qu'une case à une position donnée dans tout le plateau ) et s'occupe de gérer le fait qu'il y ait (ou non) "quelque chose" sur la case concernée.

    Le plateau, enfin, serait un ensemble de cases plus ou moins contigües.

    Tu aurais donc quelque chose qui pourrait ressembler à
    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
    class Position
    {
        public:
            Position(int ligne, int colone) : ligne_(ligne), colonne_(colonne)
            {
                 assert(ligne_ >= 0); //une position peut etre de 0,0, mais pas -1, -1
                 assert(colonne_ >=0);
                 //MAXLIGNE ET MAXCOLNNE représentent les coordonnée maximale atteignables sur le plateau ;)
               assert(ligne_ < MAXLINGE);
               assert(colonne_ <MAXCOLONNE);
            }
            int ligne() const{return ligne_;}
            int colonne() const{return colonne_;}
        private:
           int linge_;
           int colonne_;
    };
    la case utilise cette position et peut contenir (ou non) un joueur... elle ressemblerait donc à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Case
    {
        public:
            Case(int ligne = 0, int colonne = 0):position_(ligne,colonne),joueur_(0){}
            int ligne() const{return position_.ligne();}
            int colonne() const{return position_.colonne();}
            bool occupee() const{return joueur_!=0;}
            Joueur * joueur() {return joueur_;}
            void setJoueur(Joueur * j){joueur_ = j;}
        private:
            Position position_;
            Joueur * joueur_; 
    };
    La classe "Joueur" aurait "simplement" une information de positon (faisant référence à la case sur laquelle il se trouve) et pourrais ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Joueur
    {
        public : 
            Joueur(int lilgne, int colonne):positon_(ligne, colonne){}
            int ligne() const{return position_.ligne();}
            int colonne() const{return position_.colonne();}
            void bougeVers(int linge, int colonne){position_=Position(ligne, colonne);}
        private:
            Position position_;
    };
    Le plateau serait un ensemble de cases et ressemblerait à quelque chose comme
    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
    class Plateau
    {
        public:
            Plateau():cases_(MAXLINGE * MAXCOLONNE)
            {
                 for(size_t ligne = 0; ligne <MAXLIGNE; ligne++)
                 {
                     for(size_t colonne = 0; colonne < MAXCOLNNE; ++colonne)
                     {
                         cases_[ligne * MAXCOLONNE + colonne]= Case(ligne, colonne);
                     }
                 }
            }
            /* une version constante (pour la consultation) et une version
             * non constante (pour permettre de modifier la case (de préciser le joueur ;) )
             */
            Case const & case(int ligne, int colonne) const
            { return cases_[ligne * MAXCOLONNE + colonne];}
            Case & case(int ligne, int colonne) 
            { return cases_[ligne * MAXCOLONNE + colonne];}
        private:
            std::vector<Case> cases_;
    };
    Une fois que tu as ces quatre classes, tu devrait pouvoir faire à peu près ce que tu veux, mais je ne me suis intéressé qu'aux relation qu'il pouvait y avoir entre elles, elle ne sont pas forcément complètes
    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

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Par défaut
    Peut être que la solution proposée est correcte ou simplifiera mon code, mais ilm n'y a pas de moyen de récupérer ce tableau?
    Le passer en argument ou autre?

    Il suffit que je récupère ce tableau, et hop, tout est codé, le joueur a rentré une position? On prends cette position et on agis sur le plateau hop hop !
    Après c'est que des boucles for !

    Donc ca me "tue" un peu d'imaginer que juste pour pouvoir agir sur ce plateau, je doive réécrire toutes mes classes. Alors que le tableau ne doit juste être qu'un élément à prendre.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par CrazyMe Voir le message
    Peut être que la solution proposée est correcte ou simplifiera mon code, mais il n'y a pas de moyen de récupérer ce tableau?
    Le passer en argument ou autre?

    Il suffit que je récupère ce tableau, et hop, tout est codé, le joueur a rentré une position? On prends cette position et on agis sur le plateau hop hop !
    Après c'est que des boucles for !

    Donc ca me "tue" un peu d'imaginer que juste pour pouvoir agir sur ce plateau, je doive réécrire toutes mes classes. Alors que le tableau ne doit juste être qu'un élément à prendre.
    Soyez indulgents avec moi, j'ai fait du C, du C++ (débute) alors difficile quand même. Si vous voyez des erreurs d'écriture ou autre, signalez le, merci !
    Bonjour et bienvenue sur le forum.

    Il faut savoir ce que tu veux : arriver plus vite à du code qui tombe en marche (et qui posera beaucoup beaucoup beaucoup de problème très rapidement) ou te corriger dès le début de ton apprentissage pour faire les choses correctement ?
    Le mieux est donc effectivement de reprendre ton code et le corriger, plutôt que faire une bidouille, qui marchera peut être un temps. Mais seulement un temps.
    Sinon, oui, tu peux probablement faire ce que tu souhaites, le C++ est un langage très permissif (je n'ai pas regardé ton code, utilises les balises CODE plutôt que les copies d'écran)

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par CrazyMe Voir le message
    Peut être que la solution proposée est correcte ou simplifiera mon code, mais ilm n'y a pas de moyen de récupérer ce tableau?
    Le passer en argument ou autre?

    Il suffit que je récupère ce tableau, et hop, tout est codé, le joueur a rentré une position? On prends cette position et on agis sur le plateau hop hop !
    Après c'est que des boucles for !

    Donc ca me "tue" un peu d'imaginer que juste pour pouvoir agir sur ce plateau, je doive réécrire toutes mes classes. Alors que le tableau ne doit juste être qu'un élément à prendre.
    S'il y a deux règles à respecter à tout prix quand on programme, c'est:

    Respecter la responsabilité unique : chaque fonction, chaque classe, chaque type ne doit s'occuper que d'une chose, mais doit bien s'en occuper
    Encapsuler au maxium les informations pour que la seule utilisation qui puisse en etre faite soit celle que tu as prévue qu'il en sera faite (on appelle aussi cela la "loi demeter", adaptée à la programmation, cela revient à : il ne faut pas que l'utilisateur en sache plus que ce qu'il n'a absolument besoin de savoir sur la manière dont sont implémentés tes type )

    En permettant à l'utilisateur (et à toi meme, d'abord et avant tout, vu que tu seras le principal utilisateur de ton plateau )d'accéder au tableau qui constitue ton plateau, tu ouvres tout grand la porte à une série de problèmes si, pour une raison ou une autre, tu décides que la représentation des cases de ton plateau n'est pas optimale sous la forme d'un tableau

    En effet, si tu décide de changer et de passer d'un tableau (fusse-t-il C style, de taille dynamique ou non) à "une autre sorte de conteneur" (cela peut etre une liste, ou une map, avec la position de la case comme clé, pourquoi pas ) tu devras revoir tous les endroits du code où tu auras utilisé le tableau.

    En faisant de la manière que je préconise, tu peux décider à tout moment de changer la manière dont les cases de ton plateau sont représentées, tu n'auras que deux endroits du code à modifier : les versions constante et non constante de case, et tout le reste du code continuera à fonctionner, sans devoir y changer le moindre point virgule

    Mais surtout, du fait que chaque responsabilité (ici : celle de savoir quelle est la position sur le plateau, celle de savoir si une position sur le plateau est occupée, celle maintenir les différentes positions du tableau et celle du joueur) est clairement définie et allouée à un type d'objet bien particulier, tu pourras garder des fonctions les plus simples possibles, et donc tu auras dés le départ un code
    • comportant moins de bugs (la complexité d'une fonction augmente de manière exponentielle à son nombre de ligne: si tu as un risque de faire une erreur de logique dans une fonction d'une ligne, tu en as 100 sans une fonction de 10 lignes et 10000 dans une fonction de 100 lignes...),
    • plus facile à comprendre (on a beaucoup plus facile à comprendre une fonction qui contient juste "return XXX" qu'une fonction qui contient ne serait ce que deux boucles imbriquées et deux tests ),
    • plus facile à débugger ( à partir du moment où tu sais qu'une fonction renvoie un résultat correct, si ce n'est pas le cas, tu sais que tu dois aller voir du coté de la logique qui choisit les arguments à transmettre ),
    • et plus facile à faire évoluer (tu ne devras pas recopier tout un pan de code pour obtenir le résultat, car tu sais qu'une fonction fournit déjà ce résultat, ce qui t'évitera bien des soucis du à un copier / coller trop rapide )
    Crois moi, c'est tout bénéfice, car si ton projet ne contient actuellement que trois classes, il risque fort de ne pas s'en tenir là, et de nombreux projets comptent leur nombre de fichiers par milliers et leur nombre de lignes de code (réelles, donc, en supprimant les retours à la ligne de "convenance" pour faciliter la lecture, les espaces superflus et les commentaires) par centaines de milliers

    Et c'est généralement quand le projet atteint une certaine importance (meme 20 fichiers, cela peut déjà etre considéré comme important quand on débute ) que l'on remarque que les choix "simples" fait au début nous simplifient énormément la vie
    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

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Par défaut
    J'ai bien compris tout cela, mais rien que les fonctions "bénignes" énoncées plus haut sont à la limite des capacités de mon cerveau.

    Loin de là mon envie de faire carrière dans l'informatique, ce sont juste des étapes obligatoires, et quitte à faire ce que je sais faire autant être sur que cela marche.
    Je sais "gérer" mon plateau de jeu, accéder aux éléments dedans, les bouger, mais loin de là mon idée d'avancer dans le projet ou dépasser les limites du jeu.
    Je vais essayer de m'impliquer au mieux dans le C/C++. Mais là ca devient critique au niveau de ma compréhension.

    Edit: J'essaie de comprendre les classes "codées" plus haut et voir si je peux les adapter à mon sujet.

Discussions similaires

  1. lien entre classes managed et unmanaged
    Par FadeOut dans le forum C++/CLI
    Réponses: 3
    Dernier message: 29/11/2010, 21h07
  2. WebService et ComplexType : lien entre classes
    Par macben dans le forum JWS
    Réponses: 1
    Dernier message: 01/10/2009, 10h11
  3. Liens entre classes Monad, Functor, etc.
    Par limestrael dans le forum Haskell
    Réponses: 15
    Dernier message: 11/08/2009, 20h10
  4. liens entre classes
    Par gate35 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/05/2009, 17h01
  5. Réponses: 7
    Dernier message: 28/04/2009, 17h46

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