Partage
  • Partager sur Facebook
  • Partager sur Twitter

Création d'un jeu par navigateur

Gestion des automatismes dans le temps

    16 septembre 2019 à 22:22:26

    ok autant pour moi du coup;)

    on va faire comme si j'avais rien dit lol:p

    -
    Edité par AaFredericHusson 16 septembre 2019 à 22:23:30

    • Partager sur Facebook
    • Partager sur Twitter

    Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

      17 septembre 2019 à 7:38:52

      Comme je reçois encore les post sur ce sujet ...

      @AaFredericHusson : décidément tu as du mal à comprendre ce que j'ai écrit puisque nous avons déjà eu à échanger sur un autre sujet où tu ne comprenais déjà pas ce que j'écrivais.

      J'ai donc écrit en début de discussion, je cite:

      Si c'est sans nul doute possible mais cela ne complique t-il pas l'architecture logicielle ? ...


      @KévinThais a bien compris ma phrase qui me semble sans ambiguïté et je le remercie pour sa réponse ci-dessus.

      Bye

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2019 à 9:59:02

        KévinThais a écrit:

        Bonjour à tous!

        Et me revoilà pour une question simple mais je n'ai pas trouvé de réponse sur Google alors je compte, encore une fois, sur une âme charitable qui serait capable de me venir en aide svp.

        Tout d'abord, merci encore Pifou25 pour tes conseils car ils m'ont été très utiles... Tout s'est passé comme sur des roulettes!

        J'en suis à la partie combat et j'ai un doute sur la propreté du code que j'utilise . C'est fonctionnel, ça évite beaucoup de duplications mais je n'ai trouvé nulle part sur le Net quelqu'un qui validait ce script en tant que "script propre" si je puis dire...

        J'appelle une méthode avec une variable comme ci-dessous:

        Admettons que j'ai une class "Test" avec ses getters ($Test->atribut()) et setters ($Test->setAtribut()) pour ses attributs qui sont $test_1, $test_2 et $test_3.

        Ce que je cherche à faire c'est appeler telle méthode en fonction des valeurs que peut prendre une variable:

        $variable = 'test_1'; // ou 'test_2' ou encore 'test_3'... Sa valeur varie
        
        $getMethod = $variable; // $Test->attribut()
        $setMethod = 'set' . ucfirst($variable); // $Test->SetAttribut()
        
        // get:
        $Test->$getMethod();
        
        // set:
        $Test->$setMethod();

        Alors? Est-ce du code propre ou pas?


        Et même question pour les noms de variables:

        $partie_1 = 'truc';
        $partie_2 = 'much';
        
        ${$partie_1 . $partie_2} = 'chose'; //corrigé: c'est une concaténation
        // Ce qui donnerai:
        
        $trucmuch = 'chose';
        
        

        Merci d'avance!

        -
        Edité par KévinThais il y a environ 12 heures


        Salut,

        je réponds rapidement à ce post:

        Ce que tu décris ce sont des noms de variables dynamiques, c'est utilisé pour la méthode d'hydratation d'un objet car cela permet au développeur d'appeler les setters d'une classe sans forcément connaitre les noms des attribut par cœur ^^:

        <?php
            public function hydrate(array $data) {
                foreach ($data as $key => $value) {
                    //Comme le dirait julp, ici ucfirst n'est pas obligatoire
                    //car le nom des méthode est insensible à la casse
                    $methodName = 'set'.ucfirst($key);
                    if(method_exists($this, $methodName)){
                        $this->$methodName($value);
                    }
                }
            }

        Perso, un code "propre" est un code bien commenté (commentaire documentant + quelques commentaires sur les parties "non triviales"), bien indenté, peu importe son contenu, la logique est propre à chacun, l'important est que le résultat soit le bon.

        -
        Edité par christouphe 17 septembre 2019 à 10:00:47

        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2019 à 10:32:05

          Salut à tous!

          Tout d'abord, je te le confirme @Moonkey3d, ta phrase est limpide comme de l'eau de roche ^^!

          Merci @christouph pour ta réponse, tu as tout compris! En effet c'est ce que je me disais... ça évite les duplications donc ça doit être positif.... Je suis ouvert à toute suggestion à ce sujet!

          Merci!

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2019 à 10:52:56

            je ne te montrerai pas le moteur de tir de mon jeu car c'est un exemple de bordel ^^, mais le principal c'est que l'unité tire dans les condition définies :D
            • Partager sur Facebook
            • Partager sur Twitter
              18 septembre 2019 à 22:23:27

              hello Kevin c'est cool de voir que tu avance j'espère qu'on pourra voir le résultat bientôt ;) 

              Moi perso, je trouve pas ça très propre d'utiliser les variables variables, c'est dangereux car tu t'expose au risque d'appeler une méthode qui n'existe pas... En plus, je suppose qu'en terme de performance c'est moins bon car le programme doit faire de l'introspection pour déterminer si la méthode existe - ou pas (quoique, sais pas si php fonctionne comme ça, après tout ce n'est pas un programme compilé)...

              En terme de maintenance c'est la misère, tu a intérêt à bien commenter ton affaire comme dit chris ^^ d'un autre côté, si ça marche bien, pourquoi pas, et la "propreté" du code c'est une notion assez relative. si cette possibilité existe c'est  bien pour être utilisée :) 

              • Partager sur Facebook
              • Partager sur Twitter
                19 septembre 2019 à 9:23:11

                Pour répondre à pifou25 sur l'usage des variables dynamiques (et non variables) https://www.php.net/manual/fr/language.variables.variable.php que j'ai préconisé en réponse au besoin de KévinThais, il est tout à fait possible de gérer l'appel à une méthode qui n'existe pas en générant une exception. Je ne pense pas que ce soit dangereux dans ce cas.

                J'utilise ce type de solution dans le cas d'une I.A. type assistante personnel que j'ai développé en php (et oui ...) et ce qui me permet d'ajouter progressivement de nouvelles fonctions dynamiquement.

                En terme de maintenance je ne vois pas trop pourquoi c'est la misère ... j'ai une fonction qui sert de dispatcher sur les méthodes et donc le code me semble bien architecturé.

                A+

                • Partager sur Facebook
                • Partager sur Twitter
                  19 septembre 2019 à 13:09:29

                  Salut Pifou et merci (encore ^^) pour ta réponse!

                  Pour ce qui est du risque d'appeler une méthode qui n’existe pas, je me suis assuré que ça n'arrive pas avec des vérifications  et autres.... Donc si je m'y prends bien ça devrait aller....

                  Et, comme l'a dit Moonkey3d (merci pour tes conseils) J'ai une exception qui gère ça au cas où en plus de mes vérifications et je me suis assuré que ça n'arrive pas (enfin je crois^^)...

                  Maintenant passons aux choses sérieuses... AU SECOURS !!!! ^^ Je suis en train de me casser les dents sur l'algorithme de calcul de combats contre une IA et , encore une fois, je vais avoir besoin de vos lumières car Je sais ce que je veux faire mais je n'ai absolument aucune idée sur la façon d'y arriver.

                  J'ai testé beaucoup, beaucoup, beaucoup (boucle infinie ^^) de systèmes différents mais aucun ne me semble bon.

                  En gros, actuellement la situation est la suivante:

                  Mes unités (qui sont des instances d'une class Unit)  ont 4 stats de combat différentes: - class, - health, - resistance et - damages.

                  L'équipe du joueur (qui est une instance d'une class UnitList) se bat contre l'équipe IA (qui est une instance d'une class UnitList aussi).

                  La class UnitList contient donc la liste des unités avec leur nombre respectifs.

                  (cette structure est la dernière que j'ai utilisé parmi des dizaines...)

                  Ce que je cherche à faire c'est un combat en 3 rounds avec des priorités d'attaques et de défenses ... exemple:

                  1er round:

                  unité de class 1 tape sur resistance de l'unité de class 4

                  si resistance de l'unité de class 4 tombe à zéro... unité de class 1 tape sur health de l'unité de class 4

                  si health de l'unité de class 4 tombe à zero, l'unité de la class 4 est morte, l'unité de class 1 change de cible pour recommencer tant que ses damages ne sont pas tous utilisés et ainsi de suite pour toutes les unités du joueur...

                  Pareil pour l'IA.

                  2eme round:

                  on déduit les morts de chaque côté et on recommence avec les nouvelles équipes.

                  3eme round:

                  idem que le 2eme round mais le combat s'arrête qu'il y ait des survivants ou pas à la fin du round.

                  Mon problème c'est que ce principe demande beaucoup de conditions imbriquées et je ne trouve pas ça très propre du coup j'ai essayé le système le plus simple possible... Totaliser damages, health et resistance de chaque équipe et en déduire les pertes à la fin de chaque round... Cependant (ça aurait été trop facile), c'est cette sélection des pertes qui me pose problème car avec ce système là, je ne peux plus utiliser (ou je n'y arrive tout simplement pas) les priorités d'attaques et de défenses de l'exemple précédent et du coup, je ne sais pas trop comment sélectionner mes pertes (tant d'unités de class 1, tant d'unités de class 2 etc...) ...

                  Bref, j'espère que ces explications ne sont pas trop confuses car dans ma tête c'est le "bordel"...

                  je pense que je n'ai pas la bonne approche et que c'est la raison pour laquelle je patauge autant...

                  Est-ce que quelqu'un pourrait me mettre sur la voie svp?

                  Je ne cherche pas du code mais une "marche à suivre", histoire de savoir comment m'y prendre...

                  Merci d'avance!

                  Cdt!

                  -
                  Edité par KévinThais 19 septembre 2019 à 13:17:17

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 septembre 2019 à 13:21:07

                    Salut,

                    Alors commençons par ce qui fait le moins mal:

                    Qui attaque en premier ?

                    Ensuite:

                    • Où est situé ton code de résolution d'attaque ?
                    • Chaque tour est nouveau donc par définition les priorité restent les même un peu comme l'initiative dans WH

                    Pour les pertes, elles doivent se faire "à la volée" dans le tour. Sachant que en commençant par un algo simple:


                    si un groupe de 10 unit1 (10 pv/ut, 5 att/ut) attaque un groupe de 5 unit4 (40 pv/ut 7 att/ut) et bien la résolution peut se faire de la façon suivante:

                    TOUR 10 unit1 contre 5 unit4 :

                    • 5 * 10 = 50 att de unit1 du groupe 1 vont tuer 1 unit4 du groupe 2
                    • 7 * 5 = 35 att de unit4 du groupe 2 vont tuer 3 unit1 du groupe 1

                    TOUR 2 7 unit1 contre 4 unit4

                    etc...

                    -
                    Edité par christouphe 19 septembre 2019 à 13:23:24

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 septembre 2019 à 20:33:18

                      Oula! Attends, tu vas trop vite pour moi...

                      Alors, Qui attaque en premier? ça c'est facile...

                      En fait je veux faire un système d'attaques simultanées... il n'y aura pas de 1ere attaque venant d'un partis, ils vont taper en même temps, c'est pourquoi je ne calcule les pertes qu'à la fin de chaque round. (1 frappe de chaque unité / round)

                      Donc pour ce qui est de la résolution d'attaque, bah pour le moment elle est à la fin de chaque round.

                      Je comprends ton algo christouph car j'ai commencé par celui-ci mais mon problème est que j'ai 12 unités différentes réparties en 4 class et si je veux des priorités d'attaques et de défenses entre les class et les unités, je n'arrive pas à faire autrement qu'avec des imbrications de conditions qui sont (à mon avis) très lourdes .

                      Je cherche justement à trouver un autre système car celui-ci est très simple avec 3 ou 4 unités mais avec 12 unités (et surement plus dans la version finale) il devient un peu brouillon et difficile à lire (et ça ne me plaît pas du tout) alors je cherche une autre piste plus appropriée .

                      Je suis conscient du fait que j'essaye de réaliser quelque chose de complexe avec des algo simples, mon erreur et peut-être aussi, en partie, dans ce raisonnement.

                      J'ai besoin de points de vue à ce sujet aussi.... je pense connaître la réponse (car ça paraît logique) mais je pose quand même la question...

                      Est-ce que pour créer quelque chose de très complexe (j'ai exposé qu'une infime partie des stats et divers bonus qui vont se rajouter au combat) mon algorithme doit évidemment l'être aussi?

                      Merci

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 septembre 2019 à 20:54:49

                        Comme tu demandes des points de vue, mon avis, qui est tout à fait contestable j'en conviens, c'est que ce que tu veux faire n'est pas domaine de l'algo classique.

                        Il me semble que c'est plus du deep learning c'est à dire une branche de l'I.A.. ou de la recherche opérationnelle.

                        J'ai mis en oeuvre en php de l'I.A. pour traiter des sujets un peu complexe dont l'algo classique n'est pas tenable.

                        https://php-ml.readthedocs.io/en/latest/

                        Je ne suis pas suffisamment compétent sur ton sujet pour proposer quelque chose de concret mais c'est peut-être une ouverture à creuser.

                        A+

                        -
                        Edité par monkey3d 19 septembre 2019 à 20:57:55

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 septembre 2019 à 20:58:25

                          Sinon tu peux aussi travailler en "bataillon" de X unités

                          Sinon je ne comprends pas la complexité sur le nombre d'unité puisque tu résouds tout à la fin du tour.

                          Il faut que tu décides qui sera en première ligne et tu tapes dans le tas non ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 septembre 2019 à 21:44:30

                            Si ton algorithme t'amène à faire un trop grand nombre de boucles imbriquées, tu devrais envisager un algorithme récursif :) 

                            du style:

                            function calculRound( UnitList attaquant, UnitList defenseur, integer round) {

                            // attaquant de la ligne du round sur défenseur ligne N - round

                            // défenseur N - round sur attaquant, ligne round 

                            // round est l'index du round en cours, N est le nb total de rangs dans l'armée

                            // si ( condition à définir précisément pour éviter la récursion infinie...) {

                              calculRound( attaquant, defenseur, round + 1);

                            et voila :) bon ok c'est très simpliste j'ai vraiment rien détaillé c'est juste une idée en l'air

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 septembre 2019 à 21:55:41

                              Bah en fait christouph, c'est pas la réalisation qui me pose problème c'est plutôt la lisibilité du code.... je cherche à réaliser mon algo avec le moins d'imbrication de conditions possible donc je me demandais si il n'y avait pas une autre approche que celle-ci... avec une autre structure qui limiterait les imbrications à quelques-unes plutôt que des dizaines...

                              Si je veux pouvoir effectuer un calcul sur chaque stat de chaque unité en fonction de la cible et ses stats, il me faut (avec la structure actuelle) des multiples conditions pour chaque type d'unité ... bref c'est exponentiel ... et ça me paraît très très lourd... (j'ai rien de fonctionnel pour le moment mais avant même d'avoir terminé, la redondance des conditions et le nombre incalculable de variables me paraît démesuré pour ce que je veux faire mais je me trompe peut-être...).

                              Moonkey3d merci pour le lien, je vais y jeter un œil pour voir si ça peut m'aider!

                              Je reste ouvert à toute suggestion pertinente pour un petit coup de pousse.

                              Merci Pifou25,

                              C'est exactement ce que j'ai fait! J'ai pas "N" pour le rang mais "class" (attr de la class "Unit") mais le résultat est le même.

                              et comme tu le dis c'est simple... mais si on rajoute à ça, les priorités d'attaques et de défenses et cela pour 12 unités différentes (pour le moment) on obtient une fonction avec des "if" dans des "if" et des "elseif" et des "switch" à n'en plus finir ça me paraît aberrant d'avoir un code si lourd pour un seul combat, mais c'est peut-être nécessaire... j'en sais rien et mon problème est là.

                              -
                              Edité par KévinThais 19 septembre 2019 à 22:05:29

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 septembre 2019 à 22:30:52

                                as tu fait un diagramme de décision ? Tu pourrais voir combien de branche tu as déjà

                                Après, tu peux "diluer" les décisions dans les classes, normalement au "moment" du tir, les stats du tireur ne sont pas à calculer, elle le sont déjà en amont, même chose pour le défenseur

                                -
                                Edité par christouphe 19 septembre 2019 à 22:32:14

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 septembre 2019 à 23:11:53

                                  Les stats sont calculées au début de chaque round car le joueur va choisir une stratégie de combat avant chaque round avec des bonus sur les stats et autres...

                                  Donc ce que j'ai actuellement (que je trouve lourd) c'est:

                                  1- lancement du combat (avec le contenu des 2 équipes et leurs bonus respectifs)

                                  2- choix des bonus pour le 1er round

                                  3- 1er round:

                                  * telle unité tape sur telle autre etc... jusqu'à ce que toutes les unités aient tapé(c'est cette partie qui est très lourde)

                                         $survivants = 0 -> fin du combat

                                         $survivants != 0 -> round 2

                                  choix des bonus pour le 2eme round

                                  4- round 2 :

                                  idem

                                  choix des bonus pour le 3eme round

                                  5- round 3 :

                                  idem mais fin du combat qu'il y ait des survivants ou pas.

                                  Voilà en gros à quoi ressemble mon script en ce moment.

                                  -
                                  Edité par KévinThais 19 septembre 2019 à 23:12:35

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 septembre 2019 à 10:44:50

                                    Q1: chaque unité cible une unité adverse ? => déjà c'est super lourd, perso je le ferai pour une amélioration (la première)

                                    Comment gères-tu ce cas ? Manuellement ou c'est une décision en fonction de la distance (par exemple) ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 septembre 2019 à 12:38:33

                                      R1: Chaque class d'unité cible une autre class en priorité et ensuite quand toutes les cibles de la class sont détruites l'unité switch de class cible jusqu'à passer les 4 class si besoin est.

                                      Et dans ces mêmes class je voudrait qu'il y ait aussi des priorités du genre : c'est l'unité 3 de la class qui attaque (ou défend) en premier, ensuite la 2 et la 1.

                                      Je sais que c'est lourd mais ça pousse à la stratégie et ça rend les combats plus intéressants.

                                      Ce cas est immuable, il n'y a pas de paramètre variable. ce sera tjrs la class 1 qui tapera en premier et toujours l'unité 3 de cette même class qui tapera en premier parmi les autres unités de la class.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 septembre 2019 à 12:41:12

                                        Comment tu définis unité {1-3} ?? Un attribut spécial ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 septembre 2019 à 12:49:53

                                          Oui je les défini par leur "nom"
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 septembre 2019 à 12:51:50

                                            Je veux dire que si l'ordre d'attaque est défini par leur nom, change de nom et l'ordre est changé...

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 septembre 2019 à 19:34:47

                                              Pourquoi veux-tu changer l'ordre ou le nom je ne comprends pas...?

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                20 septembre 2019 à 21:45:00

                                                il a raison christouphe, si chaque unité "sait" qui et comment elle doit attaquer / défendre, et que c'est spécifique à chaque unité, tu dois créer une classe par unité: 

                                                Class Gardiens extends Unit ... Class Archer extends Unit ... Class Chevalier extends Unit ... etc, chaque classe a ses méthodes (attaquer / Defendre / degats / cible / ...) ta classe Unit devient une classe abstraite, et tout ce qui est spécifique à une unité va se coder sans sa classe. Tu a ensuite un tableau des unités à gérer 1 par 1, round par round.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  21 septembre 2019 à 8:17:07

                                                  Ah carrément !? 1 class par unité!?

                                                  J'avoue que c'est ce que j'ai fait pour tout le reste (mines, silos, technologies...) mais vu qu'il y en a beaucoup (des unités) je me suis dit qu'il fallait peut-être différemment mais, ok ce sera certainement plus simple de faire comme ça.

                                                  Du coup je suppose que tout ce qui est, stats (bon ça c'est évident),  priorités et bonus constants, je les mets dans chaque class et du coup, ensuite je n'aurais plus qu'à ajouter les bonus de début de round et le déroulement du combat dans mon script de combat.... (avec le nombre d'unités) ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    21 septembre 2019 à 14:14:31

                                                    C'est de l'héritage, donc chaque classe aura son propre code, et quand tu diras à ton archer d'attaquer, bah il saura qui attaquer si l'unité en face est présente, c'est justement dans la classe Archer que tu définiras cet ordre dans un attribut

                                                    Et c'est là qu'entre en "branle" tot le concept puissant de l'OO :D

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      22 septembre 2019 à 9:36:10

                                                      OK Bon, je vais attaquer par ça et je reviens vers vous si besoin est.

                                                      Merci à tous pour votre aide!

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Création d'un jeu par navigateur

                                                      × 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