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

Shell et commandes GNU Discussion :

[shell] Jeu du pendu


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 46
    Par défaut [shell] Jeu du pendu
    Bonsoir à tous,
    J'ai eu un TP en cours qui consiste à faire un jeu du pendu en shell.
    N'ayant jamais pratiquer ce langage avant ce tp, je sollicite votre aide pour une erreur que je rencontre avec mon script.

    Voici l'énoncé de ma première question :

    Écrivez une fonction « motAuHasard » qui affiche un mot tiré au hasard dans le fichier dico.dic, ce mot devra faire 6 caractères ou plus pour être utilisable (la variable système RANDOM permet de générer des nombres aléatoires. Par exemple $(($RANDOM%nombdredelignes)) calcule un nombre au hasard compris entre 0 et nombrelignes.
    Attention la variable RANDOM, donne une valeur entre 0 et 32767, le fichiers mots contenant plus de 32767 lignes, il faudra tirer 2 valeurs aux hasard et les multiplier pour obtenir une valeur assez grande et en calculer ensuite le modulo.
    Voici ce que j'ai fait
    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
     
    #!/bin/bash
     
    motAuHasard () {
    while [$nbcaract < 6]
    	do
    #calcule des deux aléatoire
    	rdm = $(($RANDOM%32767))
    	rdmm = $(($RANDOM%32767))
     
    #multiplication des deux aléatoire 	
            modulo = expr $rdm \* $rdmm
    	echo $modulo
    #calcul modulo 
    	nbligne= expr $modulo % 50
    	echo $nbligne
    #Cherche la ligne du mot
    	mot = sed -n "$nbligne" dico.dic
    	echo $mot
    #calcule du nombre de caractère
    nbcaract = ${#mot}
    echo $nbcaract
    done
    }
    Lorsque je l’exécute j’obtiens l'erreur suivante :
    line 6 : 6] : no such file or directory
    Merci

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 361
    Par défaut
    Bonjour,

    Peux-tu déplacer ton post dans la section correspondante (si sous linux, il y a un forum dédier (shell et commande gnu), si sous unix en général, il y a aussi un forum shell et commande posix.

    Sinon, en survolant un peu ton programme, quelques remarques:
    - Le shebang (#!/bin/bash) doit-être obligatoirement sur la 1ère ligne.
    - on voit à la fois une utilisation de expr et une utilisation de $((...)) qui est un peu la même chose...
    - la syntaxe sur la valorisation de tes variables n'est pas je pense ce que tu veux, qui je pense est le résultats des commandes que tu passes, donc les 2 syntaxes possibles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot = sed -n "$nbligne" dico.dic
    Doit s'écrire soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=$(sed -n "$nbligne" dico.dic)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=`sed -n "$nbligne" dico.dic`
    comme tu le remarquera, dans un premier temps, j'ai retiré les espaces autour du signe '=' car sinon, le shell considère ta variable comme une commande.
    puis j'ai soit englobé ta commande de $(...) ou de backquote (`) qui sont les deux syntaxe pour dire au shell courant que c'est une commande à éxécuter dans un sous-shell.
    Cas particulier, cette syntaxe est sous-entendu pour la forme $((...)) mais il ne faut toujours pas mettre d'espace autour du signe '=' pour signifie la valorisation d'une variable.
    -Concernant l'erreur que tu rencontres, c'est l'inverse du signe '=', il faut un espace apres '[' et avant ']', donc while [ ... ] .
    Après, je te conseilles d'aller dans la session tutoriel, pour compulser ceux concernant les shell...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 46
    Par défaut
    Merci pour cette réponse.
    Cela m'a bien aidé.

    Voici le code avec quelque changements notamment au niveau de la boucle while qui n' était pas bonne et du sed pour bien chercher à partir du numéro de ligne. Si je rencontre d'autre problème sur le jeu je viendrai poster ici.
    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
    #!/bin/bash
     
    motAuHasard () {
    nbcaract=0
    while [ $nbcaract -le 6 ]
    do
    #calcule des deux aléatoire
    	rdm=$(($RANDOM%32767))
    	rdmm=$(($RANDOM%32767))
     echo $rdm
     echo $rdmm
    #multiplication des deux aléatoire 	
        modulo=$(expr $rdm \* $rdmm)
    	echo $modulo
    #calcul modulo 
    	nbligne=$(expr $modulo % 28)
    	echo $nbligne
    #Cherche la ligne du mot
    	mot=$(sed -n "$nbligne"p dico.dic)
    	echo $mot
    #calcule du nombre de caractère
    nbcaract=${#mot}
    echo $nbcaract
    done
    }
    j'ai demandé à un modo de déplacer le sujet.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Soit un dictionnaire, fichier texte ne contenant qu'un mot par ligne, que nous appelerons 'dico.txt'.

    Si un pendu a besoin d'un dico ayant uniquement besoin des mots de 6 lettres ou plus, on peut utiliser l'expression régulière '......' ou '.\{6\}' dans un filtre.

    OU
    Donc, dans le programme, le mot serait tiré aléatoirement dans cet extrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot=$(grep '......' dico.txt | sed -n "$nbligne"p )
    Les tests de longueur deviennent alors inutiles

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    heu?
    ce mot devra faire 6 caractères ou plus
    cela suggère que le fichier contient davantage de mots.

    il faudrait donc connaître le nombre de mots >=6 lettres, que l'on divisera par deux (plus un pour une partie si le nombre de mots est impair); ces deux parties serviront à calculer les modulos sur RANDOM, qui seront enfin additionnés pour obtenir la ligne qui sera sélectionnée (et donc le mot).
    le modulos de Xteise est d'ailleurs inutile, puisqu'il "module" sur le nombre maximum que peut atteindre RANDOM.

    Ça me paraît plus efficace que de tirer un nombre au hasard, qui pourrait être supérieur au nombre de lignes du fichiers, et, encore plus, au nombre de mots >=6 lettres
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre expérimenté
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Par défaut
    Bonjour,

    Citation Envoyé par N_BaH Voir le message
    il faudrait donc connaître le nombre de mots >=6 lettres, que l'on divisera par deux (plus un pour une partie si le nombre de mots est impair); ces deux parties serviront à calculer les modulos sur RANDOM, qui seront enfin additionnés pour obtenir la ligne qui sera sélectionnée (et donc le mot).
    Je suis perplexe quant à ce raisonnement -- pas qu'il faille connaître (ou pouvoir obtenir facilement) le nombre de mots >=6 lettres, le reste bien sûr ;-) --.

    Citation Envoyé par N_BaH Voir le message
    le modulos de Xteise est d'ailleurs inutile, puisqu'il "module" sur le nombre maximum que peut atteindre RANDOM.
    Agreed. Et je comprends encore moins le modulo 50 transformé en modulo 28, par ex. ici nbligne=$(expr $modulo % 28).

    J'ai l'impression que pour le choix du mot, ce qu'il faut faire est clairement dit dans l'énoncé : multiplier 2 random d'entiers sur 16 bits pour simuler une distribution uniforme sur 32
    j'ai de sérieux doutes sur l'uniformité de la distribution, rien que pour la densité des pairs et impairs, mais bon...

    On a alors une distribution qui permet de couvrir des nombres largement au dessus de la centaine de milliers, qui doit correspondre à l'ordre de grandeur de la taille du dico (ou dico modifié par une commande similaire à celle proposées par Flodelarab (à adapter pour >=6, mais bon c'est pas grand chose)).

    Reste à prendre le modulo du random vs nombre entrées dico >=6 (qui induit aussi un biais dans l'uniformité de la distribution sur le nbre d'entrées, mais bon, être bien uniformément aléatoire dans un jeu de pendu n'est peut-être pas vital non plus.

    Edit: qui plus est, le requis est "au hasard", donc ça doit suffire puisque c'est l'énoncé qui suggère de faire comme ça).

    Ou alors suis-je à côté de la plaque ?

Discussions similaires

  1. [Shell] script pour jeu du pendu
    Par SISINE dans le forum Linux
    Réponses: 0
    Dernier message: 05/01/2008, 10h56
  2. Code en bourne shell du jeu Le "PENDU"
    Par piment dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 20/07/2007, 14h17
  3. Le jeu du pendu.
    Par giggs dans le forum C
    Réponses: 5
    Dernier message: 31/10/2006, 13h40
  4. jeu du pendu
    Par krachik dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2006, 12h48
  5. Réponses: 4
    Dernier message: 24/03/2006, 13h54

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