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 :

Relecture de code d'un jeu RPG


Sujet :

C++

  1. #1
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut Relecture de code d'un jeu RPG
    bonjour

    alors voila enfin un premier jet du projet rpg en c++ aprés quelque semaine que je vous bassine avec mes questions. les sources sont téléchargeable.

    si vous avez des commentaires ou reflexion ou idée ou autre je suis ouvert a tout.

    bug constater au niveau de la suppression des monstre et raison trouver mais pas encore corriger.

    voila je vous laisse apprécier.
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Bonjour,

    Je ne comprend pas la raison de la présence de deux .h dans le dossier "doxygen". En théorie, doxygen doit lire les fichiers de code et non des fichiers à part.

    Personnellement, j'aime bien mettre les fichiers sources (.c et .h) dans un dossier "src" afin qu'ils ne soient pas mélangés avec les fichiers du projet ou les fichiers de données. Les fichiers de données, j'aime bien qu'ils soient dans un dossier "data". Mais ce ne sont que des avis personnels.

    Attention, "Personnage.h" possède une majuscule alors qu'il est inclut sans majuscule dans les autres fichiers. Sachant que tous les autres fichiers sont sans majuscule, je propose de renommer le fichier en "personnage.h". La raison de cette remarque est que sur un système stricte qui respecte correctement la casse (comme Linux), la compilation renvoie des erreurs (comme actuellement sur mon système). Sous Windows, cela n'est certes pas le cas, mais autant faire bien (bien ==> que ça marche chez moi ).
    Autre problème avec Windows VS Linux. Vous avez fait une inclusion de windows.h (dans main.h) qui est un fichier spécifique à Windows. Mais bon, il est nécessaire vu que vous utilisez les fonctions de la WinAPI je ne pourrais donc pas tester .
    Il semble aussi qu'il reste quelques avertissements (warnings) dans le code. Il faudrait réellement songé à les corriger.

    J'ai remarqué que vous avez de nombreux include dans main.h alors que ceux-ci pourrait être effectué dans les fichiers qui en ont réellement besoin (main.cpp, par exemple). En effet, il faut minimiser le nombre d'inclusion qui sont effectuer dans les fichier .h (afin de la compilation soit plus rapide, entre autre, mais aussi que le code soit plus modulaire (en effet, à cause des inclusions dans les .h ont a tendance à ne pas les faire dans les .cpp faisant que si vous réutiliser votre code, il ne va pas trouver les fichiers nécessaires)

    main.h contient des structures qui pourraient être déplacé dans un fichier qui leur est propre (je déteste les fichiers qui centralisent tout, du genre "common"). Par exemple, un fichier SMap.h/SMap.c pour la gestion de SMap. De plus, SMap est définit comme une structure laissant tous les membres à l'air libre, mais possède aussi des fonction du genre tileAt(). En fait, il faudrait transformer SMap en classe, rendre les membres privés afin que personne (aucune classe ou développeur externe) ne puisse modifier le contenu de la map sans en avoir autorisation par la Map elle même. En effet, la Map doit être géré que par la map. Si un élément externe modifie la Map, il peut arriver que celui-ci fasse n'importe quoi (et puis sa violerai certains principe d'encapsulation et autre que koala01 ne se gênerait pas de rappeler ).

    Un autre détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SMonstre(std::string nom, int hp, int mp, std::string type, int exp, int gold):
                nom(nom), hp(hp), mp(mp), type(type), exp(exp), gold(gold){}
    À chaque appel à ce constructeur, la std::string passée sera copier (la copie d'un objet est une opération qui peut être lente). Il est donc conseiller de définir les paramètres nom et type comme des const std::string& afin d'éviter la copie. À l'utilisation, cela ne change rien, mais la copie sera bel est bien éviter. (voir la FAQ : http://cpp.developpez.com/faq/cpp/?page=references pour quelques informations supplémentaires).
    Cette remarque s'applique pour tout le code et non que pour ce constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<unsigned char> tiles;
    	std::map<Position, SWrap> wraps;
    	std::map<Position, SCoffre> coffres;
    Essayez de choisir un seul langage lorsque vous nommez vos variables. Ici, on voit un mélange de français et d'anglais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void tilegamer(Joueur & joueur)
           {
               tiles[joueur.y()*cols + joueur.x()] = '@';
           }
    Ici, la référence (qui évite bien la copie) devrait être constant, car le joueur n'est pas modifié. Le problème (j'imagine, car je n'ai pas vérifié) c'est qu'en le faisant, le compilateur va raler en disant que vous utilisez des fonctions non constantes (y() et x()). Comme les fonction y() et x() ne devrait pas non plus modifié le joueur (car ce sont des getters/accesseurs), vous pouvez les définir comme fonctions constantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    size_t x() const{return position_.x();}
             size_t y() const{return position_.y();}
    super, elles le sont déjà :clap:

    Essayez de respecter une convention de nommage sur tout le projet. Je vois des classes qui ont des noms qui commence avec une majuscule (ce qui est "bien"), mais je vois aussi personnage et enemy sans majuscule (ce qui n'est pas normalisé avec le reste du code).

    Le destructeur de personnage doit être virtuel, car la classe est hérité. Explication : http://cpp.developpez.com/faq/cpp/?p...UCTEUR_virtuel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Deplacement(int x, int y):distanceX_(x),distanceY_(y)
            {
                 assert(x>=-1 && x<=1);
                 assert(y>=-1 && y<=1);
            }
    Ce choix devrait être documenté (doxygen) ou commenté. Il peut y avoir une autre solution, c'est de tronqué la valeur lorsqu'elle est plus grande (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     (if x > 1) x=1; 
    // ...
    )

    Sachant que l'assertion ne sera pas présente lorsque le code est compilé en release. Mais soit, c'est un choix qui se défend.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void enemy::afficherinfo()
    {
        std::cout << m_nom << " " << m_hp << " " << m_mp << " " << m_type << " "
            << m_xp << " " << m_argent << std::endl;
    }
    Il était aussi possible de surcharger l'opérateur << pour la classe. Mais c'est aussi un choix.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *etat = "proteger";
        if(strcmp(etat, m_etat) != 0)
    Ouch, vous êtes en C++ (11) et vous avez encore des strcmp/char*
    etat peut être défini comme un std::string et pour la comparaison il suffira d'utiliser l'opérateur ==.

    Ouch * 2 m_etat est aussi un char* alors qu'il pourrait être un std::string.
    Et même, pour faire du C correct, il faudrait que le pointeur soit constant (const char*). Mais bon, la question ne se pose pas lorsque l'on utilise des std::string.

    Comme vous utilisez plusieurs fois "normal", on peut imaginer une table de string, ou une énumération au lieu d'avoir une répétition de la clé en dur. Ce qui évitera des erreurs. On peut aussi imaginer des choses plus complexes mais cela dépend du besoin (qui a parlé de classe de politique, de design pattern de stratégie ? (mais nous verrons cela un peu plus tard )).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void player::levelup()
    {
        m_level = m_level + 1;
        m_nextlevel = m_nextlevel * 1.5;
        m_maxhp = m_maxhp * 3/4;
        m_maxmp = m_maxmp * 3/4;
    }
    Beaucoup de nombres magiques que je mettrais en variable statique/constante membre de la classe.

    afficherinfo() et tout autre fonction d'affichage peuvent être des méthodes constantes.

    Je trouve le main imposant. Il doit y avoir des possibilités de le décomposer. De plus, il faudra tot ou tard instauré une boucle de jeu (game loop) afin que la gestion du jeu soit bien structurée. (exemple simple : http://fearyourself.developpez.com/t...l/sdl/morpion/ ou http://fearyourself.developpez.com/tutoriel/sdl/pong/ ; exemple plus complexe : http://khayyam.developpez.com/articl.../architecture/ )

    J'ai remarqué que le main possède une grosse partie de copier coller, ou seul la Direction change (copier coller pour chaque touche appuyée). Cela est fortement simplifiable/factorisable . La création de nouvelle méthode (et de part se fait, de classe) permettra de rendre le code plus clair, plus simple et moins sujet à des oublies ou des bogues, car le copier coller (ou la duplication de code) c'est généralement le mal !

    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
     
    bool operator <(Position const & first, Position const & second)
    {
        return first.x() < second.x() ||
                  (first.x() == second.x() && first.y() < second.y() );
    }
    /* et, tant qu'à faire, te l'opérateur de comparaison == (pour d'autres
     * usages ultérieurs, très certainement ;)
     */
    bool operator ==(Position const & first, Position const & second)
    {
        return ( first.x() == second.x() && first.y() == second.y() );
    }
     
    bool operator !=(Position const & first, Position const & second)
    {
        return  !(first == second);
    }
    Cela trouvera une meilleure place dans le fichier position.h/position.c car c'est lié à la classe Position.

    En théorie, dans main.cpp il ne devrait y avoir que la fonction main (tout autre fonction devrait se trouver dans une classe). De plus, le main est généralement très court (initialisation + lancement de la boucle principale et hop, c'est fini ).

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Deplacement computeDeplacement(size_t xOrigin, size_t yOrigin, SMap const & Map, TOUCHE touche)
    {
         /* on va considérer que touche peut valoir "up","down","left" et "right"
          * sous la forme de valeurs énumérées ;)
           */
         switch(touche)
         {
             case haut:
             /* si on rencontre un "#" en haut, on est bloqué :aie */
             if (Map.tileAt(xOrigin, yOrigin-1) == '#')
             {
                 return Deplacement(0,0);
             }
             else if(Map.tileAt(xOrigin, yOrigin-1) == 'O')
             {
                 return Deplacement(0,0);
             }
             return Deplacement(0,-1);
     
    		 case bas:
             /* si on rencontre un "#" en bas, on est bloqué :aie */
             if (Map.tileAt(xOrigin, yOrigin+1) == '#')
             {
                 return Deplacement(0,0);
             }
             else if(Map.tileAt(xOrigin, yOrigin+1) == 'O')
             {
                 return Deplacement(0,0);
             }
             return Deplacement(0,1);
     
             case gauche:
             /* si on rencontre un "#" à gauche, on est bloqué :aie */
             if (Map.tileAt(xOrigin-1, yOrigin) == '#')
             {
                 return Deplacement(0,0);
             }
             else if(Map.tileAt(xOrigin-1, yOrigin) == 'O')
             {
                 return Deplacement(0,0);
             }
             return Deplacement(-1,0);
     
    		 case droite:
             /* si on rencontre un "#" à droite, on est bloqué :aie */
             if (Map.tileAt(xOrigin+1, yOrigin) == '#' )
             {
                 return Deplacement(0,0);
             }
             else if(Map.tileAt(xOrigin+1, yOrigin) == 'O')
             {
                 return Deplacement(0,0);
             }
             return Deplacement(1,0);
         }
         /* on ne devrait jamais arriver ici, mais ca évite un avertissement du
           * compilo, et puis, sait on jamais ;)
           * Pour toutes les autres touches, on ne bouge pas :D
           */
        return Deplacement(0,0);
    }
    Je crois (disons je dois en être même certain) qu'il est possible de remplacer les Deplacement(0,0) (ou autre valeurs) par des variables ayant des nombres plus clair (HAUT/BAS/GAUCHE/DROITE). Rendant le code beaucoup plus clair (je pense). Pour ce faire, on pourrait utiliser des macros, mais les macros sont sujets aux erreurs. On peut aussi imaginer utiliser des variables constantes (statiques ?) par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const Deplacement HAUT = Deplacement(0,1);
    qui serait membre public de la classe Deplacement.

    Mais bon, je chipote peut être un peu de trop.

    Ce que j'attends vraiment (car c'est un vrai point à améliorer) c'est la refactorisation du main, qui est trop massif et qui contient trop de duplication du code.

    Voilà
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    bon bah alors je vais voir tout ça je te remercie d'avoir pris le temps de me souligner tout ces problemes.

    pour doxygene a vrai dire je ne savais pas à quoi il servait et les fichiers qui sont à l'intérieur sont des anciens fichiers inutiles.

    pour les classes sans majuscule je comprend cela provient du fait qu'il on été fait à la va vite.

    pour la version Linux elle sera la aussi la j'ai mis sur Windows car j'utilisais sur Windows mais la version sera portable.

    et pour le reste je vais essayer de palier à ça et faire des retours prochain.

    pour tout autre commentaire ou autres je les attend tout est bon à prendre

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Pour le franglais, je ne suis pas sûr: Est-ce qu'on utilise un autre mot que l'anglais "tiles" sur la scène française?
    Il y a des anglicismes dont la traduction n'est pas évidente, ou "sonne" maladroit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour le franglais, je ne suis pas sûr: Est-ce qu'on utilise un autre mot que l'anglais "tiles" sur la scène française?
    J'ai vu utiliser le terme tuiles. Mais ça ne m'avait pas paru très naturel.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    J'ai vu utiliser le terme tuiles. Mais ça ne m'avait pas paru très naturel.
    On dit bien "tuile", et on écrit "tile" dans le code et les commentaires.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    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
    J'en rencontré et utilise "tuile" aussi... mais j'aime pas ça

  8. #8
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    question portabilité du programme je me vaguement de quelque chose mais je ne retrouve pas exactement.

    je me souviens d'un #ifdef system puis aprés c'est flou si quelqu'un pourrais me renseigner un peu plus car l'endroit ou je l'avais trouver a été supprimé et google ne m'en dis pas plus

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Citation Envoyé par devdeb91 Voir le message
    question portabilité du programme je me vaguement de quelque chose mais je ne retrouve pas exactement.

    je me souviens d'un #ifdef system puis aprés c'est flou si quelqu'un pourrais me renseigner un peu plus car l'endroit ou je l'avais trouver a été supprimé et google ne m'en dis pas plus
    Hum, ça, ce serait la méthode pas fiable, pas très résistante est compliqué à mettre en place. Le mieux est d'utiliser une bibliothèque qui le fait pour nous. Dans votre cas (si j'ai bien compris, un programme dans la console), le combo ncurses/pdcurses pourrait être un bon choix.
    Sinon, lorsque vous voudriez une fenêtre complète et des sprites, la SFML sera un choix aussi très intéressant.

    Mais sinon, oui, avec ifdef, pour compiler des morceaux de code selon la plateforme, même si cette solution est loin d'être à privilégier.

    (La recherche à faire : precompiler tests for specific OS code))
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    alors SFML c'est prévu mais pour plus tard lorsque j'aurai un truc qui tiens bien la route et propre.

    ncurses j'y travail dés que j'ai compris le système je post une version du coup elle sera portable et un peu mieux que la première

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Je vous conseille de corriger déjà les erreurs rapportées, cela sera une première bonne étape et permettra de continuer sur une bonne base.

    pour les classes sans majuscule je comprend cela provient du fait qu'il on été fait à la va vite.
    Je ne sais pas, une majuscule ou non, ça se voit directement et puis avant de poster du code pour une relecture de code, on le relit un minimum afin qu'il soit encore plus propre.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    j'ai déjà corrigé une bonne partie des erreurs rapportées actuellement je suis sur le portage.

    et j'ai relu sinon je me serais pas permis de demander un avis c'est la moindre des choses

  13. #13
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour le franglais, je ne suis pas sûr: Est-ce qu'on utilise un autre mot que l'anglais "tiles" sur la scène française?
    Je dirais "case", mais c'est pas un mot pratique (inutilisable en minuscule).

  14. #14
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Le problème c'est que tiles nous paraisse cohérent pour ce qu'on essaie d'exprimer, alors que c'est comme tuile en fin de compte, mais comme en anglais ça sonne mieux...

    Je penses que le mot tile vient du besoin d'exprimer qu'il s'agit d'un fragment ayant des caractéristiques communes et étant rattaché à un organe plus grand (une map)...

    Du coup pour un mot français intéressant, il faudrait plutôt chercher un mot qui traduit cette notion, comme la tuile le fait, mais qui sonne mieux que ce dernier (personnellement j'ai plein de mots mais aucun ne va)

    Bon courage DevDeb91 pour ton jeu, et passe à la SFML ( 2° fois que je te le dis et même LittleWhite te l'as dit... )! Sinon une fois les défis techniques terminés, tu vas vite te décourager avec un programme console, et tu voudras tout refaire avant même d'avoir scripter le moindre morceau d'histoire (traduction pour toi et moi : avant même d'avoir atteint le village de Besaid), des mois vont s'écouler, et tu va voir que tout ce temps pourrait te servir à faire une version 2D vachement plus jolie, surtout avec la motivation que tu as, et la soif d'apprendre que tu as.

  15. #15
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    la SFML va arriver ne t’inquiète pas tout viens à point à qui sait attendre mais honnêtement j'ai en tête de voir plus du coté 3D que 2D ou sinon 2D mais qui pète comme dans l'original


    question ncurses c'est bon c'est intégrer et sa marche.

    je passe a la factorisation du main mais j'ai encore du mal a voir comment je vais faire. si vous avez des idées je serais ravi.

    a oui aussi quelque petite modif donc plus de bug monstre. player et monstre on des stats ( force etc...).

  16. #16
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Tu devrais commencer à séparer ton main en fonctions : (par la suite tu peux même en faire des classes)
    *load
    *save
    *clavier
    *actions

    #edit (personne en question trouvée)
    Comme le dit la signature de leternel :
    Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    !

  17. #17
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    alors voila un fonction que j'ai fait pour réduire le main

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    bool deplacejoueur(int ch, SMap &Map, Joueur &joueur, list<Enemy> &monstre, Player &tidus, map<Position, string> &maplist, bool &change)
    {
        bool exit = false;
        TOUCHE touche;
        if(ch == KEY_UP)
            touche = haut;
        else if( ch == KEY_DOWN)
            touche == bas;
        else if( ch == KEY_RIGHT)
            touche = droite;
        else if( ch == KEY_LEFT)
            touche = gauche;
        else if( ch == 27)
            exit = true;
     
            if(exit == false)
            {
                  Map.tileremplace(joueur);
            Deplacement deplacement = computeDeplacement(joueur.x(), joueur.y(), Map, touche);
               joueur.move(deplacement);
               if(Map.tileAt(joueur.x(), joueur.y()) == '_')
               {
                   cout << "teleporteur" << endl;
                   cout << joueur.x() << " " << joueur.y() << endl;
                   Position posgamer = Map.gamerNextPosition(joueur.x(), joueur.y());
                   cout << posgamer.x() << " " << posgamer.y() << endl;
                   //Teleport tele(joueur);
                   Position posmap = Map.nextMap(joueur.x(), joueur.y());
                   cout << posmap.x() << " " << posmap.y() << endl;
                   auto it = maplist.find(Position(posmap.x(),posmap.y()));
                   loadMap(Map, (*it).second );
                   joueur.changepos(posgamer.x(), posgamer.y());
                    cout << joueur.x() << " " << joueur.y() <<endl;
                   //Joueur joueur(posgamer.x(), posgamer.y());
                   //Map.tilegamer(joueur);
                   //auto it = maplist.find(Position())
                   //loadMap(Map.nextMap(joueur.x(), joueur.y()));
                   //tele(Map.gamerNextPosition(joueur.x(), joueur.y()));
               }
               else if(Map.tileAt(joueur.x(), joueur.y()) == 'C')
               {
                   cout << "coffre" << endl;
                   string contenue = Map.coffreContaint(joueur.x(), joueur.y());
                   cout << contenue << endl;
                   modiffichier(Map, joueur.x(), joueur.y(), change);
                   change = true;
                   Map.tilecoffre(joueur);
                   Deplacement dep = computeDeplacement(joueur.x(), joueur.y(), Map, bas);
                   joueur.move(dep);
     
               }
                else if(Map.tileAt(joueur.x(), joueur.y()) == 'M')
               {
                   Map.monstre.clear();
                   srand(time(NULL));
                   int nbmonstre = 0;
                   while(nbmonstre == 0)
                   {
                       nbmonstre = rand() % 6;
                   }
                   string filename = Map.title + "_monstre" + ".txt";
                   cout << "nombre monstre " << nbmonstre << " " << "nom fichier " << filename << endl;
                   for(int i = 0; i < nbmonstre; i++)
                   {
                       chargemonstre(Map, filename, i);
                   }
     
                   int xp = 0;
                   int argent = 0;
                   for(int i = 0; i < nbmonstre; i++)
                   {
                       cout << "monstre " << i <<endl;
                      auto it = Map.monstre.find(i);
                   cout << it->second.nom << " " << it->second.hp <<" "<< it->second.mp << " " <<
                           it->second.type << " " << it->second.exp << " " << it->second.gold << endl;
                           monstre.push_back(Enemy(it->second.nom, it->second.hp, it->second.mp, it->second.type, it->second.exp, it->second.gold,
                                                   it->second.force, it->second.esprit, it->second.magie, it->second.constitution, it->second.rapidite,
                                                   it->second.precision, it->second.esquive));
                           //ennemi.push_back(Enemy(it->second.nom, it->second.hp, it->second.mp, it->second.type, it->second.exp, it->second.gold));
                           xp = xp + it->second.exp;
                           argent = argent + it->second.gold;
                   }
     
                   list<Enemy>::iterator it;
                   for(it = monstre.begin(); it != monstre.end(); it++)
                   {
                       //cout << *it1 << endl;
                   }
                   while(nbmonstre != 0)
                   {
                       int choix = 0;
                       cout << "entrer choix monstre " << endl;
                       cin >> choix;
                       it = monstre.begin();
                       advance (it, choix-1);
                       tidus.attaquer(*it);
                       /*for(int i = 0; i < nbmonstre; i++)
                       {
                           monstre[i].IA(tidus);
                       }*/
                        for(it = monstre.begin(); it != monstre.end(); ++it)
                            {
                                bool vivant = it->est_vivant();
                                if(vivant == false)
                                    {
                                        it = monstre.erase(it);
                                        nbmonstre--;
                                    }
                                else
                                        it->IA(tidus);
                            }
     
                       tidus.afficherinfo();
                       bool vivant = tidus.est_vivant();
                       if(vivant == false)
                       {
                           tidus.~Player();
                           return 0;
                       }
                       if(nbmonstre != 0)
                        {
                            for(it = monstre.begin(); it != monstre.end(); it++)
                                it->afficherinfo();
                        }
     
                       /*for(int i = 0; i < nbmonstre; i++)
                       {
                           monstre[i].afficherinfo();
                           bool alive = monstre[i].est_vivant();
                           if(alive == false)
                             {
                                 monstre[i].~Enemy();
                                 nbmonstre--;
                             }
                       }*/
                   }
               }
               return false;
            }
            else
                return true;
     
    }
    il compile bien sans erreurs mais a ce niveau la

    il bloque il prend pas le choix et bug quelque instant puis reprend et attaque le premier de la list

  18. #18
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Du coup pour un mot français intéressant, il faudrait plutôt chercher un mot qui traduit cette notion, comme la tuile le fait, mais qui sonne mieux que ce dernier (personnellement j'ai plein de mots mais aucun ne va)
    "tuile" est le mot que l'on utilise en traitement d'images. Cela surprend au début, et pourtant c'est bien celui que l'on emploie.

    (c'est aussi celui que l'on emploie dans le milieu des jeux de plateau à ... tuiles -> tikal, catane, carcasonne (IIRC), etc)

    Mais bon ... avoir des identifiant en français est la chose qui me gêne le plus. On a vite fait de se retrouver avec des horreurs comme getNextJoueur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  19. #19
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    il compile bien sans erreurs mais ne fait pas se qui est dans le code alors que par logique vue que je travail directement avec les valeurs il devrai faire exactement comme il faisait dans le main
    Où as tu mis ça ? Si c'est dans ton main, as tu bien fait apparaître
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deplacejoueur(ch, Map, joueur, monstre, tidus, maplist, change)
    ?
    Mais bon ... avoir des identifiant en français est la chose qui me gêne le plus. On a vite fait de se retrouver avec des horreurs comme getNextJoueur.
    Un getNextJoueurBitmap pourait être encore plus effrayant

  20. #20
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    bon finalement j'ai réussi. En fait le problème était moi et non le code

    alors voila un main() de 30 ligne environ c'est bon ou faut encore raccourcir ?

Discussions similaires

  1. [Recrutement] [Jeu PHP Online] Elendra, jeu RPG en ligne en php.
    Par Morpheus_Elendra dans le forum Projets
    Réponses: 1
    Dernier message: 06/06/2009, 23h41
  2. Réponses: 2
    Dernier message: 25/06/2008, 10h55
  3. Réponses: 2
    Dernier message: 08/01/2008, 15h25
  4. JEU RPG en flash
    Par TRUNKS-SSJ7 dans le forum Flash
    Réponses: 8
    Dernier message: 29/09/2006, 17h49
  5. Projet jeu RPG/moteur 3D isométrique avec SDL
    Par Milan111 dans le forum Projets
    Réponses: 4
    Dernier message: 13/04/2006, 22h01

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