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 :

[Débutant] Jeu de la vie


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut [Débutant] Jeu de la vie
    Bonjour à tous, je suis sensé programmé un jeu de la vie dans le cadre de mes études. J'ai écrit le code ci dessous (pour l'instant, les cellules sont placées aléatoirement et il n'y a qu'un seul cycle).
    Malheureusement, le code ne fonctionne pas, et je n'arrive pas à trouver l'erreur !

    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
    Program JV;
    Uses crt;
    type matrice = array[0..19,0..19] of integer;
    Var a,b,c,d,i,j: integer;
    var t1,t2: matrice;
     
     
    Procedure remp;
    Begin
     randomize;
     i:=0;
     j:=0;
     b:=0;
     Repeat
     Repeat
     t1[i][j]:=0;
     i:=i+1;
     Until(i=20);
     i:=0;
     j:=j+1;
     Until(j=20);
     Writeln('Combien de cellules voulez-vous placer?');
     Readln(a);
     Repeat
     i:=random(19);
     j:=random(19);
     If(t1[i][j]=0)then;
     Begin
      t1[i][j]:=1;
      b:=b+1;
     End;
      Until (a=b);
    End;
     
    Procedure affi;
    Begin
    textcolor(10);
    i:=0;
    j:=0;
    Repeat
          Repeat
                If(t1[i][j]=1)then
                 Begin
                 Write('*');
                 End
                Else
                 Begin
                 Write(' ');
                End;
                i:=i+1;
          until(i=20);
    i:=0;
    j:=j+1;
    writeln('');
    until(j=20);
    End;
     
    Procedure temp;
    Begin
     i:=0;
     j:=0;
     Repeat
     Repeat
     t2[i][j]:=0;
     i:=i+1;
     Until(i=20);
     i:=0;
     j:=j+1;
     Until(j=20);
    End;
     
    {Nombre de cellules adjacentes}
     
    Procedure ncel;
    Begin
    c:=0;
    If (i<>19)and(t1[i+1][j]=1)then
    Begin
    c:=c+1;
    End;
    If (i<>0)and(t1[i-1][j]=1)then
    Begin
    c:=c+1;
    End;
    if (j<>19)and(t1[i][j+1]=1)then
    Begin
    c:=c+1;
    End;
    if (j<>0)and(t1[i][j-1]=1)then
    Begin
    c:=c+1;
    End;
    if ((i<>0) and (j<>0))and(t1[i-1][j-1]=1)then
    Begin
    c:=c+1;
    End;
    if ((i<>19) and (j<>19))and(t1[i+1][j+1]=1)then
    Begin
    c:=c+1;
    End;
    if ((i<>0) and (j<>19))and(t1[i-1][j+1]=1)then
    Begin
    c:=c+1;
    End;
    if ((i<>19)and(j<>0))and(t1[i+1][j-1]=1)then
    Begin
    c:=c+1;
    End;
    End;
     
    {vie ou mort des cellules}
     
    Procedure evol;
    Begin
     If (t1[i][j]=1)then
     Begin
      If (c=2)or(c=3)then
      Begin
       t2[i][j]:=1;
      End
     Else
     Begin
      t2[i][j]:=0;
     End;
    End;
    If (t1[i][j]=0)then
    Begin
     If (c=3)then
     Begin
      t2[i][j]:=1;
     End
     Else
     Begin
      t2[i][j]:=0;
     End;
    End;
    End;
     
    {Parcourt les cases}
     
    Procedure parc;
    Begin
    i:=0;
    j:=0;
    Repeat
    Repeat
    ncel;
    evol;
    i:=i+1;
    until (i=20);
    i:=0;
    j:=j+1;
    until (j=20)and(i=20);
    End;
     
    Procedure trans;
    Begin
    i:=0;
    j:=0;
    Repeat
    Repeat
    t1[i][j]:=t2[i][j];
    i:=i+1;
    until(i=20);
    i:=0;
    j:=j+1;
    until (j=20)and(i=20);
    end;
     
    BEGIN
    d:=0;
    clrscr;
    remp;
    affi;
    temp;
    readln;
    parc;
    trans;
    affi;
    readln;
     
    END.

  2. #2
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Par défaut
    bonjour,


    qu'est ce ui ne fonctionne pas?
    compilation? quelle ligne?
    exécution? quelle fonction?


    et indente ton code s'il te plait

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Effectivement, je n'ai pas été assez précis.
    Je parviens à compiler le programme, mais une fois les cellules placées aléatoirement et affichées, et t2 généré, le programme semble entrer dans une boucle infinie dès que la procédure "parc" .démarre.
    Par contre, je n'ai pas pu localiser précisément l'erreur... (j'ai essayé d'insérer des writeln ou des clrscr dans certaines procédures pour voir ce qui fonctionnait, mais étrangement cela fait bugger le programme).

  4. #4
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    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
     
    Procedure parc;
    Begin
    i:=0;
    j:=0;
    Repeat
    Repeat
    ncel;
    evol;
    i:=i+1;
    until (i=20);
    i:=0;
    j:=j+1;
    until (j=20)and(i=20);
    l'erreur vient de là dans parc, la deuxième condition de ton until est i=20 et j=20 hors tu remets i à 0 à chaque fois avant

    = boucle infinie


    Petite remarque: évite les variables globales, du mal de s'y retrouver et on peut presque toujours les éviter

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Merci !!!! tout marche parfaitement maintenant.
    Par contre je n'ai pas bien compris l'intêret des variables locales, vu qu'au final on en utilise plus et que c'est légérement plus complexe à programmer ?

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gai,
    Citation Envoyé par Zeo72 Voir le message
    Merci !!!! tout marche parfaitement maintenant.
    Par contre je n'ai pas bien compris l'intêret des variables locales, vu qu'au final on en utilise plus et que c'est légérement plus complexe à programmer ?
    Erreur, c'est beaucoup plus compliqué, et, comme l'a dit Tux++, ça conduit à du code non réutilisable, difficile à lire et à maintenir... bref, tous les inconvénients qu'on peut imaginer.

    Nombre de bugs viennent de l'usage de variable globales, car on finit toujours pas en mettre à jour un peu partout, en oubliant que d'autres portions du code considèrent qu'elles n'ont pas varié entre deux appels.

    En bref, à proscrire absolument pour écrire de code propre, lisible, maintenable.

    Sans oublier que la présentation du code est importante aussi : indentation, aération (lignes vides séparant les blocs logiques), et commentaires (ce qu'il faut, pas plus [par exemple, inutile de mettre un commentaire du genre { on parcours le tableau } juste à l'entrée d'une boucle qui le fait]).

    En fait partie également l'utilisation de noms explicites pour les types, fonctions, constantes, variables...

    Exemple d'indentation de code, le tien, sans aucune correction :
    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
    program JV;
     
    uses crt;
     
    type 
      matrice = array[0..19,0..19] of Integer;
    var 
      a, b, c, d, i, j : Integer;
    var 
      t1, t2 : matrice;
     
     
    procedure remp;
    begin
      Randomize;
      i := 0;
      j := 0;
      b := 0;
     
      repeat
        repeat
          t1[i][j] := 0;
          i := i + 1;
        until (i = 20);
        i := 0;
        j := j + 1;
      until (j = 20);
     
      Writeln('Combien de cellules voulez-vous placer?');
      Readln(a);
     
      repeat
        i := Random(19);
        j := Random(19);
        if (t1[i][j] = 0) then;
        begin
          t1[i][j] := 1;
          b := b + 1;
        end;
      until (a = b);
    end;
     
    procedure affi;
    begin
      textcolor(10);
      i := 0;
      j := 0;
      repeat
        repeat
          if (t1[i][j] = 1) then
          begin
            Write('*');
          end
          else
          begin
            Write(' ');
          end;
          i := i + 1;
        until (i = 20);
        i := 0;
        j := j + 1;
        Writeln('');
      until (j = 20);
    end;
     
    procedure Temp;
    begin
      i := 0;
      j := 0;
      repeat
        repeat
          t2[i][j] := 0;
          i := i + 1;
        until (i = 20);
        i := 0;
        j := j + 1;
      until (j = 20);
    end;
     
    {Nombre de cellules adjacentes}
     
    procedure ncel;
    begin
      c := 0;
      if (i <> 19) and (t1[i + 1][j] = 1) then
      begin
        c := c + 1;
      end;
      if (i <> 0) and (t1[i - 1][j] = 1) then
      begin
        c := c + 1;
      end;
      if (j <> 19) and (t1[i][j + 1] = 1) then
      begin
        c := c + 1;
      end;
      if (j <> 0) and (t1[i][j - 1] = 1) then
      begin
        c := c + 1;
      end;
      if ((i <> 0) and (j <> 0)) and (t1[i - 1][j - 1] = 1) then
      begin
        c := c + 1;
      end;
      if ((i <> 19) and (j <> 19)) and (t1[i + 1][j + 1] = 1) then
      begin
        c := c + 1;
      end;
      if ((i <> 0) and (j <> 19)) and (t1[i - 1][j + 1] = 1) then
      begin
        c := c + 1;
      end;
      if ((i <> 19) and (j <> 0)) and (t1[i + 1][j - 1] = 1) then
      begin
        c := c + 1;
      end;
    end;
     
    {vie ou mort des cellules}
     
    procedure evol;
    begin
      if (t1[i][j] = 1) then
      begin
        if (c = 2) or (c = 3) then
        begin
          t2[i][j] := 1;
        end
        else
        begin
          t2[i][j] := 0;
        end;
      end;
      if (t1[i][j] = 0) then
      begin
        if (c = 3) then
        begin
          t2[i][j] := 1;
        end
        else
        begin
          t2[i][j] := 0;
        end;
      end;
    end;
     
    {Parcourt les cases}
     
    procedure parc;
    begin
      i := 0;
      j := 0;
      repeat
        repeat
          ncel;
          evol;
          i := i + 1;
        until (i = 20);
        i := 0;
        j := j + 1;
      until (j = 20) and (i = 20);
    end;
     
    procedure trans;
    begin
      i := 0;
      j := 0;
      repeat
        repeat
          t1[i][j] := t2[i][j];
          i := i + 1;
        until (i = 20);
        i := 0;
        j := j + 1;
      until (j = 20) and (i = 20);
    end;
     
    begin
      d := 0;
      clrscr;
      remp;
      affi;
      Temp;
      Readln;
      parc;
      trans;
      affi;
      Readln;
    end.
    A réécrire d'urgence sans variables globales !!

  7. #7
    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
    Par défaut
    pourquoi utiliser des repeat alors qu' un for est est le mieux adapter ?
    Aussi, il y' a bien debordement d' indice dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If (i<>19) and (t1[i+1][j]=1) then
    .
    Si i=19, le compilateur va essayer de tester t[20][j].

  8. #8
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Par défaut
    une variable globale est une variable déclarée à l'extérieur du corps de toute fonction ou classe, et pouvant donc être utilisée n'importe où dans le programme!Cela complique donc la compréhension des procédures et des fonctions.
    De plus, le but des fonctions et procédures est la "réutilisabilité" notamment, avec des paramètres, tu peux l'appeller plusieurs fois sur des vairables différentes, et pas avec des variables globales
    De plus, une fois les coprs des fonctions ou proc terminée, la variable locale n'existe plus et ne prends pas de place en mémoire pour rien, si elle n'est plus utilisée après évidemment.

Discussions similaires

  1. [Débutant] jeu du Yam
    Par miagistevn dans le forum Général Java
    Réponses: 6
    Dernier message: 16/05/2006, 22h55
  2. [Débutant] Jeu Morpion en C++ avec OpenGL
    Par Paulinho dans le forum OpenGL
    Réponses: 2
    Dernier message: 31/03/2006, 13h15
  3. [Conception] Jeu de la vie
    Par deuscapser dans le forum Général Java
    Réponses: 16
    Dernier message: 09/03/2006, 12h47
  4. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 20h06
  5. [C réseau débutant] jeu
    Par Heimdall dans le forum Développement
    Réponses: 6
    Dernier message: 22/05/2003, 13h58

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