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

JavaScript Discussion :

Instance de classe dans une boucle


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut Instance de classe dans une boucle
    Pour mon entraînement JavaScript, je suis en train de développer un petit jeu de cartes et j’essaie de ranger le gros du code js dans des bibliothèques.

    J’ai une classe greenbaize (« tapis vert »), une classe seat (place) et une classe player (joueur). Les seat « possèdent » les players, c’est-à-dire, une propriété de la classe seat est player, qui prend des instances de la classe player. Les instances de la classe seat sont regroupées dans un array. Le tout est géré dans la classe greenbaize.

    Voici à quoi ressemble la méthode init de greenbaize

    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
        function init() {
            let positionsNames = getPositionsNames(seatscount);
            for (let i = 0; i < seatscount; i++) {
                let index = getRandomInt(0, population.length);
                let p = new player(
                    population[index].name,
                    population[index].type,
                    population[index].activeFactor,
                    population[index].agressionFactor);
                console.log(p.getName());
                let s = new seat(i, positionsNames[i], p);
                seats.push(s);
                population.splice(index, 1);
            }
            seats.forEach(function (item) {
                console.log(item.getPositionName(), item.getPlayer().getName());
            })
        }
    Seat et position ce n’est pas la même chose. Un seat est associé à un joueur tout au long de la partie, c’est son siège. La position c’est en fonction du donneur (le dealer, le cut-off, la blinde, etc.), et change donc à chaque coup.

    Donc, je fais une boucle d’autant d’itérations que de sièges occupés. J’instancie une classe seat autant de fois, et je l’ajoute à l’array des sièges. Jusqu’ici, tout va bien.
    Le problème vient avec les joueurs. Diverses console.log() me permettent de dire qu’il y a bien un player distinct qui est créé à chaque itération, mais qu’il écrase le précédent sur toutes les instances seat.
    A l’arrivée, j’ai bien un array d’objets seat distincts, mais l’attribut player de tous ces seat pointent vers une même instance de player.
    Dans l’hypothèse où j’ai bien compris ce qui se passe.

    Les deux console.log() du code donnent le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Molly Bloom
    Lily Candide
    James Bond
    Doyle Brunson
    Dealer Doyle Brunson
    Blind Doyle Brunson
    Middle Position Doyle Brunson
    Cut-off Doyle Brunson
    Ce qu’il faudrait, évidemment, c’est qu’une nouvelle instance de player n’écrase pas les autres.
    Si vous avez une idée, je suis preneur.
    Merci d’avance

  2. #2
    Membre très actif
    Homme Profil pro
    bricoleur par les mots
    Inscrit en
    Avril 2015
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : bricoleur par les mots
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2015
    Messages : 744
    Par défaut
    jour

    sa donne quoi en pushant () directement l'instance cree

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seats.push(new seat(i, positionsNames[i], p));

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    Merci pour ta réponse.

    Mais ça ne change rien. D'ailleurs, j'aurais été très surpris que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                let s = new seat(i, positionsNames[i], p);
                seats.push(s);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                seats.push(new seat(i, positionsNames[i], p));
    donnent des résultats différents.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    En fait, j'ai compris mon erreur. Si ça peut aider quelqu'un, c'était le constructeur de player qui n'allait pas ; j'avais oublié de déclarer les propriétés.

    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
    let player = function (_name, _type, _activeFactor, _aggressionFactor) {
        function init() {
            name = _name;
            type = _type;
            activeFactor = _activeFactor;
            aggressionFactor = _aggressionFactor;
        }
        init();
     
        return {
            getName: function () {
                return name;
            },
    ...
    });
    alors qu'il fallait écrire

    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
    let player = function (_name, _type, _activeFactor, _aggressionFactor) {
        let stack = 12;
        let name;
        let type;
        let activeFactor;
        let aggressionFactor;
     
        function init() {
            name = _name;
            type = _type;
            activeFactor = _activeFactor;
            aggressionFactor = _aggressionFactor;
        }
        init();
     
        return {
            getName: function () {
                return name;
            },
    ...
    });

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    En attendant ...

    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Utiliser une instance de classe dans une Winform
    Par DonatienMnts dans le forum C#
    Réponses: 2
    Dernier message: 15/10/2015, 14h11
  2. changer le nom d'une class dans une boucle
    Par diice dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2012, 09h52
  3. [PHP 5.0] creer plusieurs instances d'une classe dans une boucle
    Par supersonicblonde dans le forum Langage
    Réponses: 6
    Dernier message: 12/04/2011, 09h06
  4. Comment créer une liste ou une instance de classe dans une fonction ?
    Par Neolander dans le forum Général Python
    Réponses: 9
    Dernier message: 05/03/2008, 19h22
  5. Réponses: 3
    Dernier message: 02/09/2007, 21h16

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