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

Lazarus Pascal Discussion :

Conception d'un Jeu de Rôle


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut Conception d'un Jeu de Rôle
    Je crée ce sujet pour continuer le projet initié sous TPW, c'est donc une migration hardcore

    voilà le sujet initial:

    http://www.developpez.net/forums/d83...r-personnages/

    et voilà le résumé des conseils et évolutions:



    Pour résumer la substantifique moelle de tous vos conseils et de ma pratique:

    pour faire un JDR (RPG) en Pascal:

    1- tout concevoir sur papier: règles, scénario, combats, etc...

    2- choisir un EDI performant (compilateur FreePascal)

    3- concevoir des modules spécialisés (unités)

    4- savoir créer des fichiers sur le disque dur: monstres, armes, objets, héros, ...

    5- bien séparer les données, leur traitement, l'affichage

    6- si possible utiliser la POO pour les monstres et personnages

    7- avoir une bonne cafetière et de l'aspirine

    8- et SURTOUT ! : être inscrit ds les forums de Developpez.com
    si qqu'un est interessé par mon "truc" qu'il hésite pas, mais je ne sais pas comment l'uploader

  2. #2
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    logiquement je bute sur la récupération de mon code

    j'ai d'abord remplacé les commandes Assign par assignFile, close par closeFile

    malgré ça mon fichier de personnages refuse de se charger j'ai une RuntImeError 100: disk read error

    voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure LoadTeam;
    Begin
      NbHerosAlive := 6;
      AssignFile(Persos, PathTeam);
      Reset(Persos);
      for i := 0 to 5 do Read(Persos, perso[i]);
      closeFile(Persos);
      ShowMessage(' !!! Equipe prête à l''Action !!!: '+InttoStr(NbHerosAlive)+' Guerriers');
    End;
    j'ai essayé avec BlockRead sans plus de succés, p-e dois je recréer mon fichier

  3. #3
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    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
    17
    18
     
    Program Example88;
     
    { Program to demonstrate the AssignFile and CloseFile functions. }
     
    {$MODE Delphi}
     
    Var F : text;
     
    begin
      AssignFile(F,'textfile.tmp');
      Rewrite(F); { le fichier est ouvert en écriture et il est vidé}
      Writeln (F,'C''est la permière ligne du fichier.');
      CloseFile(F);
      Append(f);  { Fichier ouvert en mode "ajout" il n'est pas vidé.}
      Writeln (f,'Voilà une ligne ajoutée au fichier textfile.txt');
      CloseFile (f);
    end.
    Je n'ai pas mon compilo sous la main ici, ce bout de code fonctionnera cependant, j'en suis sûr.
    N'oublie pas d'encadrer tes accès fichier par un Try ... Finally/except
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    RunTimeError 100 : Cette erreur est renvoyée par Read si vous tentez de lire au-delà de la fin d'un fichier.
    Pour éviter un arrêt brutal du programme suite à cette erreur d'exécution, utilisez la directive de compilation {$I-} et récupérez le résultat de l'opération par la fonction IOResult.


    Quels sont les types que tu as affecté à "Persos" et "perso" ?

    D'une manière générale, pour lire un fichier et afin de s'assurer qu'on n'en lit pas de trop on procède de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    i:= 0;
    while not EOF(Persos) do
      read (Persos, perso[i]);
      inc(i);
    end;
    ...
    Cordialement.

    Pierre

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    TFileStream ou TMemoryStream pour lire les fichiers!
    ce sera compatible toutes plateformes.


    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
    17
    18
    19
    20
    21
    22
    23
     
    procedure LoadFile(const FileName: string);
    var R, S, N : integer;
         T : TPerso;
    begin
      with TFileStream.Create(FileName, fmOpenRead) do
      try
        N := 0;
        S := SizeOf(TPerso);
        repeat
          R := Read(T, S);
          if R = S then
          begin
            Persos[N] := T;
            inc(N);
            if N > High(Persos) then
              break;
          end;
        until R < S;
      finally
        Free;
      end;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    richard: ça n'est pas un fichier texte:

    > file of tPerso (fiche record de personnage), je vous la reposte:

    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
    17
    18
     
    Type
      tPerso = record
         name : string[25];
         race : byte;
         carrier : byte;
         level : byte;
         health: integer;
         condition: byte;
         weapon1 : byte;
         weapon2 : byte;
         def: byte;
         money : integer;
         ptExp: integer;
         CaracP : Array[1..8] of integer;
         CaracS : Array[1..8] of integer;
         stuff : array[1..6] of string[15]; {places disponibles pour les objets}
      end;
    l'équipe est composée de 6 héros stockés dans un tableau Perso[0..5]

    ChPr > ça marche, tu avais oublié un begin, pour voir si je suivais c'est ça ?

    Doc> ha je decouvre try et finally, jamais vu ds TPW, je ne comprend pas grand chose à ton code, plus de assign, reset, etc...

    à quel endroit tu indiques le chemin du fichier ?

  7. #7
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    De Pascal à Lazarus/Delphi la gestion des fichiers est différente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (*Turbo Pascal*)
     
    (*$I-*)
      Assignfile(MonFichier, 'C:\essai.dat');
      Reset(MonFichier);
      If IoResult = 0 Then
        CloseFile(MonFichier);
        Else Showmessage('Ouverture impossible, le fichier n'existe pas !');
    (*$I+*)
    Ce code est toujours fonctionnel avec Delphi*/Lazarus pour des raisons de compatibilité (qui arrangent bien un vieux croûton comme moi ), la variable IORESULT est une routine au départ pour MS DOS qui renvoie 0 si tout est OK et 1 dans les autres cas.
    Aujourd'hui, les erreurs fichiers doivent être traitées par un bloc TRY .. EXCEPT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (* code lazarus/FPC*)
     
      TRY
        Assignfile(MonFichier, 'C:\essai.dat');
        Reset(MonFichier);
        CloseFile(MonFichier);
      EXCEPT
        ON EInOutError DO
           Showmessage('Ouverture impossible, le fichier n'existe pas !');
      END;
    On peut même afficher l'erreur car en fait on a appelé un "objet d'exception temporaire" (appelé 'err') qui a une "propriété" (comme un champ d'un RECORD) appelée ERRORCODE et qui contient le même code erreur que IORESULT :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (* code lazarus/FPC*)
     
      TRY
        Assignfile(MonFichier, 'C:\essai.dat');
        Reset(MonFichier);
        CloseFile(MonFichier);
      EXCEPT
        ON err: EInOutError DO
           Showmessage('Code erreur : ', IntToStr(err.ErrorCode));
      END;
    Par exemple le code 2 correspond à un fichier introuvable, le 3 à un problème de chemin d'accès etc.

    Plus moderne encore, il y a la technique des objets flux que t'as montrée Doc.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    ... ChPr > ça marche, tu avais oublié un begin, pour voir si je suivais c'est ça ? ...
    Absolument ! (même pas vrai , je l'avais oublié ).

    Cela dit, encadre les parties sensibles de code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      ..
      ..
    except
      ..
    end;
    C'est bien pratique.

    Cordialement.

    Pierre

  9. #9
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    { LoadPersoFile
     
       charge le fichier des personnages
     
      parametres :
      
      FileName [input] string, nom du fichier à charger (c:\monjeux\persos.bin)
    }
    procedure LoadPersoFile(const FileName: string); 
    var R, S, N : integer;
         T : TPerso;
    begin
      // creation du stream
      with TFileStream.Create(FileName, fmOpenRead) do
      try
     
        // index du tableau des personnages
        N := 0;
     
        // taille de la structure TPerso
        S := SizeOf(TPerso);
     
        // boucle de chargement
        repeat
     
          // lit un personnage
          R := Read(T, S);
     
          // si la taille lue (R) est égale à la taille de TPerso (S)
          if R = S then
          begin
            // assigner la valeur récupérée (T) dans le personnage (N)
            Persos[N] := T;
     
            // incremente l'index de tableau
            inc(N);
     
            // si N est en dehors du max de personnages acceptable
            if N > High(Persos) then
              break;  // on sort
          end;
     
        // on sort de la boucle si Read n'a pas pus lire une structure
        // complète (fin du fichier ou fichier erroné)
        until R < S;
     
      finally
        // Libère le Stream
        Free;
      end;
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  10. #10
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    merci infiniment pour ce cours sur les fichiers

    vos codes fonctionnent mais visiblement le fichier n'est pas exploitable comme sous TPW

    faut être réaliste, le plus simple est que je refasse mes fichiers de personnages, monstres, objets etc... sous Lazarus

    j'avais saisi mes fiches avec la commande readln qui n'existe plus, dois je la remplacer par InputQuery ou InputBox ? ces commandes n'acceptent que des String or la majorité des valeurs sont des nombres entiers.

  11. #11
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Salut,

    Le problème ne peut pas être dans la saisie des données à mon avis dans la mesure ou Lazarus est capable d'exploiter (à peu près) n'importe quel type de fichier, surtout un fichier créé en Pascal !
    Ton problème se situe donc dans la lecture de ce fichier par Lazarus. Poste ta routine de lecture qu'on y voit plus clair.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  12. #12
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    sous TPW je charge 6 héros
    là juste 5 et je ne récupère que le premier nom

    voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Procedure LoadTeam;
    Begin
      AssignFile(Persos, PathTeam);
      Reset(Persos);
      i := 0;
      while not eof(Persos) do
      begin
      Read(Persos, perso[i]);
      fmAccueil.meTeam.lines.add(intToStr(i)+perso[i].name); //affichage ds un mémo
      inc(i);
      end;
      closeFile(Persos);
      ShowMessage(' !!! Equipe prête à l''Action !!!: '+InttoStr(i+1)+' Guerriers'); // affiche 5 guerriers 
    End;

  13. #13
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    merci infiniment pour ce cours sur les fichiers

    vos codes fonctionnent mais visiblement le fichier n'est pas exploitable comme sous TPW

    faut être réaliste, le plus simple est que je refasse mes fichiers de personnages, monstres, objets etc... sous Lazarus

    j'avais saisi mes fiches avec la commande readln qui n'existe plus, dois je la remplacer par InputQuery ou InputBox ? ces commandes n'acceptent que des String or la majorité des valeurs sont des nombres entiers.
    Le codage utilisé par turbo pascal pour coder les fichiers binaires servant à serialiser des données et different du codage utiliser par freepascal. de ce fait il te faut recréer ces meme fichiers sous lazarus/freepascal avant de pouvoir les exploiter.
    A ta place, j'opterais pour un fichier xml. Comme ça, meme si tu change de compilateur ou de langage, tu n'auras pas à toucher au fichier. lazarus/fpc dispose d'un parseur dom que tu pourras utiliser pour recuperer les info. Aussi, le fichier xml est facilement modifiable, et compréhensible par un humain. On a juste besion d'un editeur tel que bloc note pour le modifier.

  14. #14
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    j'aurai vraiment du vous écouter quand vous m'aviez TOUS conseillé de quitter TPW pour FPC

    j'avais créé un utilitaire pour créer facilement des équipes et une base de données Monstres, je peux donc jeter tout ça à la poubelle

    un fichier xml ?

    pour créer un tel fichier je fais comment ?

  15. #15
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    j'aurai vraiment du vous écouter quand vous m'aviez TOUS conseillé de quitter TPW pour FPC

    j'avais créé un utilitaire pour créer facilement des équipes et une base de données Monstres, je peux donc jeter tout ça à la poubelle

    un fichier xml ?

    pour créer un tel fichier je fais comment ?
    Un fichier xml est tout simplement un fichier texte qui respecte un format bien precis.
    Par exemple :
    Code xml : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <xml version="1.0">
     
    <RPG>
     
    <personnage>
      <pers id="p1">
        <nom> Nabster </nom>
        <vie>5</vie>
        <agilite>2</agilite>
       <image>nabster.png</image>
      </pers>
      <pers id="p2">
       <nom> Darrylsite </nom>
       <vie>4</vie>
       <agilite>6</agilite>
       <image>darrylsite.png</image>
      </pers>
    </personnage>
     
    <monstre>
     <monst id="m1">
      <nom>freezer</nom>
      <force>5</force>
      <agilite>3</agilite>
      <image>freezer.png</image>
     </monst>
    </monstre>
     
    </RPG>

    Tu trouveras bien des tutoriels sur le sujet en faisant des recherches sur google, ou meme sur developpez.com.

  16. #16
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    je préférerai continuer avec un fichier binaire que je sais réutiliser dans mon programme, ça a l'air vraiment clair ce format xml, mais comment je remplis mes fiches ? readln ?

    si tu veux bien je ne peux pas me disperser à chaque pas sur une nouveauté, même si ton conseil est sûrement excellent.

  17. #17
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    En effet ça fait trop d'un seul coup apprendre lazarus, xml, poo, ...
    Tu peux continuer avec tes fichiers textes, en les recéant avec les code que tu as fait sous tpw, mais en compilant dans un projet personnaliser gerer par freepascal; Ou recréer une nouvelle interface avec lazarus où tu pouuras renseigner tous les infos avant de les sauvegarder ou de les faire ressortir afin de les modifier.

  18. #18
    Membre à l'essai Avatar de maxiNoob
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 129
    Points : 18
    Points
    18
    Par défaut
    exact je me noie sinon

    c'était un fichier structure: FILE OF tPerso

    je reposte l'outil qui me sert à créer mes équipes (pour les monstres c'est le même d'ailleurs), c'est l'adaptation d'un exemple qui m'avait été donné ds le premier sujet

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    (*$r+*)
    program JDR_BD_Perso; {**  Version Héros **}
     
    Uses WinCrt;
     
     
     
    Type
        tPerso = record
         name : string[25];
         race : byte;
         carrier : byte;
         level : byte;
         health: integer;
         condition: byte;
         weapon1 : byte;
         weapon2 : byte;
         def: byte;
         money : integer;
         ptExp: integer;
         CaracP : Array[1..8] of integer;
         CaracS : Array[1..8] of integer;
         stuff : array[1..6] of string[15];
         end;
     
     
    Const
         Path: string = 'c:\tpw\jdr\datas\team.dta';
     
     
    Var
         Persos: file of tPerso;
          an_hero: tPerso;
          choix: char;
          i: integer;
     
     
     
      procedure cree;
        begin
          assign(Persos, path);
          rewrite(Persos);
          close(Persos);
          ClrScr;
          write(#7);
          writeLn;
          writeLn(' FICHIER Créé !!! ');
          readkey;
        end; (* cree *)
     
     
     
      procedure ajoute;
        var choice: char;
        begin
          assign(Persos, path);
          reset(Persos);
          while not eof(Persos) do
            read(Persos, an_hero);
     
          repeat
              with an_hero do
                Begin
            write('    nom du heros ? '); readln(name);
            write('    race ? '); readln(race);
            write('    carrière  ? '); readln(carrier);
            write('    niveau  ? '); readln(level);
            write('    health  ? '); readln(health);
            write('    condition(0-1)? '); readln(condition);
            write('    arme 1  ? '); readln(weapon1);
            write('    arme 2  ? '); readln(weapon2);
            write('    classe armure  ? '); readln(def);
            write('    argent  ? '); readln(money);
            write('    Points Exp      ? '); readln(ptExp);
            write('    Capac combat   ? '); readln(caracP[1]);
            write('    Capac tir      ? '); readln(caracP[2]);
            write('    Force  ? ');readln(caracP[3]);
            write('    Endurance  ? ');readln(caracP[4]);
            write('    Agilité  ? ');readln(caracP[5]);
            write('    Intelligence   ? '); readln(caracP[6]);
            write('    Force mentale  ? '); readln(caracP[7]);
            write('    Sociabilité    ? '); readln(caracP[8]);
            write('    PtsAttaque ? '); readln(caracS[1]);
            write('    PtsBless (8-14) ? '); readln(caracS[2]);
           caracS[3] := (caracP[3] div 10);
           caracS[4] := (caracP[4] div 10);
            write('    Mouvement (3-5)  ? '); readln(caracS[5]);
           caracS[6] := 0;
            write('    Pts Destin  (1-3)  ? '); readln(caracS[7]);
           caracS[8] := 0;
               end;
     
            write(Persos, an_hero);
            write('  continuer,  Quitter ? ');
            choice:= readkey; writeln(choice);
          until (choice= 'q') or (choice = 'Q');
     
          close(Persos);
        end; 
     
     
    procedure lecture;
        var number: integer;
        begin
          assign(Persos, Path);
          reset(Persos);   
          number:= 0;
          ClrScr;
           writeln('     ####  Voilà Vos Héros  ####');
           writeln;
          while not eof(Persos) do
          begin
            read(Persos, an_hero);
              with an_hero do
                begin
              ClrScr;
              writeLn;
              writeLn('** Hero: ',number,' : ' ,name,' **');
              writeln('    race  carrier niveau  arme1  arme2   def  argent   PtExp');
              write(race:7, carrier:7, level:7, weapon1:7, weapon2:7);
              writeLn(def:7, money:7, ptExp:7);
              writeLn;
              writeLn('      * Profil Principal *');
              writeLn('    cc   ct   fo   end  agi  int   fm  soc');
              write(' ');
              for i := 1 to 8 do write(caracP[i]:5);
              writeln;
              writeln;
              writeln('     * Profil secondaire *');
              writeln('    nA  pB  BF  BE  Mv  Mg  pD  pF');
              write(' ');
              for i:= 1to 8 do write(caracS[i]:4);
                end;
            number:= number+1;
            writeln;
            writeln;
            readkey;
     
          end;
     
          close(Persos);
    end; (* lecture *)
     
     {$I-}
    procedure modifie;
        var number: integer;
            choice: char;
        begin
           writeln;
          assign(Persos, Path);
          reset(Persos);
          for i:= 0 to 5 do begin
          read(persos, an_hero);writeln(' > Fiche ',i,' - ',an_hero.name);
          end;
          writeLn;
          reset(Persos);
     
          repeat
            write('  modifie la fiche numéro ? '); readln(number);
            seek(persos, number); read(persos, an_hero);
     
           with an_hero do
                Begin
            write('   ',name,' New name  ? '); readln(name);
            write('   ',race,' New race ? '); readln(race);
            write('   ',carrier,' New  carrier  ? '); readln(carrier);
            write('   ',level,' New level  ? '); readln(level);
            write('   ',health,' New health  ? '); readln(health);
            write('   ',condition,' New condition (0-1)? '); readln(condition);
            write('   ',weapon1,' New weapon1  ? '); readln(weapon1);
            write('   ',weapon2,' New weapon2  ? '); readln(weapon2);
            write('   ',def,' New def class  ? '); readln(def);
            write('   ',money,' New money  ? '); readln(money);
            write('   ',ptExp,' New Exp pts  ? '); readln(ptExp);
            write('   ',caracP[1],' New Capac combat  ? '); readln(caracP[1]);
            write('   ',caracP[2],' New Capac tir     ? '); readln(caracP[2]);
            write('   ',caracP[3],' New  Force        ? '); readln(caracP[3]);
            write('   ',caracP[4],' New Endurance     ? '); readln(caracP[4]);
            write('   ',caracP[5],' New Agility       ? '); readln(caracP[5]);
            write('   ',caracP[6],' New Intelligence  ? '); readln(caracP[6]);
            write('   ',caracP[7],' New mental force  ? '); readln(caracP[7]);
            write('   ',caracP[8],' New Sociability   ? '); readln(caracP[8]);
            write('   ',caracS[1],' New Attack Pts    ? '); readln(caracS[1]);
            write('   ',caracS[2],' New Life Pts(8-14)? '); readln(caracS[2]);
           caracS[3] := (caracP[3] div 10);
           caracS[4] := (caracP[4] div 10);
            write('   ',caracS[5],' New Movement(3-5) ? '); readln(caracS[5]);
           caracS[6] := 0;
            write('   ',caracS[7],' New Dest Pts(1-3) ? '); readln(caracS[7]);
           caracS[8] := 0;
           WriteLn('Erreur : ',IOResult);   { Erreur 106 ! }
            end;
            seek(persos, number); write(persos, an_hero);
            write('continuer, Quitter ? ');
            choice:= readkey; writeln(choice);
          until (choice= 'q') or (choice = 'Q');
        close(Persos);
        end; (* modifie *)
     
     
     
    begin (* principal *)
        clrscr;
        writeln;
        writeln('       #######  Générateur  de  Personnages de Test  #######');
        repeat
          writeln;
          write(' >  C)réer, A)jouter à la fin, L)ister, M)odifier, Q)uitter ? ');
          choix:= readkey; writeln(choix);
          case choix of
            'c' : cree;
            'a' : ajoute;
            'A' : ajoute;
            'l' : lecture;
            'L' : lecture;
            'm' : modifie;
            'M' : modifie;
          end;
        until (choix= 'q') or (choix = 'Q');
     
        write(#7);
    end. (* principal *)
    donc je prend ce code je le copie ds lazarus et je le compile , mais ça ne marchera pas, merde je comprend rien ds TPW ça compile, mais ailleurs il faut le changer

  19. #19
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Je n'ai pas mon compilateur sous la main ici, mais je ne vois pas en quoi ce programme n'est pas compilable par FreePascal (choisir le mode console dans Lazarus).

    Je te conseille également de garder ce que tu as fait ainsi que ton format de fichier. Il y a des étapes à respecter, à mon avis :

    1) Tu gardes ça pour le moment.
    2) Tu transformes ensuite (quand ton programme sera au point) en fichier texte
    3) Tu re transformes après en fichier xml après avoir consulté un tuto.

    C'est pareil pour la sauvegarde de tes fichiers, les flux c'est très bien, je te conseille cependant dans l'immédiat d'utiliser ce que tu sais déjà faire (AssignFile, CloseFile etc.) avec TRY ... EXCEPT et puis après quand tu en seras à la version 2.0 de ton RPG ( ) d'utiliser les flux.

    D'où l'utilité des unités : une unité pour les fichiers cela te permet de ne modifier ensuite que cette unité qui exportera les données lues que le reste du programme exploitera de la même manière. Modularité du code = programme + facile à modifier !
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  20. #20
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pfff houlala...

    bon...

    déjà, on ne peut pas te demander d'aller plus vite que la lumière.
    impossible de toute façon.


    tu dois garder à l'esprit, que ce projet, n'aboutira, qu'une fois que ton niveau sera devenus bon.

    c'est à dire que tu dois t'efforcer de bien comprendre ton IDE, les concepts de programmations etc.

    je pense que tu te lance dans un truc assé compliqué (un JDR c'est complexe oui).
    je ne dis pas par la que tu ne pourrai pas y'arriver, mais l'implementation sera toute caca.

    le principe important que tu semble ne pas encore comprendre c'est qu'il faut ABSOLUMENT commencer par le début.
    par exemple, on voit dans ta structure que la plupart des choses sont codées sur des bytes etc.
    ce n'est pas PARLANT!
    il faut que tu utilise tout ce que le langage te fournis, pour te faciliter la tache.

    Race, Carrier, Condition, Weapon, Carac etc, tout ça doivent être definit proprement.

    Race peut être une énumération pour faire simple.
    mais une énumération, implique de modifier le code pour en ajouter.

    Carrier peut être une énumération aussi, mais avec les même contraintes.

    bref...

    tu dois bien penser le schema du jeux avant tout.
    ensuite, ce schema te guidera tout simplement vers les choix les plus logiques et adéquats.


    qu'est ce qui definit un personnage ?
    -> sa race
    -> son job

    qu'est ce qui definit les caractéristiques ?
    -> la race
    -> le job
    -> le stuff


    donc, on vois ici qu'il faut avant tout développer correctement Race, Carrier et le Stuff.

    et ainsi de suite ...

    comment definir une race ?
    selon la race, les avantages et contraintes sont différentes :
    la taille par exemple :
    un nain fera moins de 120cm
    un humain homme fera entre 180 et 200cm
    un humain femme fera entre 150 et 170cm

    conclusion : le nain marche, cours moins vite et saute moins haut que l'humain. le nain aura donc un malus en agilité.

    le sexe :
    les hommes sont plus musclé
    les femmes sont plus souple
    conclusion
    les hommes auront un malus d'agilité et un bonus de force
    les femmes auront un bonus d'agilité et de charisme et un malus de force

    tout ça est expliqué dans les régles du jeux (encore une fois on y reviens).



    ensuite,

    comme les races et les jobs sont dépendants des caractéristique et que les caractéristiques se voient amoindries ou augméntées par la race ou le job on doit donc extraire les caractéristique et les gérer a part :

    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
    17
    18
    19
    20
    21
    22
     
    type
      TCara = packed record
        Str, Agi, Wis, Cha: shortint;
      end;
     
    const
      // base
      Human : TCara = (Str: 10; Agi: 8; Wis: 7; Cha: 8);
      // Bonus/malus
      HumanMale : TCara = (Str : 2; Agi: 0; Wis: 1; Cha: 0);
      HumanFemale : TCara = (Str: -1; Agi: 2; Wis 0; Cha: 2);
     
      Dwarf : TCara = (Str: 12; Agi: 6; Wis: 3; Cha: 4);
      // Bonus/Malus
      DwarfMale : TCara = (Str: 0; Agi: 0; Wis: 1; Cha: 0);
      DwarfFemale : TCara = (Str: -1; Agi: 1; Wis: 0; Cha: 0);
     
      Elf : TCara = (Str: 9; Agi: 10; Wis: 6; Cha: 10);
      // Bonus/Malus
      ElfMale : TCara = (Str: 2; Agi: 0; Wis: 0; Cha: 0);
      ElfFemale : TCara = (Str: 0; Agi: 2; Wis: 0; Cha: 4);

    création d'un personnage :

    race -> Elf ? -> Cara = charger Cara Elf de base
    sexe -> Femme ? -> Cara = Cara + Cara ElfFemale
    job -> archer ? -> Cara = Cara + Cara d'archer
    histoire -> fils de maitre d'arme ? -> Cara = Cara + Cara fils de maitre d'arme
    histoire -> orphelin ? -> Cara = Cara + Cara d'orphelin


    et on répéte l'opération pour tout les élements du jeux.

    je pourrais te montrer pleins d'exemple pour le developpement, le problème c'est que l'exemple serait un jeux complet et fonctionnel ...
    donc pas intéréssant pour toi
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. [Outil] Jeu de Rôle Creator
    Par -4ian- dans le forum Contribuez
    Réponses: 19
    Dernier message: 27/12/2007, 12h35
  2. Conception d'un jeu de tennis
    Par b Oo dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 17/01/2007, 22h19
  3. Conception d'un jeu de course
    Par zooffy dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 03/11/2006, 19h29
  4. [Conception] Concevoir le jeu Pierre Feuille Ciseau
    Par websurfeur dans le forum Général Java
    Réponses: 14
    Dernier message: 17/03/2006, 19h26
  5. [VB] Aide pour la conception d'un jeu
    Par superbruno dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 17/01/2006, 18h01

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