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

Turbo Pascal Discussion :

Jeux de rôle : quels types de variables pour coder des personnages ? [TPW]


Sujet :

Turbo Pascal

  1. #41
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    je n'ai pas réussi à utiliser ton programme RPenGine

    normal, RPenGine est une ébauche grossière. même pas une version pré-alpha expérimentale.
    c'etait juste pour te montrer la hierarchisation de chaque unité, et le contenus qu'on pourrait trouver dans chacune. une sorte de pré-guide de l'implémentation d'un tel bouzin.
    RPenGine est un anagrame pour "Role Play engine" et de "Role Play Game"


    je suis vraiment un noob

    TRANSFORMATION MODE YODA!!!



    moins d'un an pour maitriser le pascal je te donne, a partir de maintenant, un Padawan tu es.
    moins de 3 ans pour devenir un jedi tu aura.
    avec nous, la force est.



    mais elle ne correspond pas aux règles que nous souhaitons utiliser avec mon fils, elle est effectivement très claire avec vos explications.

    regarde l'unité RPeDice du RPenGine, objet TRPeDice qui est le seul objet 100% fonctionnel et stable du RPenGine.
    à toi de l'adapter à ton utilisation.
    l'objet se présente réellement comme un dé physique, nombres de faces (facesCount), nombres de dés (diceCount), on lance (Roll, parce qu'un dé ça roule!), on additionne et on as le resultat.
    transforme le selon tes besoins.
    en TP/TPW tu peu utiliser le mots Object contre class(TRPeObject), les zones private, public ne sont peut être pas accéptée par TP.


    en quoi Tplayer et TDice sont des objets ?

    Il sont des objets (même si c'est moins evident pour Player) car ils possédent leurs propres propriétés et méthode.
    par exemple TPlayer n'as pas de méthode Roll qui est une méthode de TDice.
    TDice n'aura pas non plus, par exemple la propriété Name de l'objet TPlayer.
    c'est le principe de la POO.
    regrouper au seins d'un même ensemble (objet) les méthodes et propriétés de traitement pour cet objet ou pour une catégorie de données (principe RAD).


    si j'aboutis à un code potable pour ce combat, sera t il facile d'adapter ça ds un EDI plus moderne comme Delphi ?


    tout à fait, l'adaptation de code "ancien" est plus simple sur un IDE récent, mais des modifications seront à prevoir.
    il est inutile de travailler sur TP puis de réadapter pour Delphi ou Lazarus.
    autant travailler directement sur Delphi ou Lazarus pour bénéficier d'une puissance de code bien plus conséquente dés le départ.

    par exemple TP/TPW ne disposant pas d'un réel modèle objet il sera plus contraignant de travailler un modèle procédurale sous TP puis de l'adapter en modèle objet sous Delphi/Lazarus.

    cela serait même un bon exercice d'apprentissage de Delphi ou Lazarus que de coder un tel moteur de jeux dessus.
    [ 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!

  2. #42
    Membre confirmé 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
    Par défaut
    une pré-alpha expérimentale, alors c'est moi le Béta

    en tout cas oui ces unités m'éclairent sur l'organisation du machin

    tu pourrais même écrire un tuto grâce à ces exemples car je suis sur que des amateurs de RPG il y en a plein.

    moins d'un an pour maitriser le Pascal dois je y croire ?

    ça fait déjà 1 an que j'essaie de comprendre l'intérêt des pointeurs

    quand j'aurais bien compris les bases je m'investirai ds les tuto sur la POO, là mes neurones sont déjà en surchauffe, j'ai 49 balais quand même, ça rentre pas comme à 20 ans

    je me donne jusqu'à noël pour le code pur ds TPW, pdt mes vacances je zapperai sur lazarus puisque c'est visiblement l'avenir

    oui ce projet est une formidable idée motivante pour bosser, je suis sûr que beaucoup de jeunes pourraient appliquer ce principe du projet ludique, c'est très motivant pour apprendre.

    encore une fois ce site est une bénédiction, merci à vous tous, vous êtes formidables

    ça évite ça:

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    ça fait déjà 1 an que j'essaie de comprendre l'intérêt des pointeurs
    Pose tes questions sur les pointeurs dans un autre fil de discussion et je te répondrai. Le mieux c'est de donner un bout de code en exemple qui ne fonctionne pas ou auquel tu ne comprends rien (un code de base au début, pas un machin hyper compliqué avec des allocations/désallocations dans tous les sens) et je te le rends corrigé et/ou commenté.

  4. #44
    Membre confirmé 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
    Par défaut
    merci richard, oui quand j'aurai fini de programmer mes procédures de combat, je les posterai ici, faudra pas se moquer hein !!

    alors je me remettrai à ces foutus pointeurs dont je ne vois strictement pas l'intérêt mais je n'en ai nulle envie pour le moment

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    une pré-alpha expérimentale, alors c'est moi le Béta

    mais non mais non!


    en tout cas oui ces unités m'éclairent sur l'organisation du machin

    tant mieux, sans une bonne hiérarchisation, tout comme sans règles, on ne peut pas travailler correctement.
    travailler sur papier (faire des tableaux, schema, diagrammes etc) est un plus.


    tu pourrais même écrire un tuto grâce à ces exemples car je suis sur que des amateurs de RPG il y en a plein.

    houla, je suis loin de maitriser le sujets...


    moins d'un an pour maitriser le Pascal dois je y croire ?

    oui, c'est faisable.


    ça fait déjà 1 an que j'essaie de comprendre l'intérêt des pointeurs

    progresse par étapes, les pointeurs se voient bien aprés la compréhension des concepts de base (syntaxe, variables, procédures, types, programmation lineaire, programmation procédurale, POO ...) de la programmation et du fonctionnement d'un ordinateur (CPU, RAM, Assembleur).
    la comprehension des pointeurs viendra plus naturellement par la suite.
    comprendre le concept des registre CPU et le fonctionnement de RAM permet de bien comprendre ce qu'est un pointeur.

    pour te rassurer, j'ai mis au moins 15 ans pour comprendre les pointeurs et savoir m'en servir en pascal.
    à l'époque ou j'ai commencé la programmation pascal, il n'y avait pas internet!
    et les livres sur le Pascal etait rare et cher.
    difficile de comprendre ce concept, seul, sans référence ou aide.
    donc en commençant le pascal à l'age de 12 ans je n'ai réellement compris les pointeurs que vers 25 ans!
    le déclic c'est fait en 2005 en comprenant correctement le fonctionnement du CPU de la RAM et des notions d'assembleur grâce à des gens comme Florenth, DelphiProg ou BruNews sur Delphi Fr.
    une fois cela aquit, j'ai pus progresser et aller de plus en plus loin.
    je suis passé d'un niveau que je qualifie de chaotique et faible à un meilleur niveau en 1 ou 2 ans, à peine.
    mais mon passé en programmation m'a bien aidé. c'est pour ça qu'estimer de un an à trois ans pour maitriser correctement le langage n'est pas une aberration.
    je connais pleins de monde de tout age (16 à 70 ans), ayant appris très vite le C ou le Pascal. la période est moyennement la même, de 1 à 3 ans environ selon la possibilité d'avoir du temps à y consacrer.
    un exemple, sur Delphi Fr, l'un des membres à 74 ans et à appris tout seul Delphi... il fait de petits jeux, qui sont généralement addictif et amusant.
    comme quoi ...


    quand j'aurais bien compris les bases je m'investirai ds les tuto sur la POO, là mes neurones sont déjà en surchauffe, j'ai 49 balais quand même, ça rentre pas comme à 20 ans

    c'est sur! l'avantage de l'age, c'est la culture. trouver des méthaphores ou faire des analogies simple pour les transformer en moyens memotechnique est un plus que les jeunes n'ont pas!

    par exemple, essayer de comprendre les pointeurs d'une façon technique ou éléctronique, serait stupide, voir incomprehensible.
    par contre, si tu explique les pointeurs avec une commode à tiroir :

    - la commode represente la mémoire,
    - les étiquettes placés sur les tirroirs de la commode representent les adresses memoires (tiroir A, tiroir B, tiroir C...).
    - une camera mobile, nous permet de voir ce qui est present dans le tiroir, cette camera peut être déplacée dans un autre tiroir grace à un bouton + et un bouton -, cette camera représente le pointeur.

    voila comment vulgariser graçe à des choses connues par les lambdas un concept technique complexe.

    la commode à tiroir est une bonne métaphore en informatique, on peut l'utiliser pour expliquer la memoire, le CPU, le disque dur, la defragmentation des fichiers etc.

    - on s'imagine plus facilement un meuble commode qu'une barrette mémoire ou le coeur d'un processeur.
    - on s'imagine plus facilement "le foutoir" dans un tiroir ou dans une chambre, que la fragmentation des fichiers ou le principe de stockage sur un support physique.
    - on s'imagine plus facilement les actes sexuels, que les principes d'entrée sortie sync/async d'un protocole de communication quelconque.

    vulgarisé par une chose connue est trés trés benefique dans la compréhension primaire d'un concept aussi complexe soit il.

    comme expliquer les interractions d'etat quantique avec un vieux matou enfermé dans une boite (voir le Chat de Schrödinger).
    ou encore expliquer avec des bouts de ficelle la complexe theorie des cordes.
    expliquer avec du sel du poivre et de l'eau le principe du disque solaire et la creation des planètes etc.

    tu dois garder cela à l'esprit. toujours appréhender simplement par la métaphore ou l'analogie simple, un problème complexe.
    beaucoup de programmeur oublie cette notion quand ils commentent leurs codes.



    je me donne jusqu'à noël pour le code pur ds TPW, pdt mes vacances je zapperai sur lazarus puisque c'est visiblement l'avenir

    Lazarus ou Delphi, les deux sont à voir. bien que Lazarus fera j'espère plus de progrès au niveau de l'IDE dans les versions à venir.
    [ 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. #46
    Membre chevronné
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    merci richard, oui quand j'aurai fini de programmer mes procédures de combat, je les posterai ici, faudra pas se moquer hein !!
    Ce n'est pas le genre de la maison ...

    Citation Envoyé par maxiNoob Voir le message
    alors je me remettrai à ces foutus pointeurs dont je ne vois strictement pas l'intérêt mais je n'en ai nulle envie pour le moment
    Si tu utilises ensuite une bibliothèque comme la SDL (2D très bien foutue) tu verras que c'est indispensable, tu ne peux rien faire sans les pointeurs.

  7. #47
    Membre confirmé 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
    Par défaut
    voilà le padawan vous tient au courant de ses aventures palpitantes

    ici le code pour trier l'équipe puis les monstres (tri à bulle classique):

    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
    Procedure ordreCombat;
    var
       tmp : tPerso;
     
    Begin
         for i := 1 to NbHerosAlive do
         begin                    {tri selon l'agilité(caracP[5] }
             for j := NbHerosAlive-1 downto i do
             begin
                 if Perso[j].caracP[5] < Perso[j+1].caracP[5] Then
                                   Begin
                                    tmp := perso[j];
                                    perso[j] := perso[j+1];
                                    perso[j+1] := tmp;
                                   End;
             end;
         end;
     
         {tri des monstres stockés ds le tableau monst[] selon l'agilité(caracP[5] }
             for i := 1 to NbMonsters do begin        
             for j := NbMonsters-1 downto i do begin
                 if monst[j].caracP[5] < monst[j+1].caracP[5] Then
                                   Begin
                                    tmp := monst[j];
                                    monst[j] :=monst[j+1];
                                    monst[j+1] := tmp;
                                   End;
     
             end;
         end;
    end;
    les voilà en ordre de bataille

    et voilà le code de combat optimisé puisqu'il fonctionne
    ça n'est probablement pas académique mais je ne vois pas comment faire autrement

    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
      writeLn; writeLn('!! Votre équipe est sauvagement attaquée par: !!');
     
         REPEAT
            writeln; ShowMonsters;writeLn;ShowTeam;WriteLn; {procedures qui affiche monstres puis héros }
    { chaque héro choisit sa cible stockée ds le tableau targets[] }
                  for i := 1 to NbHerosAlive do
                    Begin             
                      write(' > Choix de ', perso[i].name,': ');
                      targets[i]:= aKey(1,NbMonsters);
                    end;
              Repeat
                 ClrScr;
                 ShowMonsters;
                   if (IndexMonster <= NbMonsters) and (IndexPerso <= NbHerosAlive) Then
                      begin
                       if (perso[IndexPerso].caracP[5] >= monst[IndexMonster].caracP[5])
                                Then heroAttack
                                Else monstAttack;
                      end
                   Else if IndexMonster > NbMonsters Then heroAttack
                                                     Else monstAttack;
     
                 Delay(tempo);
               Until ((IndexPerso = NbHerosAlive+1) and (IndexMonster = NbMonsters+1))  {**fin d'un tour de jeu **}
                  or ((NbMonsters=0) or (NbHerosAlive=0));
            IndexPerso := 1;IndexMonster :=1;
         UNTIL (nbHerosAlive = 0) or (nbMonsters = 0);
    j'essaie aussi de mettre ça ds une unité spécialisée, mais il me renvoie des messages d'erreurs car il ne reconnait pas les variables (unknown identifier)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Citation Envoyé par maxiNoob Voir le message
    j'essaie aussi de mettre ça ds une unité spécialisée, mais il me renvoie des messages d'erreurs car il ne reconnait pas les variables (unknown identifier)
    Poste le code complet de ton unité. A priori c'est un problème de visibilité des variables.

  9. #49
    Membre confirmé 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
    Par défaut
    heu je poste le truc en vrac, attention c'est un gros boxon

    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
    223
    224
    225
    226
    227
    228
    229
    230
    unit Ucombats;
     
    interface
     
    Type
        tPerso = record
         name : string[25];
         race : byte;
         carrier : byte;
         level : 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;
     
     Procedure ordreCombat;
     Procedure HeroAttack;
     Procedure monstAttack;
     Procedure ShowMonsters;
     Procedure victory;
     Procedure combat;
     
     
    implementation
     
     
    Procedure ordreCombat;
    var
       tmp : tPerso;
       i,j: integer;
     
    Begin
         for i := 1 to NbHerosAlive do begin          {tri selon l'agilité(caracP[5] }
             for j := NbHerosAlive-1 downto i do begin
                 if Perso[j].caracP[5] < Perso[j+1].caracP[5] Then
                                   Begin
                                    tmp := perso[j];
                                    perso[j] := perso[j+1];
                                    perso[j+1] := tmp;
                                   End;
     
             end;
         end;
         clrscr;writeln(' tri des perso: ');
         for i := 1 to NbHerosAlive do writeln(Perso[i].caracP[5],' - ',Perso[i].name);
     
              for i := 1 to NbMonsters do begin                    {tri selon l'agilité(caracP[5] }
             for j := NbMonsters-1 downto i do begin
                 if monst[j].caracP[5] < monst[j+1].caracP[5] Then
                                   Begin
                                    tmp := monst[j];
                                    monst[j] :=monst[j+1];
                                    monst[j+1] := tmp;
                                   End;
     
             end;
         end;
         {writeln(' tri des monstres: ');
         for i := 1 to NbMonsters do writeln(monst[i].caracP[5],' - ',monst[i].name);
         readkey;}
    end;
     
     
     
    Procedure HeroAttack;
    var degat: integer;
    Begin
         if IndexPerso = nbHerosAlive+1 then exit;
         WITH Perso[IndexPerso] DO Begin
               if targets[IndexPerso] > NbMonsters then dec(targets[IndexPerso]);
               write('  > ',name,' attaque ', monst[targets[IndexPerso]].name,' avec son ',Objet[1,weapon1]);delay(tempo);
               write(' et Jette le Dé de test ');D1 := un_D(100);writeLn(D1);delay(tempo);
     
                if (weapon1 = 3) or (weapon1 = 6) then                                  { ** Test CT (TIR) **}
                                   if D1 <= caracP[2] then test := true
                                                     Else test := false;
                if (weapon1 <> 3) and (weapon1 <> 6) then                                 { ** Test CC (Combat) **}
                                   if D1 <= caracP[1] then test := true   
                                                     Else test := false;
                if test = false then writeln('   !!!!  Raté  !!!!')
                Else Begin
                 writeLn;Write('  > ',name, ' Jette le Dé de dégats:');delay(tempo);
                 D1 := un_D(10);writeLn(D1);
                 writeLn;
             Degat := D1 + CaracS[3] + ValArme[1,weapon1] -
             monst[targets[IndexPerso]].def - monst[targets[IndexPerso]].caracS[4];
                 if weapon1 = 3 then degat := degat - CaracS[3];
                 if Degat <0 then degat := 0;
                 write(' Vous  infligez: ');
                 writeln(degat,' pv à: ',monst[targets[IndexPerso]].name);
                 Delay(tempo);
                 dec(monst[targets[IndexPerso]].caracS[2],degat);
                   if monst[targets[IndexPerso]].caracS[2] <= 0 then
                   begin
                    writeln(' !! ',monst[targets[IndexPerso]].name,' est mort !!');writeln;delay(tempo);
                    inc(perso[Indexperso].ptExp,5);
                    writeLn('  > ',perso[indexPerso].name,' a tué ce monstre, et remporte 5 PtsExp');
                    if targets[IndexPerso] < NbMonsters then
                           begin
                              for i := targets[IndexPerso]+1 to NbMonsters do  monst[i-1] := monst[i];
                           end;
                    Dec(NbMonsters);
                    if IndexMonster = NbMonsters+2 Then Dec(IndexMonster);
                   end;
                 End;
                Delay(tempo);
            end;
    Inc(IndexPerso);
    End;
     
     
    Procedure monstAttack;
    var sort : byte;
        degat: integer;
     
    Begin
     
    sort := random(nbHerosAlive)+1;
    Write('  > ',monst[IndexMonster].name,' attaque ', perso[sort].name);Delay(Tempo);
      WITH Monst[IndexMonster] DO Begin
               D1 := un_D(100);writeLn(D1);
     
                if weapon1 = 3 then                                  { ** Test CT (TIR) **}
                                   if D1 <= caracP[2] then test := true
                                                      Else test := false;
                if weapon1 <> 3 then                                 { ** Test CC (Combat) **}
                                   if D1 <= caracP[1] then test := true   
                                                      Else test := false;
                if test = false then writeln(' !! Raté !!')
                Else Begin
                 Write('  > ',name, ' Jette le Dé de dégats:');Delay(Tempo);
                 D1 := un_D(10);writeLn(D1);
                 writeln;
             degat := D1 + CaracS[3] + ValArme[1,weapon1] - perso[sort].def - perso[sort].caracS[4];
                 if weapon1 =  3 then degat := degat - CaracS[3];
                 IF Degat <0 then degat :=0;
                 write(' !! >', perso[sort].name,' est touché et perd: ');
                 writeln(degat,' pv !!');
                 dec(perso[sort].caracS[2],degat);
                 Delay(Tempo);
                end;
        End;  
     inc(IndexMonster);
    End;
     
     
    Procedure ShowMonsters;
    Begin
     
         menu:=' #### MONSTRES #### ';showtitle(menu);menu :='';
         for i := 1 to NbMonsters do
            begin
            writeLn(' > ',i,' . ',monst[i].name,' : ',monst[i].caracS[2]);
            writeLn;
            end;
    End;
     
    Procedure victory;
    var sort, fric  : integer;
     
    begin
        sort := random(nbHerosAlive)+1;
        for i := 1 to nbherosAlive do inc(perso[sort].ptExp,difficulty);
        WriteLn;WriteLn('  > Bravo! l''équipe a gagné ',difficulty,' Pts Exp'); writeLn;
        sort := random(nbHerosAlive)+1; Delay(Tempo);
        fric := random(15)+5;
        inc(perso[sort].money,fric);
        WriteLn('  > Hé Hé,',perso[sort].name,' a trouvé une bourse de ',fric,' écus');
    end;
     
     
     
    Procedure combat;
    Var
       sort, fric, points: integer;
       Key: string[1];
     
     
    Begin
     
         difficulty := 0; NbMonsters := random(5)+1; 
               for i := 1 to NbMonsters do
                begin
                 extract_a_monster(pathM1,a_monster);
                 monst[i] := a_monster;
                 difficulty := TRUNC((difficulty + a_monster.caracS[2])/3);
                end;
               ordreCombat; IndexPerso := 1; IndexMonster := 1; {initialisation des indices de personnages et monstres}
               ClrScr; menu := ' ####  COMBAT  ####';
               ShowTitle(menu); menu := '';
               changeTempo;
               writeLn; writeLn('!! Votre équipe est sauvagement attaquée par: !!');
     
         REPEAT
            writeln; ShowMonsters;writeLn;ShowTeam;WriteLn;
                  for i := 1 to NbHerosAlive do
                    Begin             
                      write(' > Choix de ', perso[i].name,': ');
                      targets[i]:= aKey(1,NbMonsters);
                    end;
              Repeat
                 ClrScr;
                 ShowMonsters;
                   if (IndexMonster <= NbMonsters) and (IndexPerso <= NbHerosAlive) Then
                      begin
                       if (perso[IndexPerso].caracP[5] >= monst[IndexMonster].caracP[5])
                                Then heroAttack
                                Else monstAttack;
                      end
                   Else if IndexMonster > NbMonsters Then heroAttack
                                                     Else monstAttack;
     
                 Delay(tempo);
               Until ((IndexPerso = NbHerosAlive+1) and (IndexMonster = NbMonsters+1))  {**fin d'un tour de jeu **}
                  or ((NbMonsters=0) or (NbHerosAlive=0));
            IndexPerso := 1;IndexMonster :=1;
         UNTIL (nbHerosAlive = 0) or (nbMonsters = 0);
        Victory;
        readkey;
    End;
     
     
     
     
    end.

  10. #50
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    NON! NON! NON! NON ET NON!

    je ne suis pas d'accord!

    ça ne vas pas du tout!





    si tu continus à coder de cette façon, tu vas mettre trois cents ans à le faire ton jeux!

    alors c'est trés bien d'un coté, tu comprend bien la problèmatique et tu arrive à implementer les codes fournis.
    nickel.
    mais :

    1 - ton code n'est pas clair, le nomage ou le typage des éléments est hasardeux.
    par exemple, si je sais que CaracP[5] est l'agilité, je n'ai aucune idée du reste.
    les index peuvent être mis dans des constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const
      caraStrength = 1;
      caraWisdom = 2;
      caraAgility = 5;
    et les utiliser dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Perso[j].caracP[caraAgility] < Perso[j+1].caracP[caraAgility] Then
    sinon dans deux trois mois, tu ne saura plus a quoi correspond qui.

    C'est d'ailleurs l'une des premières chose que je t'avais dis dans ce sujet.


    2 - l'indentation de ton code est fouillis! on ne peu pas lire clairement, ce n'est pas bien.
    tu doit bien indenter ton code, c'est cela qui le rend clair et lisible.
    les indentation de 8 espaces c'est inutile. c'est du pascal, pas du dreamweaver. Sous python, tu te ferais insulter par le compilo.
    2 espaces pour tout nouveau bloc est suffisant!
    tu te lassera vite quand ton code sera de plus en plus conséquent et mal indenté.
    exemple de bonne indentation (avec nettoyage) :
    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
    Procedure ordreCombat;
    var
      tmp  : tPerso;
      i, j : integer;
    begin
      for i := 1 to NbHerosAlive do
        for j := NbHerosAlive-1 downto i do
          if Perso[j].caracP[5] < Perso[j+1].caracP[5] Then
          begin
            tmp        := perso[j];
            perso[j]   := perso[j+1];
            perso[j+1] := tmp;
          end;
     
      clrscr;
      writeln(' tri des perso: ');
     
      for i := 1 to NbHerosAlive do
        writeln(Perso[i].caracP[5],' - ',Perso[i].name);
     
      for i := 1 to NbMonsters do
        for j := NbMonsters-1 downto i do
          if monst[j].caracP[5] < monst[j+1].caracP[5] Then
          Begin
            tmp        := monst[j];
            monst[j]   := monst[j+1];
            monst[j+1] := tmp;
          end;
     
    end;

    3 - pense à séparer les données, le traitement et l'affichage!
    ne mélange pas tout.
    gere l'affichage d'un coté, le traitement de l'autre et l'affichage encore d'un autre.
    un moteur de jeu doit pouvoir fonctionner sans affichage, ou ne pas être dépendant de l'affichage.
    si un jours tu passe le code sous delphi avec une interface graphique, tu devra TOUT modifier. et tu ne le fera pas car trop chiant.
    si un jours tu décide de mettre un veritable affichage 2D dans le jeu, tu devra TOUT modifier. et tu ne le fera pas car trop chiant.

    L'idée est claire, tu doit correctement séparer chaque element, c'est la base même de la programmation.
    traitement d'un coté, donnée de l'autre et affichage a part.

    pendant l'élaboration, l'affichage sera surtout des lignes de debug.
    aprés la permiere version, l'affichage sera comme il doit etre, texte ou image
    aprés evolution etc, l'affichage pourra etre 2D, 3D etc.

    tu doit pouvoir extraire facilement les choses de ton moteur.

    fait attention aussi de ne pas rendre tes fonctions dépendantes de variables globales.
    la fonction "machin" de l'unité "truc", ne doit pas utiliser la variable globale "bidule" de l'unité "chose".
    par contre la fonction peut prendre un parametre de type "TBidule" contenue dans l'unité "chose".


    voila.
    [ 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!

  11. #51
    Membre confirmé 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
    Par défaut
    je m'attendais à une remontée de bretelles, elle est salutaire

    merci DOC

    évidemment que je ne suis pas organisé, je suis débutant et j'ai des reminissence du BASIC de mes 20 ans, qui était un sacré boxon

    1.géniale l'idée de remplacer les index par des constantes


    2.je comprend ce que tu m'expliques de ne pas mélanger moteur et affichage, mais comment faire autrement ? je dois bien afficher qq chose, le jeu ne peut pas tourner tout seul sans rien montrer, comment les séparer.

    Je dois mettre l'affichage en procédures que j'appelle, c'est ça ?


    je vais suivre tes conseils et essayer de réarranger tout ça, j'ai effectivement beaucoup de problèmes avec les variables et les variables globales sont la solution des noobs comme moi.

    je vais revoir ma copie, mais il n'est pas dit que j'y arrive

    vous comprenez mieux pourquoi il est prématuré pour moi de faire un objet ou d'utiliser des pointeurs , il y a 2 mois je connaissais rien au Pascal , merci de votre soutien et votre patience, sans vous, j'aurai abandonné

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Les variables :

    Citation Envoyé par Freepascal
    Identifier not found "NbHerosAlive"
    Ucombats.pas(39,31) Error: Identifier not found "NbHerosAlive"
    Ucombats.pas(40,22) Error: Identifier not found "Perso"
    Ucombats.pas(40,43) Error: Identifier not found "Perso"
    Ucombats.pas(44,38) Error: Identifier not found "perso"
    Ucombats.pas(49,12) Error: Identifier not found "clrscr"
    Ucombats.pas(50,33) Error: Identifier not found "NbHerosAlive"
    ... j'abrège un peu
    Ucombats.pas(82,25) Error: Identifier not found "weapon1"
    Ucombats.pas(82,25) Fatal: There were 50 errors compiling module, stopping
    Tu m'étonnes que le compilo gueule comme un veau !

    Tes 50 erreurs proviennent ESSENTIELLEMENT du fait que tu n'as pas déclaré les variables NbHerosAlive, perso, NbHerosAlive, NbMonsters, monst, IndexPerso, targets, weapon1, test, caracP, D1, tempo, delay, un_D, Objet, name, ... et j'en oublie peut-être ! ...
    En Pascal, il faut déclarer toutes les variables (par rapport au BASIC cela peut paraître contraignant, mais l'expérience prouve que c'est indispensable quand on veut programmer de vrais programmes pas de petits joujoux. )
    Pour le message concernant 'clrscr' ce n'est pas une variable, c'est une procédure de l'unité 'Crt', il faut donc rajouter la clause juste après le mot clé 'Implementation'

    Voici ta première procédure corrigée, indentée (à ma façon mais elle ne diffère pas de celle préconisée par Dr Who) et avec variables déclarée + commentaires sur la source des messages du compilo.

    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
     implementation
     
    uses crt; {pour utiliser la fonction 'clrscr'}
     
    Procedure ordreCombat;
    var
     
       tmp : tPerso;
       i,j,NbHerosAlive,Nbmonster: integer;
     
     
    Begin
     
        for i := 1 to NbHerosAlive do begin          {tri selon l'agilité(caracP[5] }
          for j := NbHerosAlive-1 downto i do begin 
            {ton tableau de personnage n'est pas déclaré !}
            if Perso[j].caracP[5] < Perso[j+1].caracP[5] Then
              Begin
                tmp := perso[j]; 
                perso[j] := perso[j+1];
                perso[j+1] := tmp;
            end;{end if}
          end;{end 'for j '}
        end;{end 'for i'}
    clrscr;
    writeln(' tri des perso: ');
    for i := 1 to NbHerosAlive do 
      writeln(Perso[i].caracP[5],' - ',Perso[i].name); 
    {Error: Identifier not found "NbMonsters" => variable non déclarée !}
      for i := 1 to NbMonsters do begin                    {tri selon l'agilité(caracP[5] }
        for j := NbMonsters-1 downto i do begin
        {Cachez ce 'monst' que je ne saurais voir ... : idem !}
          if monst[j].caracP[5] < monst[j+1].caracP[5] Then
            Begin
              tmp := monst[j];
              monst[j] :=monst[j+1];
              monst[j+1] := tmp;
            End;{end if}
        end;{end 'for j'}
      end; {end 'for i'}
     {writeln(' tri des monstres: ');
     for i := 1 to NbMonsters do writeln(monst[i].caracP[5],' - ',monst[i].name);
      eadkey;}
    end;{procedure OrdreCombat}
    Tu verras que j'ai mis des commentaires type {end if}, { end for} à la fin des boucles et de la procédure, à la sauce BASIC justemet, c'est utile de faire comme ça quand on débute pour s'y retrouver avec les boucles imbriquées.
    Attention ta procédure n'est toujours pas fonctionnelle car les tableaux de personnages et de monstres ne sont pas déclarés dans ton unité. S'ils sont déclarés dans une autre unité il faut les rendre visibles par une clause 'Uses' sinon il faut les déclarer dans cette unité.

    Met au point d'abord UNE procédure (celle-là par exemple) après fait petit à petit. Il y a du taf

  13. #53
    Membre confirmé 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
    Par défaut
    merci prof Richard, je suis parti d'un programme unique dans lequel toutes ces variables sont déclarées, appliquant vos conseils et exemples j'essaie de créer des unités spécialisées et c'est là que je me perd, car certaines variables sont nécessaires à toutes les unités comme celles des personnages.

    je comprends le concept de variables locales/globales pour un programme unique, la procédure permettant de ne pas gacher la mémoire en libérant ses variables, d'où son intérêt, mais avec des unités séparées là je ne sais plus comment m'y prendre.

    mon dieu que c'est dur d'être organisé

    pour ClrScr TPW utilise WinCrt (crt est refusé)

    j'ai promis de lache TPW à Noël

    ha la la si j'y arrive, ce jeu vous devra beaucoup, il commencera par un hommage à vous tous, p-e y aura t il ds le scénario certains personnages appelés "Who the Wizard" ou "Maitre Richard" et les autres bien sûr...

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    OK, OK ...

    Mon conseil du jour : limite toi pour l'instant à une ou deux unités et un programme principal. Ce sera plus simple pour comprendre le principe Interface / implémentation

    La partie interface définit les entités qui seront visibles de l'extérieur de l'unité par les programmes (ou les autres unités) qui utilisent cette unité, donc qui la référencent par la clause 'Uses'. C'est le principe de la (vraie) compilation séparée (introduite par Ken Fowles dans le Pascal UCSD et reprise par With dans Modula). Il faut bien le comprendre c'est une clé importante pour produire du code modulaire.

    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
    unit Ucombats;
     
    interface {tout ce qui suit est visible de l'extérieur, ces entités sont dites "publiques"}
     
    Type
        tPerso = record
         name : string[25];
         race : byte;
         carrier : byte;
         level : 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;
     
     Procedure ordreCombat;
     Procedure HeroAttack;
     Procedure monstAttack;
     Procedure ShowMonsters;
     Procedure victory;
     Procedure combat;
     
     {jusque là}
    implementation
    
     {si tu déclares d'autres entités (procédures, fonctions ou variables/constantes) elles seront "privées" donc non visibles de l'extérieur. Leur portée sera limitée à l'unité}
    La notion de "portée" des variables est très importante.

    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
     
    Unit Gestion_Pers;
     
    Interface
     
    Type
        tPerso = record
         name : string[25];
         race : byte;
         carrier : byte;
         level : 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;
     
    Var
         perso : Array[1..20] of tPerso; {création d'un tableau de 20 personnages , tu apprendras après à gérer les tabeaux dynamiques}
         Monst : Array[1..20] of tPerso; {il faut te créer un type "monstre" s'il diffère du type TPerso (je suis une burne en jeu de rôle, désolé si j'ai dit une bêtise)}
     
       Procedure UpdatePerso; {sert à enlever les personnages morts du tableau ..}
        etc.
     
    Implementation
     
       {ton code}
    J'espère que cet exemple est un peu plus clair. En résumé : tu fais une unité qui gère tes personnages dans tout le jeu puis une autre qui gère les combats et tu les utilises dans ton programme principal. Tu n'oublies surtout pas d'enlever 'tPerso' de l'unité 'Ucombats' bien sûr.

  15. #55
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    alors alors,


    pour bien séparer et d'un coté les données, et d'un coté le traitement et de l'autre l'affichage :

    je te propose de regarder mon MasterMind à titre d'exemple.
    et encore, c'est loin d'être le meilleur exemple que j'ai sous la main.
    je l'ai fait en 2006 alors que j'etais à peine sortis des jupons de maitres Jedi.
    c'est surtout pour te montrer comment on peu extraire facilement le mastermind engine et montrer qu'il n'est pas dépendant du tout de l'interface.


    en gros, chaque chose doit être pensée pour une utilisation standalone.

    par exemple voici un exemple de fonction qui affiche un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure ShowTable;
    begin
      for i := 0 to high(Table) do
      begin
        Table[i] := i;
        writeln(Table[i]);
      end;
    end;
    ici, la fonction est dépendante des variables globales du programme et de l'affichage.
    i et table sont les variables globales.
    writeln est l'affichage.
    cela ne vas pas ... trop de chose à modifier.
    par exemple, si je renome Table ou supprime i il faudrat tout modifier...
    fastidieux.

    voici la même chose, mais en mieux :
    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
     
    const
      MaxTable = 100;
     
    type
      TTable = array[0..MaxTable-1] of integer;
     
    procedure FillTable(var Table: TTable);
    var i : integer;
    begin
      for i := 0 to MaxTable-1 do
        Table[i] := i+1;
    end;
     
    procedure ShowTable(const Table: TTable);
    var i : integer;
    begin
      for i := 0 to MaxTable-1 do
        writeln(Table[i]);
    end;
     
    procedure ShowTableForDelphi(const Table: TTable; Strings: TStrings);
    var i : integer;
    begin
      Strings.BeginUpdate;
      try
        Strings.Clear;
        for i := 0 to MaxTable-1 do
          Strings.Add(IntToStr(Table[i]));
      finally
        Strings.EndUpdate;
      end;
    end;
     
     
    var
      Table1, Table2 : TTable;
    begin
      FillTable(Table1);
      FillTable(Table2);
      ShowTable(Table1);
      ShoTableForDelphi(Table2);
    end.
    plus de code, mais regarde, je peux utiliser la même fonction pour deux table differente, et gérer deux affichage different comme bon me semble.
    tout ça parce que j'ai séparer, donnée (TTable), traitement (FillTable) et affichage (ShowTable et ShowTableForDelphi)

    si tu arrive à penser de la sorte, alors tu y vera plus clair.

    voila.


    en TP/TPW on peut utiliser des fonctions de dessins (MoveTo, LineTo etc)
    il sera trés facile d'ecrire dans le même methode de dessins qui prend en parametre la donnée un code pour TP/TPW et un code Delphi :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Line(const X1, Y1, X2, Y2: integer);
    begin
      {$IF RTLVersion < 13.0}
        MoveTo(X1, Y1);
        LineTo(X2, Y2);
      {$ELSE}
        Canvas.MoveTo(X1, Y1);
        Canvas.LineTo(X2, Y2);
      {$IFEND}
    end;
    mes données X* et Y* sont indépendantes, elle peuvent venir de n'importe ou.
    l'affichage quand à lui et automatiquement géré par le compilateur selon la version de ce dernier (< 13 = TP/TPW, > 13 = Delphi/Kylix/BCC)
    donc, que j'appel la methode Line dans l'un de ces IDE, aucun probleme, rien à modifier.
    [ 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!

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    J'en profite pour te donner la référence d'un bon bouquin pour le Turbo Pascal7 (marche aussi pour FreePascal, donc) celui de Claude delannoy : Programmer en Turbo Pascal 7 ed Eyrolles, c'est un grand classique. Le voici à pas cher :

    c'est ici

    L'investissement est ridicule, le gain énorme.

    Il y a mieux : la série des John Colibri chez Mnémodyne (Découvrez Turbo Pascal tome 1 & 2 ) par le légendaire créateur du Club Pascal et éditeur de la revue (défunte) Pascalissime. Un "must" hélas presque introuvable aujourd'hui. Je ne vends pas les miens !

  17. #57
    Membre confirmé 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
    Par défaut
    ^^ hé hé ça tombe bien, je l'ai ce livre mais pour le moment j'ai surtout utilisé votre site si complet

    richard> ok je vais essayé de créer ces 2 unités, mais ma variable tPerso je la déclare où ? ds le prog principal ? ds une unité ?

    et ds l'interface de l'unité combat je dois mettre (le prog principal) ? pour qu'il reconnaisse toutes ces variables ? à moins que je ne fasse la chasse aux variables globales...

    doc > oui je comprend mieux cette séparation, c'est vraiment plus élaboré et adaptable

    je peux tout refaire

    t'as pas de l'aspirine Doc ?

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Tu as deux unités et un programme principal.

    1) Unité U_Gestion_Pers qui va :
    Créer les personnages (donc déclaration de tPerso)
    Détruire les personnages
    Modifier les personnages (points de vie et tout le tralala)
    Etc.

    2) Unité UCombats qui va
    Choisir les pers qui combattent
    Calculer le résultat du combat
    etc.

    3) Un programme principal dans lequel, dans l'idéal il n'y a aucune variable globale et qui n'utilisera que les procédures et fonctions des unités.

    Ensuite il faut faire le "plan de masse" du programme, un tableau à double entrée (papier/crayon) qui indique qui appelle qui, qui se sert de qui ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Ex :
              ================================
              |Prg Princ|U_Gestion_P| UCombats |
        ========================================
     Prg Princ  |       |      X    |    X    |
        ========================================
    U_Gestion_Pers|      |         |     X    |
      ==========================================
      UCombats    |      |     X   |          |
    ===========================================

    On peut voir sur ce plan de masse que le prg principal utilise les deux unités. Que l'unité U_Gestion_Pers a besoin de UCombats (pour pouvoir modifier/éliminer des pers à l'issue d'un combat) et que l'unité UCombats a besoin de l'unité U_Gestion_Pers pour pouvoir manipuler les personnages, les choisir etc.

    On appelle également un tel tableau : "tableau des références croisées"

  19. #59
    Membre confirmé 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
    Par défaut
    ne mettre AUCUNE variable ds le programme principal

    Voilà le début de mon prog, ya du bognon , je met tout ça où ?

    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
    PROGRAM Jeu_de_Roles;
     
    USES WinCrt, winprocs;
     
     
    {*** Déclarations des variables et des constantes du Jeu ***}
     
    VAR
       choix, points, i, j, D1, D2, ErrorCode, hero, city,
       target, IndexPerso, IndexMonster, difficulty, tempo: integer;
       menu, suite, ok : string;
       charge, key: char;
       test: boolean;
       targets : array[1..6] of integer;
     
     
    CONST
         NbVilles = 3;
         NbRaces = 4;
         NbCarac = 16;
         NbCarrieres = 4;
         NbBoutiques = 5;
         NbObjets = 16; {8 armes & 8 armures}
         NbMonster = 8;
         NbHeros = 6; { 6 heros indicés de 0 à 5 dans le fichier}
         NbItem : Array[1..NbBoutiques] of integer = (7,7,1,1,1); { nombre d'objets ds chaque boutiques }
     
     
     
     
    {****************   création de nouveaux types de variables (des tableaux)  *****************}
     
    Type
         tVille = array[1..NbVilles] of string;
         tRace = array[1..NbRaces] of string;
         tCarriere = array[1..NbCarrieres] of string;
         tBoutiques = array[1..NbBoutiques] of string;
         tObjets = Array[1..2,0..7] of string;
         tPrixObjet = array[1..2,0..7] of integer; {prix des objets, classés par boutiques}
     
     
     
     
     
    {****************  remplissage des tableaux du jeu  ******************
     
     *** déclarations ET affectations des constantes (règles du jeu)  ***}
     
    const Objet : tObjets = (
          ('rien', 'baton', 'dague', 'arc', 'épée', 'épée à 2 mains', 'double hache','AK47'),
          ('rien','plastron en cuir','cuir clouté','cote de maille',
          'armure en écailles','armure de plaque','armure mithril','armure magique'));
     
          prix : tPrixObjet = (
          (0 , 10 , 20, 60 , 110, 180 , 300, 500),
          (0 , 15 , 35 , 150 , 400 , 1000, 1500, 2000));
     
          ValArme : tPrixObjet = (
          (-4, -2 , -1 , 3 , 0 , 1 , 2, 4),
          (0,1,2,3,4,5,6,8));
     
     
          villeJeu : tVille = ('Middenheim','Altdorf','Nuln');
          boutique : tBoutiques = ('ARMES','ARMURES','ANIMAUX','SORCELLERIE','APOTHICAIRE');
          raceJeu : tRace = ('Nain    ','Humain  ','Elfe    ', 'Halfling');
          carriereJeu : tCarriere = ('Guerrier' , 'Sorcier','Druide','voleur');
     
          CaracProfil : array[1..NbCarac] of string = ( {*** tableau du nom des 16 caractéristiques ***}
           'CC','CT','Fo','En','Ag','In','FM','So',
           'nA','pB','BF','BE','Mv','Mg','PD','PF');
     
          Carac : array[1..NbRaces] of array[1..NbCarac] of integer =(    {*** Tableau des caractéristiques de bases ***}
          (30,20,20,30,10,20,20,10,1,0,0,0,3,0,0,0),
          (20,20,20,20,20,20,20,20,1,0,0,0,4,0,0,0),
          (20,30,20,20,30,20,20,20,1,0,0,0,5,0,0,0),
          (10,30,10,10,30,20,20,30,1,0,0,0,4,0,0,0)
          );
     
     
    const pBdepart : array[1..NbRaces,1..4] of integer = (     {*** Tableau des points de Blessures au début ***}
          (11,12,13,14),
          (10,11,12,13),
          (9,10,11,12),
          (8,9,10,11)
          );
     
    const pDdepart : array[1..NbRaces,1..3] of integer = (      {*** Tableau des points de Destin au début ***}
          (1,2,3),
          (2,3,3),
          (1,2,2),
          (2,2,3)
          );
     
          cond: Array[0..1] of string = ('Mort', 'Vivant');
     
    {********************************************************************************
    ************************** Création des Personnages ******************************
    *********************************************************************************}
     
     
    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;
     
     
     
    Var
        Persos, Monsters: file of tPerso;
        Perso : Array[1..NbHeros] of tPerso;
        a_monster: tPerso;
        monst: array[1..5] of tPerso; {* monstres du combat *}
        NbMonsters, NbHerosAlive: byte;
        ChoixGene : integer;
     
     
     
    Const            {** les fichiers du jeu: héros, monstres et Boss **}
         PathTeam: string = 'c:\tpw\jdr\datas\Team.dta';                   
         PathM1 :  string = 'c:\tpw\jdr\datas\monsters.dta';
         PathBoss: string = 'c:\tpw\jdr\datas\bosses.dta';

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 476
    Par défaut
    Déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROGRAM Jeu_de_Roles;
    
    USES WinCrt, winprocs, U_Gestion_Pers, UCombats;
    Ensuite, je vois que tu as des variables qui correspondent au "décor" ou à "l'univers" (je ne sais pas comment on dit pour un RPG) donc pourquoi pas une unité : U_Decor ou U_Monde / U_World enfin tu l'appelles comme tu veux, elle te permet de gérer l'univers créé, le nombre de villes, de montagnes, de ce que tu veux, et éventuellement de les modifier si besoin.

    Au jugé (faudra affiner)

    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
    Unit U_World;
    
    CONST
         NbVilles = 3;
         NbBoutiques = 5;
         NbObjets = 16; {8 armes & 8 armures}
         NbItem : Array[1..NbBoutiques] of integer = (7,7,1,1,1); { nombre d'objets ds chaque boutique }
    
    {****************   création de nouveaux types de variables (des tableaux)  *****************}
     
    Type
         tVille = array[1..NbVilles] of string;
         tRace = array[1..NbRaces] of string;
         tBoutiques = array[1..NbBoutiques] of string;
         tObjets = Array[1..2,0..7] of string;
         tPrixObjet = array[1..2,0..7] of integer; {prix des objets, classés par boutiques}
    
    const Objet : tObjets = (
          ('rien', 'baton', 'dague', 'arc', 'épée', 'épée à 2 mains', 'double hache','AK47'),
          ('rien','plastron en cuir','cuir clouté','cote de maille',
          'armure en écailles','armure de plaque','armure mithril','armure magique'));
          prix : tPrixObjet = (
          (0 , 10 , 20, 60 , 110, 180 , 300, 500),
          (0 , 15 , 35 , 150 , 400 , 1000, 1500, 2000));
          ValArme : tPrixObjet = ((-4, -2 , -1 , 3 , 0 , 1 , 2, 4), (0,1,2,3,4,5,6,8));
          villeJeu : tVille = ('Middenheim','Altdorf','Nuln');
          boutique : tBoutiques = ('ARMES','ARMURES','ANIMAUX','SORCELLERIE','APOTHICAIRE');
          raceJeu : tRace = ('Nain    ','Humain  ','Elfe    ', 'Halfling');
        
    
    
           etc.
    L'idée c'est de faire comme ça et de penser "modulaire" comme te l'a dit ce bon Docteur. Il faut réfléchir à ça sans doute avec un crayon et un papier avant de martyriser le clavier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 24/07/2012, 17h51
  2. [AC-2007] quel type de variable pour récupérer des objets de type Ole
    Par rominous41 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/05/2011, 17h59
  3. Quel type de variable pour 20 bits?
    Par The_72 dans le forum MATLAB
    Réponses: 1
    Dernier message: 23/04/2010, 13h08
  4. Quel type de variable pour enregistrer un temps ?
    Par trigone dans le forum Langage
    Réponses: 9
    Dernier message: 07/12/2008, 21h15
  5. Réponses: 2
    Dernier message: 05/02/2008, 12h47

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