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 :

Problème sur les objets en c++


Sujet :

C++

Vue hybride

skamy Problème sur les objets en c++ 17/05/2010, 17h19
hijackMe Salut skamy ! Alors pour... 18/05/2010, 09h24
skamy Tout d'abord merci hijackMe... 18/05/2010, 11h20
Syl_20 J'ai l'impression qu'en plus... 18/05/2010, 11h56
hijackMe Alors une des solutions... 18/05/2010, 11h57
skamy Encore merci pour tous ces... 18/05/2010, 14h39
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut Problème sur les objets en c++
    Bonjour à tous !

    Je suis désolé de venir posté ici mais j'ai eu beau me casser la tête en cherchant sur google et autres je reste démuni face à mon problème. Il paraitra (je l'espère pour avoir une réponse tout du moins ) surement un peu simpliste à vos yeux mais je vous assure que j'y ai passé des heures entières dessus.

    Pour remettre ceci dans le cadre, j'ai pour projet dans mon école de développer un équivalant au jeu Bomberman en c++. Etant plutôt doué pour le Java (évitez les tomates et les oeufs pourris ) et ayant un cours restreint (1 semaine) de c++ (qui plus est mal fait) je me retrouve comme un poussin avec un brosse à dent autorotative à air comprimé (non ne cherchez pas je doute que ça existe).

    Voici comment j'ai abordé le problème à l'heure actuelle :

    Classe Bombe qui prends comme params une portée (int) et des coordonées (classe que je fais).

    Classe Coordonnées qui prends comme params x/y.

    Classe Jeu qui prends en params le nombre de joueurs et le nombre de parties.

    Classe Joueur qui prends en params des coordonnées de départ.

    La liste n'est pas complète, je ne vais pas vous balancer tout mon projet à la figure comme un malpropre non plus. Donc pour résumer, mon idée était d'instancier les joueurs selon le nombre donné dans la création de la classe Jeu dans une méthode initGame(). Cette méthode instancie les joueurs sans soucis, et je le fais comme qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Coordonates startPlayer4(1,1);
    Player * player4 = new Player(startPlayer4);
    Par contre, une fois dans mon main, si j'ai le malheur d'essayer de caler un player4->dropBomb() pour poser une bombe, voilà que le compilateur m'insulte car il me dit ne pas connaître de player4. Par contre si je crée un player4 dans le main de la même manière, aucun soucis il me crée la bombe. Mais à nouveau, même soucis pour la bombe, une fois crée dans la méthode de la classe, elle n'existe plus dans le main, ou tout du moins je n'y ai pas accès.

    Voilà mon super premier problème !

    Mais j'ai un autre sushi ! (Ca serait pas drole sinon )

    Sachant que tous les joueurs posent des bombes, ils passent tous par la méthode dropBomb() de la classe Joueur. Je cherche donc à pouvoir instancier un nombre illimité (40 en fait mais le problème reste quasi le même) de bombes et de pouvoir ensuite récupérer le temps qu'il leur reste avant d'exploser et là ... je coince aussi.

    Merci à tous ceux qui sont arrivés jusqu'ici (C'est déjà un miracle ) et encore plus merci à ceux qui pourront m'aider


    Votre humble serviteur skamy

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Salut skamy !
    Donc pour résumer, mon idée était d'instancier les joueurs selon le nombre donné dans la création de la classe Jeu dans une méthode initGame(). Cette méthode instancie les joueurs sans soucis, et je le fais comme qui suit :

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Coordonates startPlayer4(1,1);
    Player * player4 = new Player(startPlayer4);
    Par contre, une fois dans mon main, si j'ai le malheur d'essayer de caler un player4->dropBomb() pour poser une bombe, voilà que le compilateur m'insulte car il me dit ne pas connaître de player4.
    Alors pour ce problème, et d'après ce que j'ai pu comprendre, ton problème vient du fait que tu instancies player4 dans une méthode sans retourner l'adresse de cette instance. De ce fait le main ne peut pas connaître player4. Ce qui explique d'ailleurs pourquoi cela marche lorsque tu instancies cet objet directement dans le main.

    Le code de ta méthode pourrait donc être du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Player *initGame()
    {
        ...
        //Instanciation de l'objet de type Player :
        Coordonates startPlayer4(1,1);
        Player * player4 = new Player(startPlayer4);
        //retour de l'objet :
        return player4;
    }
    Bon, passons aux bombes.
    Connaissant le jeu bomberman je suppose que les 40 bombes ne vont pas apparaître en même temps, donc chaque bombe à un timer différents qui décompte les secondes de manière indépendant les un des autre.
    Dans cet ordre d'idée je pense que tu devrais faire un tour du côté des threads... D'un autre coté, 40 threads ça risque de faire beaucoup pour de simples petites bombe... Sans compter ceux nécessaires au déplacements des joueurs...
    La meilleure idée serait peut être de créer une "horloge globale" qui à chaque seconde décrémente le timer des bombes posés sur le plateau...

    J'espère t'avoir aidé

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Tout d'abord merci hijackMe pour ta réponse !

    De mémoire, une méthode ne peut retourner qu'une valeur non ? Alors comment retourner l'adresse de mes 4 joueurs instanciés ?
    De mémoire, il suffisait d'utiliser justement des pointeurs pour retourner plusieurs méthodes et c'est ce que j'ai essayé de faire.

    Au niveau des bombes, mon problème n'est pas (encore) au niveau des timers mais plutôt au niveau de leur création. Il y a 4 joueurs qui ont 4 coordonnées différentes. Pour pouvoir les instancier, j'ai crée une méthode dropBomb() dans ma classe Player qui peut récupérer Player::getFireRange() et Player::getCurrentCoordonates() car mon protoype du constructeur de Bomb est de type Bomb::Bomb(int _fireRange, Coordonates _bombCoordonates).

    Mon soucis est de savoir quoi foutre dans dropBomb() afin que je puisse faire dans mon main player->dropBomb() 10 fois à la suite sans qu'il me recrée le même objet. Et après ça, savoir comment pouvoir chopper le getTimeToExplose() pour pouvoir la faire exploser quand il vaut 0.

    En fait, j'ai l'impression de prendre le problème des bombes complètement à l'opposé de ce que je devrais :s

    Dernière question : J'aurai voulu savoir si il y avait un moyen de voir si un objet est instancier ou n'existe pas encore. J'ai essayé (player == null) mais en y réfléchissant ça devrait être plutôt (*player = null, non ?)

    Encore merci pour tes éclairecissements !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par skamy Voir le message
    Tout d'abord merci hijackMe pour ta réponse !

    De mémoire, une méthode ne peut retourner qu'une valeur non ? Alors comment retourner l'adresse de mes 4 joueurs instanciés ?
    De mémoire, il suffisait d'utiliser justement des pointeurs pour retourner plusieurs méthodes et c'est ce que j'ai essayé de faire.

    Au niveau des bombes, mon problème n'est pas (encore) au niveau des timers mais plutôt au niveau de leur création. Il y a 4 joueurs qui ont 4 coordonnées différentes. Pour pouvoir les instancier, j'ai crée une méthode dropBomb() dans ma classe Player qui peut récupérer Player::getFireRange() et Player::getCurrentCoordonates() car mon protoype du constructeur de Bomb est de type Bomb::Bomb(int _fireRange, Coordonates _bombCoordonates).

    Mon soucis est de savoir quoi foutre dans dropBomb() afin que je puisse faire dans mon main player->dropBomb() 10 fois à la suite sans qu'il me recrée le même objet. Et après ça, savoir comment pouvoir chopper le getTimeToExplose() pour pouvoir la faire exploser quand il vaut 0.

    En fait, j'ai l'impression de prendre le problème des bombes complètement à l'opposé de ce que je devrais :s

    Dernière question : J'aurai voulu savoir si il y avait un moyen de voir si un objet est instancier ou n'existe pas encore. J'ai essayé (player == null) mais en y réfléchissant ça devrait être plutôt (*player = null, non ?)

    Encore merci pour tes éclairecissements !
    J'ai l'impression qu'en plus des problèmes de c++ tu as des problèmes de conceptions:
    Tu pourrais faire une class CPlayerManager qui a pour role de gerer tes 4 joueurs. Cette classe a 4 instance de class CPlayer. Comme ça tu gère la présence ou non de joueurs, leur points, vie... sans utiliser de pointeur.

    Tu peux aussi faire une classe CBombManager qui va gérer tes bombes implémenter dans des class CBomb qui a un timer.
    CBombManager gère le temps et décrémente le timer de chaque bombe présente à chaque mise a jour du programme et fait sauter celles qui arrive à 0.

    CPlayerManager CBombManager serrai par exemple singleton(voir sur le site comment implémenter de design patern singleton, c'est facile)

    ce qui donnerai dans dropBomb() un truc du genre

    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
     
     
    CPlayer::dropBomb()
    {
       CBomb() l_bomb;
        CBombManager::Instance().AddBomb(l_bomb);
    }
     
    // dans CBombManager
     
    CBombManager::AddBomb(CBomb i_bomb)
    {
       if (vectorBomb.size < MAX_BOMB ) // MAX_BOMB  le max de bomb sur le plateau
       {
            vectorBomb.push_back(i_bomb);
       }
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    De mémoire, une méthode ne peut retourner qu'une valeur non ? Alors comment retourner l'adresse de mes 4 joueurs instanciés ?
    Alors une des solutions possible serait de créer un tableau de pointeur où chaque case pointe vers un Player.
    Il te suffirait alors de retourner le tableau !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i=0; i<4; i++)
    {
       Player *monPlayer = new Player();
       monTableau[i] = monPlayer;
    }
    return monTableau;
    Mon soucis est de savoir quoi foutre dans dropBomb() afin que je puisse faire dans mon main player->dropBomb() 10 fois à la suite sans qu'il me recrée le même objet. Et après ça, savoir comment pouvoir chopper le getTimeToExplose() pour pouvoir la faire exploser quand il vaut 0.
    Pour pouvoir créer dynamiquement des objets, tu peux utiliser la même méthode que celle utilisée plus haut.
    A savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bomb *myBomb = new Bomb(myFireRange, myCoordonates);
    A toi par la suite de stocker les différentes adresses des objets et les manipuler pour accéder a leurs méthodes...

    Pour le test d'existence, je ne suis pas sûr mais le test de nullité devrait fonctionner sans le *...

    EDIT : +1 syl_20

  6. #6
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Encore merci pour tous ces éclairecissements !

    Oui j'ai des gros problèmes de conception. Hormis quelques bouts de code par ci par là, c'est la première fois que je code réellement en c++. Habitué au java j'ai pas à faire des .h et des .cpp, pas de soucis de pointeurs, pas de références, rien de tout ça. Ce sont des notions super nouvelles pour moi et ça m'embète bien :/

    Voilà mon code qui instancie les joueurs dans initGame() :

    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
    switch(Game::getNumberOfPlayers()) {
    		case 4 : {
    			Coordonates startPlayer4(1,1);
    			Player * player4 = new Player(startPlayer4); 
    			cout << "Player 4 created, Coordonates : " << endl;
    			player4->getCurrentCoordonates().display();
    		}
    		case 3 : {
    			Coordonates startPlayer3(2,2);
    			Player * player3 = new Player(startPlayer3);
    			cout << "Player 3 created, Coordonates : " << endl;
    			player3->getCurrentCoordonates().display();
    		}
    		case 2 : {
    			Coordonates startPlayer2(3,3);
    			Player * player2 = new Player(startPlayer2);
    			cout << "Player 2 created, Coordonates : " << endl;
    			player2->getCurrentCoordonates().display();
     
    			Coordonates startPlayer1(4,4);
    			Player * player1 = new Player(startPlayer1);
    			cout << "Player 1 created, Coordonates : " << endl;
    			player1->getCurrentCoordonates().display();
    		}
    	}
    Malgré ça, si je passe un return player4; hors du switch(en ayant changé le type de return de ma méthode bien sur), il le connait pas non plus. Il me sort le magnifique :

    1>c:\users\max\documents\projet dev\bomberman\game.cpp(24) : error C2065: 'player4'*: identificateur non déclaré
    Pareil, quand j'essaye dans mon initGame() de voir si les joueurs sont instancier pour les remettre à leur emplacement de départ (pour une deuxième partie par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if(*player1 != NULL) {
    		switch(Game::getNumberOfPlayers()) {
    			case 4 : {
    				player4->setCurrentCoordonates(1,1);
    			}
    			case 3 : {
    				player3->setCurrentCoordonates(2,2);
    			}
    			case 2 : {
    				player2->setCurrentCoordonates(3,3);
    				player1->setCurrentCoordonates(4,4);
    			}
    		}
    	}
    Que je mette * ou pas devant player, il veut pas me faire ce test, il me ressort le truc du dessus.


    Syl_20, en ce qui concerne ta réponse j'ai l'impression que je pourrais en apprendre énormément, mais les termes sont trop techniques et je pige pas la moitié des trucs :s De ce que je pense avoir compris, tu me conseilles de créer deux classes managers dans lesquelles j'instancierai les joueurs et les bombes respectivement et que j'aurai à instancier une seule fois dans mon main c'est bien cela ?

    Qu'est censée faire cette ligne ? Et à quoi correspond exactement ton vectorBomb ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBombManager::Instance().AddBomb(l_bomb);

    Je m'excuse de vous embêter avec tout cela car ça doit vous paraître enfantin, mais je suis vraiment pommé et l'année se joue la dessus. J'ai beau essayer pendant des heures des idées qui me traversent la tête mais plus j'avance et plus je vois que les choses me dépassent.

    En tout cas encore une fois un grand MERCI pour toute cette précieuse aide

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par skamy Voir le message
    Oui j'ai des gros problèmes de conception. Hormis quelques bouts de code par ci par là, c'est la première fois que je code réellement en c++. Habitué au java j'ai pas à faire des .h et des .cpp, pas de soucis de pointeurs, pas de références, rien de tout ça. Ce sont des notions super nouvelles pour moi et ça m'embète bien :/
    Normalement que tu code en Java ou en C++ la conception est la même. Si tu connait UML les diagrammes sont les mêmes. Le rest qui t'enbete n'est que l'implémentation


    Citation Envoyé par skamy Voir le message
    Syl_20, en ce qui concerne ta réponse j'ai l'impression que je pourrais en apprendre énormément, mais les termes sont trop techniques et je pige pas la moitié des trucs :s De ce que je pense avoir compris, tu me conseilles de créer deux classes managers dans lesquelles j'instancierai les joueurs et les bombes respectivement et que j'aurai à instancier une seule fois dans mon main c'est bien cela ?
    une classe pour manager les joueurs:

    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
     
    CPlayermanager
    {
    private:
    //... des trucs ici pour le singleton
    public:
        CPlayer m_player1;
        CPlayer m_player2;
        CPlayer m_player3;
        CPlayer m_player4;
    };
     
    #include <vector>
    CPlayerManager
    {
    private:
    //... des trucs ici pour le singleton
    public:
        void AddBomb(CBomb i_bomb);
        void UpDateTimer();
    protected:
        std::vector<CBomb> m_bombVector; // vector=> vecteur de la STL
    };
    Citation Envoyé par skamy Voir le message
    Qu'est censée faire cette ligne ? Et à quoi correspond exactement ton vectorBomb ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBombManager::Instance().AddBomb(l_bomb);
    BombManager::Instance() => recherche singleton sur developpez.com

    Citation Envoyé par skamy Voir le message
    Je m'excuse de vous embêter avec tout cela car ça doit vous paraître enfantin, mais je suis vraiment pommé et l'année se joue la dessus. J'ai beau essayer pendant des heures des idées qui me traversent la tête mais plus j'avance et plus je vois que les choses me dépassent.
    J'ai l'impression que tu par en live mod panique sans savoir faire du tout un bomber man. Même en Java tu a l'air mal parti.

    Je te conseil d'abord de faire ta conception sans penser au langage avec un diagramme genre UML. Et une fois que tu sais quoi faire passe à la programmation: Java ou C++ . J'ai fais un peu de Java et le codage sera pas plus compliqué.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2014, 14h35
  2. Jeu en Silverlight : problème sur les objets trop rapides
    Par tom741 dans le forum Silverlight
    Réponses: 8
    Dernier message: 28/10/2010, 14h18
  3. Réponses: 2
    Dernier message: 22/01/2009, 10h28
  4. Réponses: 5
    Dernier message: 24/04/2005, 04h09
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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