| Trier des variables par valeur ? | |
|
|
Auteur | Message |
---|
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Trier des variables par valeur ? Lun 18 Sep 2017 - 14:53 | |
| Coucou Je commence un nouveau jeu et je souhaite faire intervenir chaque personnage (de 2 à 6 en fonction des niveaux) en fonction d'un certain ordre, basé sur leur niveau de rapidité. C'est-à-dire que le personnage qui fait le meilleur score basé sur son niveau en rapidité attaque en premier, puis le second, etc. Le souci est que je ne vois pas comment "trier" le résultat des variables en fonction de leur valeur, déterminée aléatoirement durant le combat. Exemple : on a deux personnages contrôlés par le joueur qui arrivent dans une pièce où il y a trois ennemis. Chacun a un niveau en rapidité différent. Ils font tous un jet aléatoire, sachant que celui qui a le plus haut score en rapidité a plus de chances d'attaquer en premier. Comment faire pour que le jeu fasse attaquer chaque personnage en commençant par celui qui obtient le résultat le plus élevé, jusqu'à celui qui a le résultat le plus faible en dernier ?.. |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 17:57 | |
| Je dois dire que je pensais te sortir un code rapidement sur lequel tu pourrais travailler, mais AGS dispose pas du plus souple des langages quand il s'agit de trier des valeurs... Est-ce tu utilises AGS 3.4 ? Cette version offre davantage de souplesse dans ces cas-là. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 18:24 | |
| Oui, c'est la version 3.4. |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 18:34 | |
| OK super, je regarde ça d'un peu plus près et je reviens vers toi. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 18:44 | |
| Merci beaucoup ça me rendrait un grand service ♥ |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 19:24 | |
| Bon, apparemment mon wine/OS X aime pas trop la nouvelle version d'AGS... Du coup je peux compiler le jeu mais il veut pas se lancer, ce qui est pas super pour tester le code. Je vais quand même te le donner, au cas où. Dans l'en-tête (header) d'un script (global ou perso, comme tu veux) - Code:
-
struct fileDePersonnages { import function ajouterPersonnage(Character* personnage, int valeur); import function enleverPersonnage(Character* personnage); import function vider(); import function trier(); writeprotected Character* listePersonnages[]; writeprotected int listeValeurs[]; writeprotected int longueur; }; Dans le corps de ce script - Code:
-
function fileDePersonnages::vider(){ this.longueur = 0; this.listePersonnages = null; this.listeValeurs = null; }
function fileDePersonnages::trier(){ Character* nouvelle_listePersos[] = new Character[this.longueur]; int nouvelle_listeValeurs[] = new int[this.longueur]; for (int n = 0; n < this.longueur; n++){ int position = 0; for (int i = 0; i < this.longueur; i++){ if (i!=n && this.listeValeurs[i]>this.listeValeurs[n]) position++; } while (position < this.longueur && nouvelle_listeValeurs[position] == this.listeValeurs[n]) position++; nouvelle_listePersos[position] = this.listePersonnages[n]; nouvelle_listeValeurs[position] = this.listeValeurs[n]; } this.listePersonnages = nouvelle_listePersos; this.listeValeurs = nouvelle_listeValeurs; }
function fileDePersonnages::enleverPersonnage(Character* personnage){ for (int i = 0; i < this.longueur; i++){ if (this.listePersonnages[i] == personnage){ Character* nouvelle_listePersos[] = new Character[this.longueur-1]; int nouvelle_listeValeurs[] = new int[this.longueur-1]; for (int n = 0; n < this.longueur; n++){ if (n < i) { nouvelle_listeValeurs[n] = this.listeValeurs[i]; nouvelle_listePersos[n] = this.listePersonnages[i]; } else if (n > i){ nouvelle_listeValeurs[n-1] = this.listeValeurs[i]; nouvelle_listePersos[n-1] = this.listePersonnages[i]; } } this.listePersonnages = nouvelle_listePersos; this.listeValeurs = nouvelle_listeValeurs; this.trier(); return; } } }
function fileDePersonnages::ajouterPersonnage(Character* personnage, int valeur) { if (this.longueur < 1) { this.longueur = 1; this.listePersonnages = new Character[this.longueur]; this.listeValeurs = new int[this.longueur]; this.listePersonnages[0] = personnage; this.listeValeurs[0] = valeur; } else { for (int i = 0; i < this.longueur; i++){ if (this.listePersonnages[i] == personnage){ this.listeValeurs[i] = valeur; this.trier(); return; } } Character* nouvelle_listePersos[] = new Character[this.longueur+1]; int nouvelle_listeValeurs[] = new int[this.longueur+1]; for (int n = 0; n < this.longueur; n++){ nouvelle_listePersos[n] = this.listePersonnages[n]; nouvelle_listeValeurs[n] = this.listeValeurs[n]; } nouvelle_listePersos[this.longueur] = personnage; nouvelle_listeValeurs[this.longueur] = valeur; this.listePersonnages = nouvelle_listePersos; this.listeValeurs = nouvelle_listeValeurs; this.longueur++; this.trier(); } } L'utilisation suit la logique suivante. Tu ajoutes à une liste, un par un, chacun des personnages que tu veux trier, avec sa valeur associée. Ensuite tu peux parcourir la liste de personnages triés pour les faire faire quelque chose dans l'ordre (si mon code fait ce que je veux, le tri devrait être automatique). Exemple : - Code:
-
fileDePersonnages attaques; attaques.ajouterPersonnage(cEgo, Random(100)); attaques.ajouterPersonnage(cAdversaire1, Random(100)); attaques.ajouterPersonnage(cAdversaire2, Random(100)); attaques.ajouterPersonnage(cAdversaire3, Random(100)); for (int i = 0; i < attaques.longueur; i++){ Display("%s attaque ! (force %d)", attaques.listePersonnages[i].Name, attaques.listeValeurs[i]); } Tu peux mettre à jour la valeur d'un personnage en l'ajoutant à nouveau (ça se contentera de remplacer la valeur). Tu peux supprimer un personnage avec la commande appropriée. Si pour une obscure raison le tri ne se fait pas automatiquement, tu peux appeler la fonction toi-même. Tu peux aussi vider la liste si tu veux réutiliser la même variable-structure plus tard. Tiens-moi au courant de comment ça fonctionne (pas)._________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Dernière édition par Kitai le Mer 20 Sep 2017 - 14:54, édité 1 fois |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Lun 18 Sep 2017 - 23:06 | |
| Je vais regarder ça, merci beaucoup !! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Mar 19 Sep 2017 - 7:38 | |
| Ca marche ! Maintenant il faut que j'arrive à personnaliser ça selon mes règles de combat Merci !! ♥ |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Mar 19 Sep 2017 - 13:59 | |
| Ouah, ça marche comme ça, du premier coup ? Super !
Tiens-moi au courant des éventuels bugs, et si tu as des problèmes pour l'adapter à tes règles de combat.
PS : tu peux avoir plusieurs instances indépendantes de fileDePersonnages, si tu veux déterminer en parallèle de l'ordre d'attaque par exemple l'ordre de fuite, de limites, etc. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Mar 19 Sep 2017 - 14:43 | |
| Y'avait quelques petites erreurs, facilement corrigées, et j'ai pu adapter sans souci à mon système, ça marche nickel, merci beaucoup ♥ je te créditerai pour ton aide précieuse |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Mar 19 Sep 2017 - 23:31 | |
| Heureux de pouvoir rendre service !
Est-ce que par hasard tu te souviendrais des erreurs, afin que je puisse mettre à jour le code posté ici, pour les futur.e.s intéressé.e.s ? _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Mer 20 Sep 2017 - 6:45 | |
| Tu avais écrit : - Code:
-
if (<ni) { nouvelle_listeValeurs[n] = this.listeValeurs[i]; nouvelle_listePersos[n] = this.listePersonnages[i]; } else if (>ni){ nouvelle_listeValeurs[n-1] = this.listeValeurs[i]; nouvelle_listePersos[n-1] = this.listePersonnages[i]; } J'ai dû corriger en : - Code:
-
if (n<i) { nouvelle_listeValeurs[n] = this.listeValeurs[i]; nouvelle_listePersos[n] = this.listePersonnages[i]; } else if (n>i){ nouvelle_listeValeurs[n-1] = this.listeValeurs[i]; nouvelle_listePersos[n-1] = this.listePersonnages[i]; } |
|
| |
Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Trier des variables par valeur ? Mer 20 Sep 2017 - 14:53 | |
| Zut, apparemment c'est un problème avec la balise [code] du forum... Parce que je me souviens ne pas avoir écrit les conditions comme ça, et tes deux codes sont exactement identiques EDIT : mais apparemment le problème ne survient pas lorsqu'on insère des espaces entre les membres de la comparaison. J'ai mis à jour mon code en conséquence. _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
|
| |
Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: Trier des variables par valeur ? Mer 20 Sep 2017 - 17:03 | |
| Ah bah j'avais pas vu oO en fait le souci venait du " |
|
| |
Contenu sponsorisé
| Sujet: Re: Trier des variables par valeur ? | |
| |
|
| |
| Trier des variables par valeur ? | |
|