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

Langages de programmation Discussion :

Interprétation de code dynamiquement


Sujet :

Langages de programmation

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Interprétation de code dynamiquement
    Bonjour, j'ai une grande question existencielle.
    J'essaie pour le moment de développer un logiciel de Magic (pour ceux qui connaissent, le jeu de cartes). Enfin bon, la particularité du jeu, c'est que les cartes réécrivent les règles. Et yen a 10000 :/
    Donc je cherche à modéliser ca, en n'importe quel langage (je suis en C#, mais prêt à changer). J'avais pensé à faire des scripts pour chaque carte, mais comment les interpréter ? Je peux le compiler et l'éxécuter, mais est ce que ca pourra interragir avec les variables du reste ?
    Typiquement, ce qu'il me faut, c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a = 0;
    fonction("a = 2");
    //a vaut 2
    Quelqu'un sait comment faire ca sous n'importe quel langage ? Je pourrais m'en sortir avec la réflexion (écrire un interpréteur et tout), mais je me demande s'il existe une solution plus simple ...
    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    bonsoir,
    je pense que c'est une bonne idée que tu te définisses un langage de script pour écrire les règles liées aux cartes. Après, le choix du langage (C# ou autre) n'a que peu d'importance pour compiler et interpréter ton langage, tous les langages un tant soit peu évolués se valent pour faire ça (analyse syntaxique, construction/parcours d'arbre abstrait, génération de code, interprétation).
    Par contre, je pense que tu fais une confusion quand tu écris :
    int a = 0;
    fonction("a = 2");
    //a vaut 2
    la variable "a" dans l'expression "a = 2" (qui est une variable du langage de script) n'a rien à voir avec la variable "a" de "int a = 0;" (qui est une variable du langage dans lequel tu codes).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Justement, c'est ca que je voudrais, fondre les deux. Surtout que je fais ca en POO. Si c'est plus clair, je voudrais un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Joueur
    {
    int pointsDeVie = 20;
    }
    class Principale
    {
    static void Main()
    {
    Joueur joueur1 = new Joueur();
    fonction("joueur1.pointsDeVie--;");
    }
    }
    En fait, les cartes ca modifie vraiment tout dans le jeu (l'idéal en fait, ca serait de réécrire les fonctions, mais ca je doute que ca soit possible). En plus, de nouvelles cartes sortent à intervalles réguliers. Ca serait bien que je puisse faire un seul programme, et totu faire sur un texte à coté après quoi.
    Merci en tout cas d'avoir pris le temps de répondre.

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Tu peux faire correspondre une valeur en mémoire aux différents "champs" mentionnés sur les cartes. Par exemple un système de getter/setter par nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Entite {
      HashMap champs = new HashMap();
    
      public Object getValeurChamp(String nomChamp) {
        return champs.get(nomChamp);
      }
    
      public void setValeurChamp(String nomChamp, Object valeurChamp) {
        champs.put(nomChamp, valeurChamp);
      }
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Oui, c'est ce que je pensais faire en désespoir de cause. Mais yaurait pas un moyen qui puisse faire le tout plus simplement, le considérer comme du code source quoi ? J'avais essayé de voir ce qui était faisable avec la réflexion, mais j'ai pas vraiment trouvé de trucs aussi simples (quoique avec la réflexion, je peux faire de l'attribution de variables super simplement, mais pas du vrai code quoi)

  6. #6
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par Smeuuh
    Oui, c'est ce que je pensais faire en désespoir de cause. Mais yaurait pas un moyen qui puisse faire le tout plus simplement, le considérer comme du code source quoi ?
    Je ne comprends pas ce que tu veux dire, du code source ? Tu parles de ce qui est "écrit" sur les cartes ? Si c'est bien ça, en effet c'est du code source qu'il te faudra interpréter (éventuellement après une phase de compilation).

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Non non, du "vrai" code source.
    Ce que je veux dire, c'est faire qu'une string soit considérée comme du code source. Comme compiler un fichier source, sauf qu'il est à l'intérieur du .exe quoi (il partage le namespace, les variables, etc). Bien évidemment, ca pourrait se faire qu'avec un langage interprété ou en pseudo code (pas du C++ quoi).
    M'enfin, si c'est pas possible, je ferai sans, c'est pas trop grave

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Il existe une librairie excellente qui fait exactement ce que tu veux, à savoir faire correspondre des éléments du scripts avec des éléments de ton programme. Mais cette librairie compile du Pascal et est développée pour Delphi. Je crois qu'il doit être possible de la faire fonctionner avec C++ Builder ; mais si es prêt à apprendre n'importe quel langage, et que tu comptes utiliser cette solution, je te conseille de passer à Delphi, d'autant plus que tu peux télécharger gratuitement la version 2005 perso sur DVP.

    Cette librairie est Pascal Script de RemObjects :
    http://www.remobjects.com/?ps
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci, c'est exactement ca que je cherche ! (sauf que j'aime pas Pascal et que je n'y connais rien en Delphi )

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut
    Il y a un langage qui fait exactement ce que tu veux sans ajout d'aucune bibliothèque, c'est LISP. En LISP, tu écris une expression (une donnée) et tu peux immédiatement la considérer comme un programme. Tu peux générer dynamiquement des programmes et les exécuter séance tenante. Le système de macros de LISP est d'ailleurs tout simplement prodigieux, et les C, C++, Pascal, Java, ... sont très loin d'en faire autant. Je pense que 'SCHEME' doit être le clone de LISP le plus simple à utiliser. Pour ton problème ça me paraît tout indiqué. N'oublions pas que LISP est le langage favori de l'intelligence artificielle.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Le LISP a l'air marrant et intéressant. Mais y-a-til une implémentation avec une interface graphique ? Le jeu de cartes en mode console, moyen quoi :/

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu as également Perl, Python, Ruby qui disposent tous de la fonction eval() qui permet de faire ce que tu veux... Néanmoins je crois que tu modélises mal ton problème : Les règles de Magic ne changent pas "complètement" à chaque fois que tu poses une carte ! (j'y ai joué pas mal, donc je sais de quoi je parle)
    Je pense que tu ferais mieux de modéliser ça par un système de "hooks", autrement dit, tu modélises le flux normal du jeu mais aux moments cruciaux (début d'une phase, pose d'une carte sur la pile, ...) tu fait exécuter une liste de fonctions spécifique (par exemple une liste de fonction de nom hooksAvantPhase). Tu crées des objets cartes qui ont la faculté de rajouter des fonctions à ces listes quand elles sont exécutées, d'en enlever quand on les retire du jeu, etc... Je pense que c'est plutôt ça que tu devrais faire.

    --
    Jedaï

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut
    Citation Envoyé par Jedai
    Les règles de Magic ne changent pas "complètement" à chaque fois que tu poses une carte ! (j'y ai joué pas mal, donc je sais de quoi je parle)
    Je pense que tu ferais mieux de modéliser ça par un système de "hooks"...
    Effectivement si les programmes que tu as à faire ne sont que des listes de fonctions 'primitives', tu n'as pas besoin d'outils très sophistiqués, et l'utilisation de Lisp reviendra à utiliser un marteau-pilon pour écraser une mouche. Ceci dit, Lisp est un langage très à part et très enthousiasmant, et je crois sincèrement qu'on loupe quelque chose de très important (sur le plan de la culture informatique) si on ne le connait pas.

    Certains livres sur Lisp insistent sur une notion de programmation dirigée par les données. Ca consiste tout simplement à remplacer certains programmes par des données (qui d'une certaine façon décrivent les opérations à effectuer) et d'écrire seulement un petit interpréteur, qui effectue ces opérations en lisant ces descriptions. C'est un truc qui a été abondamment utilisé en intelligence artificielle, car même s'il diminue les performances, il introduit une grande souplesse, par exemple pour les systèmes qui apprennent pendant leur fonctionnement. Il peut être appliqué avec n'importe quel langage. La méthode que propose Jedaï s'apparente clairement à cette technique, les listes de fonctions étant les données qui dirigent le programme.

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est sûr que Lisp est très intéressant, mais un peu déconcertant aussi pour le nouveau venu... En tout cas il peut sans doute faire ce qu'il veut dans le langage de son choix, ce que je décris étant possible dans à peu près tous les langages modernes. Après s'il est curieux, il sait maintenant que Lisp est un langage très puissant qui peut lui faciliter la tâche.

    --
    Jedaï

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Smeuuh
    Le LISP a l'air marrant et intéressant. Mais y-a-til une implémentation avec une interface graphique ? Le jeu de cartes en mode console, moyen quoi :/
    Il y a Allegro CL, avec une version d'essai.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Smeuuh, je crois qu'il suffit d'utiliser la dérivation.

    Ton jeu va ressembler à qqch comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Joueur {
      PointsDeVie: int;
      Adversaire: Joueur;
      ResisteAuFeu: bool;
      ...
    }
    
    class Carte {
      void UtiliserCarte(PropriétaireCarte: Joueur); virtual; abstract;
    }
    Ensuite pour chaque carte tu dérives la classe Carte

    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
    class CarteBouleDeFeu : public Carte {
     Dégat: Int;
     void UtiliserCarte(UnJoueur: Joueur); override;
    
      
    }
    
    CarteBouleDeFeu::CarteBouleDeFeu {
      Dégat = 2
    }
    
    void CarteBouleDeFeu ::UtiliserCarte(PropriétaireCarte: Joueur); {
      if not PropriétaireCarte.Adversaire.ResisteAuFeu then
        Adversaire.PointsDeVie -= Dégat
    }
    et tu as plus qu'à dériver 10000 fois la classe Carte. Bon courage

  17. #17
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est ingérable par héritage. Avec 'gic, deux cartes séparées c'est un truc, deux cartes combinées (dans un ordre qui peut varier), c'en est un autre.

    Il faut passer du côté des scripts, ou du moins avoir un langage pour exprimer toutes les variations de règles et un moteur pour interpréter les résultats finaux.

    Tu vas avoir un gros boulot d'isolation des parties communes et des variations apportées par les diverses cartes.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par Luc Hermitte
    C'est ingérable par héritage. Avec 'gic, deux cartes séparées c'est un truc, deux cartes combinées (dans un ordre qui peut varier), c'en est un autre.

    Il faut passer du côté des scripts, ou du moins avoir un langage pour exprimer toutes les variations de règles et un moteur pour interpréter les résultats finaux.

    Tu vas avoir un gros boulot d'isolation des parties communes et des variations apportées par les diverses cartes.
    Effectivement, comme je ne connais pas trop magic, la dérivation était un peu simpliste.

    Après comme le précise Luc Hermitte, tout va dépendre du type de règles que l'on rencontre. Quoi qu'il arrive tu auras besoin de les factoriser correctement.

    ceci dit le message est vieux d'un mois donc bon ...

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Bruno75
    Effectivement, comme je ne connais pas trop magic, la dérivation était un peu simpliste.
    Ce n'est pas une question de simplisme. C'est une question que le couplage induit par de l'héritage est bien trop fort, et ne conviendra pas pour décrire des effets -- ceux récherchés ici.
    D'autant que l'élément atomique décrivant un effet, ce n'est pas la carte. La carte tient plus de l'aggrégat.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    c'est mon français qui est pas bon. Je voulais dire, j'avais une vision trop simpliste des règles qui m'a conduit à penser que la dérivation aurait pu suffire mais effectivement ce n'est pas le cas.

    Après on peut faire une classe aggrégat contenant une liste de cartes, avec chaque carte étant une liste dynamique obtenu à partir d'une liste de définition de cartes, chaque définition sachant quoi ajouter à cette liste dynamique.

    faudrait avoir le type de règle dans magic pour savoir

Discussions similaires

  1. Morceaux de code dynamique
    Par Celeborn dans le forum C++
    Réponses: 3
    Dernier message: 11/06/2009, 20h50
  2. Générer du code dynamiquement
    Par seb-oulba dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 23h26
  3. [VB6] générer du code dynamiquement
    Par nils.angot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 08h40
  4. interprété du code stocké en base de donnée
    Par namosis dans le forum MFC
    Réponses: 7
    Dernier message: 14/11/2005, 22h06
  5. Introspection et création de code dynamiquement ?
    Par elitost dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 17/10/2005, 22h43

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