Forum d'entraide à la création de jeux d'aventure
 
PortailAccueilFAQRechercherS'enregistrerMembresConnexion

Partagez | 
 

 Trier des variables par valeur ?

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: Trier des variables par valeur ?   Lun 18 Sep 2017 - 14:53

Coucou sourire 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 ?..
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: Re: Trier des variables par valeur ?   Lun 18 Sep 2017 - 18:24

Oui, c'est la version 3.4.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: Re: Trier des variables par valeur ?   Lun 18 Sep 2017 - 18:44

Merci beaucoup ça me rendrait un grand service ♥
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: Re: Trier des variables par valeur ?   Lun 18 Sep 2017 - 23:06

Je vais regarder ça, merci beaucoup !! sourire
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: 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 !! ♥
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: 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 clin d\\\\'oeil
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: 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];
          }
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
avatar

Nombre de messages : 2536

Date d'inscription : 01/08/2006


MessageSujet: 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 perplexe

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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
Shai-la
Ouvrière en Chef de la Grande Tasse Bleue
Ouvrière en Chef de la Grande Tasse Bleue
avatar

Nombre de messages : 5500

Age : 39

Localisation : Montpellier

Date d'inscription : 17/04/2006


MessageSujet: 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 "
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://marionpoinsot.fr/video
Contenu sponsorisé




MessageSujet: Re: Trier des variables par valeur ?   

Revenir en haut Aller en bas
 
Trier des variables par valeur ?
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Main sans valeur et fleur
» Déclaration de variables dans le script header
» Mais qu'est-ce que la valeur stratégique?
» StoneWorth / Pierre de valeur
» Formule magique pour déterminer la valeur de l'affinité...

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: