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 :

Création d'instance dans une boucle ?


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut Création d'instance dans une boucle ?
    Bonjour à tous,

    Je développe actuellement un jeu sous XNA (en C# donc) pour mon projet de fin d'étude de Master 2 Multimédia (je ne suis donc pas un spécialiste de la prog).
    Voila mon problème : l'utilisateur choisit le nombre de joueur (compris entre 3 et 10). A partir de cela, j'aimerais générer X instance de mon objet "Joueur" via une boucle allant de 1 à Xjoueurs (Xjoueurs étant définit par l'utilisateur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int i = 1; i <= _nbJoueurs; i++) {
                    Joueur _joueur+i = new Joueur(.....);
                }
    ou _joueur+i correspond à une instance de joueur plus l'indice de la boucle.
    Cette syntaxe ne marche pas bien évidemment...J'en ai essayé d'autres mais sans succès...
    Auriez vous une solution à mon problème ?
    Si vous avez la moindre question, n'hésitez pas...
    Merci par avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    List<Joueur> kList = new List<Joueur>( iNbJoueur );
    for( int i = 0; i < iNbJoueur ; i ++ )
    {
      kList.Add( new Joueur ( <...> ) );
    }
    generic rulez! Je te conseil de les regarder de près pour pas t'embeter avec ce genre de truc

    En même temps si vous devez coder, essayez aussi de voir ce que c'est la prog Objet... Sinon vous aurez un jeu catastrophiquement réalisé...
    Vous etes pas en équipe avec des dev d'un coté pour vous aider?

  3. #3
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Il faudrait que tu appronfondisses les bases de la programmation C#, tu irais plus vite

    Pour répondre à ta question, je vais rester bref pour éviter de te perdre en parlant de référence, tableau/liste dynamique, portée de variables, génériques, etc...

    Donc, tu désires avoir X instances (objets) de la classe Joueur... Et tu tentes de faire l'instanciation à l'intérieur d'une boucle... Or premier problème auquel tu vas être confronté : ces instances n'existent qu'à l'intérieur de la boucle. Il faut donc les "porter" en dehors de la boucle, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Joueur _joueur = null;
    for (int i = 1; i <= _nbJoueurs; i++) {
        _joueur = new Joueur(.....);
    }
    // Tu peux utiliser la variable _joueur ici
    Le problème avec cette solution, c'est que _joueur ne peut contenir qu'une seule instance, donc la première instance est perdue à cause de la deuxième, la deuxième est ensuite perdue à cause de la troisième, etc.

    Lorsque tu désires manipuler une liste d'instance du même type, on a recourt à des classes qui permettent de contenir des collections d'objets. Le plus basique de tous est le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Ici, _joueurs est un tableau d'objets Joueur.
    // Avec cette instanciation, je dis que je veux que mon tableau contienne X Joueur où X = _nbJoueurs.
    // A noter ici que chaque case contient null, c'est toi d'y mettre une instance de type Joueur
    Joueur[] _joueurs = new Joueur[_nbJoueurs];
    for (int i = 1; i <= _nbJoueurs; i++) {
        // Ici on classe la nouvelle instance dans le tableau
        _joueurs[i-1] = new Joueur(.....);
    }
    // Si tu désires connaîtes le nombre de cases dans ton tableau, tu peux utiliser la propriété Length
    int count = _joueurs.Length;
    // Si tu veux récupérer l'objet Joueur numéro 2, il te suffit de faire
    Joueur tmpJoueur = _joueurs[1];
    Voila, ceci n'est qu'un petit aperçu quand on commence. Si tu as des questions n'hésite pas.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Merci pour cette réponse rapide.
    Non pour ma part c'est un projet individuel...
    J'avais effectivement essayer cette technique avec les generic.
    Le problème est que cela ne fonctionnait pas avec les accesseurs set de "Joueur". Par exemple, si je fais ceci (avec l'accesseur get) ca fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for( int i = 0; i < iNbJoueur ; i ++ )
    {
      kList[i].getNomJoueur;
    }
    Mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for( int i = 0; i < iNbJoueur ; i ++ )
    {
      kList[i].setScore=10;
    }
    cela ne fonctionne plus... Le compilateur me met qu'il lui est impossible de modifier la valeur de retour de.......car il ne s'agit pas d'une variable...

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    On a l'impression que tu écrits des accesseurs C# que tu essayes d'utiliser comme du Java, ou l'inverse (sachant que Java n'a pas d'accesseurs).

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    getNomJoeur et SetScore sont des méthode ou des propriétés?

    essaye avec joueur comme cela plutot :
    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
     
    class Joueur
    {
      private string m_Nom = "Nom";
      public string Nom
      {
        get{ return m_Nom; }
        set{ m_Nom = value; }
      }
     
      private uint m_Score = 0;
      public uint Score //Je doute qu'un score soit négatif... Quoi que...
      {
        get{ return m_Score; }
        set{ m_Score = value; }
      }
     
    }
    Les "Propriétés" évite d'avoir des méthode get...(); ou set...();
    le get permet de récupérer la valeur,
    le set de la mettre à jour.

    Mais la valeur elle même est contenue dans un membre (voir plusieurs, voir aucun) Tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
      private uint m_NbEnnemiesKilled = 0;
      private uint m_NbGirlsKissed = 0;
     
      public uint Score //Je doute qu'un score soit négatif... Quoi que...
      {
        get{ return m_NbEnnemiesKilled + m_NbGirlsKissed; }
        //set{ m_Score = value; } // ici pas de set, la propriété est "read-only"
      }

  7. #7
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Question bète : Tu écris bien un propriété (qui est en fait un accesseur en Dotnet) comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public string NomJoueur
    {
    get{return _nomJoueur;}
    set{_nomJoueur = value;}
    }
    ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Merci à tous.
    J'ai effectivement fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public string NomJoueur {
    get{return _nomJoueur;}
    set{_nomJoueur = value;}
    }
    du coup j'arrive à accéder au get mais pas à modifier via le set....

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    joueur.NomJoueur = "Toto";
    ?

  10. #10
    Membre éprouvé Avatar de Nikoui
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Tu n'aurai pas défini Joueur comme une structure par hasard ?

    Si c'est le cas, transforme la en classe, ça devrait fonctionner, et accessoirement ça ressemblera déjà plus à de la programmation objet

  11. #11
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par Nikoui Voir le message
    Tu n'aurai pas défini Joueur comme une structure par hasard ?

    Si c'est le cas, transforme la en classe, ça devrait fonctionner, et accessoirement ça ressemblera déjà plus à de la programmation objet
    ????

    N'a pas compris, moi ...ca marche plus, ca, en C#, selon toi ?
    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
    public struct Toto {
            private string _nom;
     
            public string Nom {
                get { return _nom; }
                set { _nom = value; }
     
            }
        }
     
        public class cToto {
            private Toto t;
     
            public cToto() {
                t.Nom = "nom";
            }
     
        }
    Et moi qui croyais betement qu'en C#, une structure pouvait avoir des proprietes...


    Je pense que le probleme vient plus de l'acces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    kList[i].setScore=10;
    kList[i].setNomjoueur="toto";
    a renommer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kList[i].Score=10;
    kList[i].Nomjoueur="toto";
    Mais bon ... c'est pitet pas ca non plus

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  12. #12
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Hrmmm.....


    ben entendu, le code precite est a prendre comme un sample bacle en 2 secondes avec le snippetCompiler, c'est pas du coe a mettre en prod (cToto...ca va pas la tete )

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  13. #13
    Membre éprouvé Avatar de Nikoui
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    N'a pas compris, moi ...ca marche plus, ca, en C#, selon toi ? [...]
    Je pensais plutôt à truc dans le genre :

    http://msdn2.microsoft.com/fr-fr/lib...2c(vs.80).aspx

    (puisque que l'auteur du post parle à un endroit du message d'erreur "impossible de modifier la valeur de retour...")

  14. #14
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Stabe, histoire qu'on arrête de s'enfoncer, il serait peut être préférable que tu nous donnes le code de ta classe joueur et le code qui utilise les accesseurs de ta classes

  15. #15
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut
    Merci à tous ca marche.
    Au départ j'avais effectivement mis le Joueur en structure, mais j'avais changé depuis longtemps en classe... La j'ai remodifié 2/3 trucs et sa marche ...
    Je tiens donc à tous vous remercier pour votre précieuse aide !!!

  16. #16
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par Nikoui Voir le message
    Je pensais plutôt à truc dans le genre :

    http://msdn2.microsoft.com/fr-fr/lib...2c(vs.80).aspx

    (puisque que l'auteur du post parle à un endroit du message d'erreur "impossible de modifier la valeur de retour...")
    Intéressant, j'aurais certainement fait l'erreur, oubliant les conséquence que peu avoir d'avoir des données non permanente.

    Sinon je ne savais pas que MSDN avais si bien détaillé les code erreur du compilateur.
    Très intéressant

Discussions similaires

  1. Création de contrôles dans une boucle
    Par koktel_dfr dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/01/2010, 14h36
  2. [E-03] Création de graph dans une boucle
    Par chichichocho dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/01/2009, 19h22
  3. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10
  4. Création d'objets dans une boucle for
    Par urban_p dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/06/2008, 10h34
  5. probleme de création de variable dans une boucle
    Par misterweb dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2007, 19h21

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