Partage
  • Partager sur Facebook
  • Partager sur Twitter

Distribution de role - JAVA

    6 février 2016 à 15:05:04

    Bonjour :)

    Alors je me suis lancé il y a pas longtemps dans la programmation Bukkit, j'avais déjà un peu d'expérience en JAVA, donc j'ai pas trop trop trop soucis. Mais aujourd'hui j'ai un problème, j'aimerais stocker des métiers et que ceux ci soient distribuer automatiquement. Par exemple, le métier mineur ne peut être assigner qu'à 3 joueurs alors que le métier banquier ne peut être distribuer qu'à un joueur. 

    J'ai commencé par faire ça dans une Map:

    		Map<Integer, Integer> metier = new HashMap<Integer, Integer>();
    		metier.put(1, 3);
    		metier.put(2, 1);
    


    Le premier Integer correspond à l'ID du métier (que je fixe dans ce HashMap) et le deuxième Integer correspond au nombre restante de " place libre " pour ce métier.

    Donc a  chaque fois que j'assigne à un joueur un métier, il faut que je fasse - 1 sur la valeur correspondante du HashMap. Donc un remove puis un put.. Seul soucis, c'est que d'après certaines recherches sur Internet, ce n'est pas du tout adapter.

    Donc je viens vers vous pour discuter de tout ça. Comment concevoir mon programme de cette sorte ? Assigner chaque ID a un role et lui donner une valeur de nombre de places dispo ...

    Je me creuse les neurones mais sans aucun succès .. Une idée ? :)

    Merci à vous !

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2016 à 17:40:19

      Je pense plutôt que tu devrais directement compter le nombre de joueurs ayant le métier voulue, et mettre dans une configuration le nombre max.
      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2016 à 17:47:20

        Mais il faut bien que je les distribue ces métiers ? Et que pour les distribuer, il faut qu'il soit stocker à un endroit ?

        Tiens je te connais v4vx :3 (funkyemu)

        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2016 à 17:54:10

          Mais tu veux répartir les métiers de façon aléatoire au démarrage par exemple ?

          Car si c'est le cas, une map est nécessaire pour enregistrer les compteurs, par contre, mettre le nombre max dans une config est fortement conseillé.

          Bizarre que tu me connaisse, je ne fais pourtant pas de minecraft ^^

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2016 à 18:08:22

            Mais tu veux répartir les métiers de façon aléatoire au démarrage par exemple ?
            
            Car si c'est le cas, une map est nécessaire pour enregistrer les compteurs, par contre, mettre le nombre max dans une config est fortement conseillé.

            Donc ok, fallait bel et bien que je procède comme ça.

            Une map avec 2 Integer, un pour l'ID (que je fixe directement dans la map), et un pour le compteur.

            Mais je n'ai pas compris pourquoi il est conseillé de mettre ça dans une config ?

            Et pour faire baisser le compteur dans la map, il faut bien que je remove la ligne puis que j'en rajoute une ? :)

            Bizarre que tu me connaisse, je ne fais pourtant pas de minecraft 

            Funky-emu ne fait pas que du minecraft :p

            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2016 à 18:14:53

              Ben l'intérêt de la config est de ne pas avoir une liste de map.put tout moche au plein milieu du code, de plus, si tu as un nouveau métier, ou que tu veux changer les nombres max, tu n'auras pas à chercher dans le code, ni recompiler ;)

              Sinon pour update, pas besoin de remove, un put réécris par dessus, si une valeur était déjà présente à la clé donnée.

              map.put(id, map.get(id) - 1));


              Après tu n'es pas non plus totalement obligé d'utiliser une map, tu peux aussi mettre le compteur directement en tant que champ dans la classe du métier. Mais je ne suis pas trop pour cette solution, car la classe métier n'a pas à gérer quelque chose de l'environnement...

              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2016 à 18:48:52

                Merci !

                Et du coup, ya t-il un moyen de sélectionner un ID aléatoire dans la map ? Sélectionner un ID seulement si le nombre de place dispo est > 0

                • Partager sur Facebook
                • Partager sur Twitter
                  7 février 2016 à 12:13:51

                  List<Integer> ids = new ArrayList<>();
                  
                  for(Map.Entry<Integer, Integer> entry : map.entrySet()){
                      if(entry.getValue() > 0)
                          ids.add(entry.getKey());
                  }
                  
                  if(ids.isEmpty()){
                      //Pas de job libre
                  }else{
                      Random rand = new Random(); //Je crée un nouvelle instance, mais il est préférable d'avoir une instance "partagée". C'est juste pour l'exemple
                      //On récupère un id de job. Random.nextInt(max) renvoie un entier dans l'interval [0, max[ (max exclus), pour ça que je n'ai pas mis -1
                      int freeJobId = ids.get(rand.nextInt(ids.size()));
                      //Faire ce que tu as à faire...
                  }

                  Voilà l'idée.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Distribution de role - JAVA

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown