Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petites question sur le sokoban...

par rapport à 3 lignes de code du cours...

    16 avril 2006 à 23:36:49

    Bonsoir à toutes et à tous,
    Voià en lisant le cours de M@teo21 sur le TP du sokoban, je n'ai pas réussi à comprendre la logique de certaine ligne..:

    fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);


    Je ne comprend pas pourquoi l'on rajoute 1 aux nombre de blocs en hauteur...

    switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])


    Je suppose que la réponse par rapport au + 1 répondra à "pourquoi l'on rajoute j??"...

    if (carte[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
        break;

    Sinon ici j'ai du mal à comprendre : [pos->x][pos->y-1] ....

    D'avance merci pour vos réponses.

    @+
    • Partager sur Facebook
    • Partager sur Twitter
      17 avril 2006 à 5:04:46

      Hello...
      Bon alors, une chose à la fois...

      fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

      Citation : DjKill

      Je ne comprend pas pourquoi l'on rajoute 1 aux nombre de blocs en hauteur...


      En fait, on ajoute pas 1 au nombre de blocs en hauteur, mais au produit NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR.

      Bon, ceci dit, pourquoi ? o_O

      Ça vient de la façon dont fonctionne fgets: cette fonction est faite pour lire du texte jusqu'à ce qu'elle rencontre un caractère de fin comme '\n', qu'elle va transformer en '\0' (fin de ligne)... et on peut lui spécifier un nombre maximum de caractères à lire si elle ne rencontre pas de caractère de fin, auquel cas elle l'ajoutera elle-même.
      Exemple, svp....

      Donc là, si on demande à fgets de lire NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR=12*12=144 caractères, elle va remplacer le 144e par '\0' ce qui dans le cours va remplacer un mur par un vide (le cas '\0' n'est pas traité dans le switch, mais ici ce sera valide, "par hasard")

      Avec le +1, fgets va lire 145 caractères, le 145e sera '\0', mais on s'en fout royalement puisqu'on ne s'en occupe pas !


      Ok, next:
      switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])

      C'est juste un petit calcul pour passer d'un tableau "en ligne" à un tableau à deux dimensions.
      Euh... un autre exemple, svp....

      Bon, mettons que ligneFichier[n] ressemble à ça: (c'est pas le cours, c'est pour l'exemple)

      Tout en ligne
      k=0 k=1 k=2 k=3 k=4 k=5 k=6
      A B C D E F G

      On veut copier ça dans notre tableau carte à deux dimensions qui, pour l'exemple ici va avoir 3 cases dans le sens des i (comme si NB_BLOCS_LARGEUR=3):
      Tableau à deux dimensions
      i=0 i=1 i=2
      j=0 A B C
      j=1 D E F

      Donc là pour acceder à F avec deux boucles imbriquées j,i on voit qu'il faut aller chercher k=5 en faisant j*3+i, avec j=1 et i=2, on trouve 5


      Bon, last one:

      Citation : DjKill

      Sinon ici j'ai du mal à comprendre : [pos->x][pos->y-1] ....


      Le -> c'est parcequ'on a passé la position à une fonction via un pointeur de structure et qu'on veut modifier le "champ" y. C'est équivalent à (*pos).y si je me souviens bien.

      le -1 s'applique à la valeur contenue dans pos->y... donc en fait la syntaxe ci-dessus permet de voir ce qu'il y a dans le tableau carte, une case plus haut, et de vérifier si Mario peut monter ou pas.


      Voilà... j'espère ne pas t'avoir trop embrouillé sur ce coup là... :p
      • Partager sur Facebook
      • Partager sur Twitter
        18 avril 2006 à 1:04:30

        D'accord....merci beaucoup!!
        Ca va tu ne m'a pas trop embrouillé la tête...à part peut être pour le deuxième truc avec une ligne que tu met dans un tableau à 2 dimension...
        En gros je comprend que ce truc permet de lire une "longue" ligne de façon à la mettre sur plusieurs lignes dans un tableau...mais bon c'est encore flou ce que je dit là!!! :lol:
        merci qu'en même!

        @+
        • Partager sur Facebook
        • Partager sur Twitter

        Petites question sur le sokoban...

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown