Bonjour, Je suis étudiant et je ne sais pas du tout comment résoudre cet exercice.
Attention : je ne dois pas réaliser le jeu snake, je dois juste dessiner un serpent de taille n.
Merci d'avance
-----
Bonjour, Je suis étudiant et je ne sais pas du tout comment résoudre cet exercice.
Attention : je ne dois pas réaliser le jeu snake, je dois juste dessiner un serpent de taille n.
Merci d'avance
Pour dessiner un serpent, rien ne vaut le langage Python ?
On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !
Déjà se faire un algorithme pour résoudre le problème (le langage vient après)
De façon brute (dans un 1er temps), 3 lignes => 3 chaines l1, l2, l3
au départ, l1="@", l2="", l3=""
lecture de n
si n=1, l2=l2+'0'
si n=2, l2=l2+'0'; l3=l3+'0'
si n=3, l2=l2+'0'; l3=l3+'0'; l3=l3+'0'
si n=4, l2=l2+'0'; l3=l3+'0'; l3=l3+'0'; l3=l3+'0'
si n=5, l2=l2+'0'; l3=l3+'0'; l3=l3+'0'; l3=l3+'0'; l2=l2+'0'
si n=6, l2=l2+'0'; l3=l3+'0'; l3=l3+'0'; l3=l3+'0'; l2=l2+'0'; l1=l1+'0'
si n=7, l2=l2+'0'; l3=l3+'0'; l3=l3+'0'; l3=l3+'0'; l2=l2+'0'; l1=l1+'0'; l1=l1+'0'
etc
ensuite, tu devrais voir une sorte de schéma qui se dessine, qui se répète régulièrement donc boucle(s) avec une certaine fréquence.
un truc bien pourri en C:
Cliquez pour afficherCode:#include <stdio.h> #include <stdlib.h> #include <string.h> int main( int argc, char ** argv) { int n; if ( (argc < 2) || (1 != sscanf(argv[1], "%d", &n))) { printf("donner n en param\n"); exit(1); } int ln = (n/2) + 4; char * lig[3]; lig[0] = malloc(3 * ln); if(lig[0] == NULL) { printf("pb malloc\n"); exit(1); } memset(lig[0], 0, 3 * ln); lig[1] = lig[0] + ln; lig[2] = lig[1] + ln; char * cur[3]; memcpy(cur, lig, sizeof(lig)); cur[0] += sprintf(cur[0], "@ "); int i, j = 0; for (i = 7; i < n; i+=8) { cur[0] += sprintf(cur[0], "000 "); j+=3; } for (i = 0; i < n; i+=4) { cur[1] += sprintf(cur[1], "0 "); j+=1; } for (i = 3; i < n; i+=8) { cur[2] += sprintf(cur[2], "000 "); j+=3; } n -= j; if (n) { j %= 8; j = (j < 4)? 2: 0; for (i = 0; i < n; i++) cur[j] += sprintf(cur[j], "0"); } for (i = 0; i < 3; i++) if(cur[i][-1] == ' ') cur[i][-1] = 0; printf("%s\n%s\n%s\n", lig[0], lig[1], lig[2]); free(lig[0]); return 0; }
(un truc marrant pour l'équipe du forum: si je prévisualise, tout disparaît de la fenêtre de saisie...)
Jusqu'ici tout va bien...
Bonjour,
je dois réaliser ce même "serpent", auriez vous gardé une trace de votre code si vous avez réussi ?
merci.
Essai de suivre le raisonnement que j'ai indiqué dans ma réponse précédente pour trouver une solution.
Jusqu'ici tout va bien...
Bonjour !
J'aurai personnellement répondu : "impossible de répondre à cette exercice"
Vous donnez n = 29 et précisez que le serpent devrait ressembler exactement au serpert ci-dessus alors que le serpent ci-dessus ne possède que 23 "zéro".
Incohérence dans les consignes de l'exercice => impossible à résoudre
C'était facile !
peut-être que la capture est tronquée sur le dessin du serpent aussi d'une certaine façonBonjour !
J'aurai personnellement répondu : "impossible de répondre à cette exercice"
Vous donnez n = 29 et précisez que le serpent devrait ressembler exactement au serpert ci-dessus alors que le serpent ci-dessus ne possède que 23 "zéro".
Incohérence dans les consignes de l'exercice => impossible à résoudre
C'était facile !
je dirais que l'algorithme dépend du type de "device" sur lequel on veut afficher le serpent. S'il est du type tty, c'est-à-dire que le programme affiche des lignes entières et ensuite ne peut pas modifier une ligne affichée, il faut précalculer le serpent, sinon on peut s'amuser à le dessiner pas à pas à partir de la tête.
Bonjour.
Du coup, quand on a compris ça... on peut y remédier.
Par exemple ici ce qu'on peut faire c'est de créer un tableau en mémoire qui affiche un serpent 3 de large et n de longueur.
On le préremplit (c'est facile, vu la régularité)
On le parcoure en partant de x=1 et y=1 en comptant le nombre de caractères, comme le suggère indirectement MissJenny, (là on peut, c'est pas un écran).
Et on en déduit X max pour chaque ligne.
Le xmax de chaque ligne étant la longueur qu'on va afficher ensuite en recopiant la portion correspondante du tableau.
Dernière modification par ArchoZaure ; 06/10/2023 à 11h18.
Bonjour Archozaure, regarde les tableaux (matrice) 2d et les boucles "imbriqués" pour comprendre ta proposition...
J'ai glissé Chef !
Il n'y a pas spécialement besoin de tableaux ou de boucles imbriquées.
On peut construire chaque ligne à la volée en calculant m = n modulo 8.
Pour la 1ère ligne, on affiche m fois " 000". Pour la seconde, m fois " 0", pour la 3ème m fois "000 "
Après, on raffine un peu pour gérer le fait qu'on commence la 1ère ligne par un "00" pas un "000" et pour le @.
Une autre solution est d'utiliser le fait que même en mode texte, on peut tracer où on veut sur l'écran depuis les années 70 en gros (setcursorpos en Windows, move en curses/ncurses pour Unix/Linux/MacOS).
Bonjour pm, j'essayais de faire réfléchir Archozaure sur sa proposition, qui était plus (conceptuellement) difficile à utiliser poir un néophyte que ce qu'il semblait penser...
J'ai glissé Chef !
Not only is it not right, it's not even wrong!
Oui, mais code tel que celui qui donne ça en réponse à l'exo se fera massacrer...
Jusqu'ici tout va bien...
Bonjour.
Je ne répondais pas à ton message en fait mais à ce qui a été dit depuis le #10.
Mais effectivement, tu as raison : remplir le tableau tel que décrit par Archozaure n'est pas aussi simple que ça pour un néophyte.
D'ailleurs, les 2 qui ont posé la question sur ce fil, le 1er en 2021 puis l'autre plus récemment ne sont pas revenus
Je ne suis pas d'accord puisque "je suis un néophyte" (je ne programme pas en c en général).
Mon code :
Rien de bien méchant vous en conviendrez.Code:#include <stdio.h> #include <stdbool.h> #define X_MAX 80 // Ajuster si nécessaire à la largeur réelle de l'écran en nombre de caractères #define Y_MAX 3 #define LGT_MAX X_MAX * Y_MAX / 2 int main () { // Index de boucle int i,j; int x,y; // Longueur serpent int n; // Utilisés pour le test de validité de la valeur entrée bool saisie; char sn; // Chaines char ch[Y_MAX][X_MAX]; int dx[8] = {0, 0, 1, 1, 0, 0, 1, 1}; int dy[8] = {1, 1, 0, 0,-1,-1, 0 ,0}; // Saisie longueur serpent n saisie = false; do { printf("Saisir longueur du Serpent ("); printf(" Valeurs autorisées 1 à %d" , LGT_MAX); printf(") : "); scanf("\n%s", &sn); if(sscanf(&sn,"%d", &n) == 1) { if ((n>0) && (n<=LGT_MAX)) saisie = true; } } while (saisie == false); // Initialiser les 3 chaines for (y = 0; y<Y_MAX; y++) { for (x = 0; x<X_MAX; x++) ch[y][x] = ' '; ch[y][X_MAX-1] = '\0'; } // Corps du Serpent de longueur n x = 0; y = 0; j = 0; for (i = 1 ; i <= n ; i++) { ch[y][x] = '0'; x = x + dx[j]; y = y + dy[j]; j++; if (j >= 8) j = 0; } // Tete du Serpent ch[0][0] = '@'; // Affichage des 3 chaines for (y=0 ; y<Y_MAX ; y++) printf("%s\n", &ch[y][0]); }
Après c'est peut-être pas du grand style mais ça a l'air de fonctionner.
J'avais pensé à cette "solution" mais elle ne m'a pas semblé aussi évidente que ça.Envoyé par pm42Il n'y a pas spécialement besoin de tableaux ou de boucles imbriquées.
On peut construire chaque ligne à la volée en calculant m = n modulo 8.
Pour la 1ère ligne, on affiche m fois " 000". Pour la seconde, m fois " 0", pour la 3ème m fois "000 "
Après, on raffine un peu pour gérer le fait qu'on commence la 1ère ligne par un "00" pas un "000" et pour le @.
Mais si vous pensez que c'est mieux, je veux bien voir le code.
J'ai essayé de le faire tourner, mais ça n'a pas fonctionné chez moi.Envoyé par polo974un truc bien pourri en C:
Déjà vous avez interverti un scanf avec un printf.
Pour info, si ça intéresse ceux qui comme moi n'ont pas installé le compilateur C, j'utilise le site https://www.onlinegdb.com/online_c_compiler
Dernière modification par ArchoZaure ; 07/10/2023 à 17h26.
À archo, non, je n'ai pas interverti de fonction.
Il faut juste passer le nombre en paramètre du programme.
Donc "déjà" apprenez à lire un code avant de lancer des affirmations fausses.
Jusqu'ici tout va bien...