Script bash avancé

billy -  
hugnix Messages postés 129 Date d'inscription   Statut Membre -
Bonjour, je dois faire un script en bash pour un tp. Il s'agit d'une émulation du jeu du pendu "hangman".
Le mot à trouver doit être remplacé par des "_", et chaque fois que la lettre donnée par le joueur ne correspond pas à la lettre du mot caché, alors il perd une vie...le joueur possède autant de vie que de lettre dans le mot.

voici mon début de script :

#!/bin/bash set -xv

#case one player :
function one_player () {

stored_word="java delphi testing analyst unix linux windows"
#word is randomly generated
word=$($RANDOM $stored_word)
echo "mot a trouver: $($word//"[a-z-A-Z-0-9]"/"_")" #pour remplacer le mot par des "_"

}

#case two player:
function two_players () {

echo "player one, enter your name:"
read play1

echo "player two, enter your name:"
read play2

#word is entered by the winner (nota=> the beginner is play1)

}

#menu: select one or two player
cat<<menu
*************MENU**************
********1) one player**********
********2) two players*********
********3) quit****************
enter your selection (1,2 or 3)
menu

read nbplayers

case $nbplayers in
"1") one_player # appel à la fonction one_player
;;
"2") two_players # appel à la fonction two_players
;;
"3") echo "GOOD BYE"
;;
*)
esac

merci pour votre aide et vos explications.
Configuration: Windows XP
Opera 9.23

40 réponses

  • 1
  • 2
Résumé de la discussion

Le fil porte sur la mise en œuvre d'un jeu du pendu en Bash, où le mot est masqué par des underscores et où les vies dépendent de sa longueur, avec modes simples ou doubles. Des échanges portent sur des corrections de syntaxe Bash (utilisation des case et des fonctions), l'affichage des lettres cachées et l'initialisation des vies selon la longueur du mot. Plusieurs participants proposent des variantes comme des tests de saisie anti-répétition, des mécanismes de pénalité et des améliorations d'efficacité via des fonctions, tout en discutant des problèmes liés au passage entre modes. Certaines contributions évoquent des versions allégées et des techniques comme l'utilisation de redirections et de substitutions pour simplifier le code et gagner en lisibilité globale.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Avant de te lancer dans la configuration multi-joueurs, peut être serait-il bien de commencer à élaborer ton script petit à petit en commençant par tester par exemple le tirage aléatoire d'un mot en t'aidant de ceci (l'utilisation d'un tableau est préférable dans ce cas) :
    # Tableau contenant la liste
    stored_word=(java delphi testing analyst unix linux windows)
    # Nombre d'éléments de la liste
    nbr=${#stored_word[*]}
    # Génération d'un nom au hasard
    word=${stored_word[$((RANDOM%nbr))]}
    Puis de trouver la commande qui affichera les lettres trouvées à la place des underscores, puis le compteur de vie, etc...

    ;-))
    0
  2. billy
     
    Bonjour, voilà je comence donc par faire le code pour un joueur.
    A ce niveau du script, les problèmes que je rencontre sont:
    - au niveau du compteur de vie
    -les caractères cachés sont bien affichés mais il y en a 1 en trop
    -comment intégrer un contrôle pour vérifier que la lettre saisie ne l'a pas déjà été
    -comment arranger mon code, en utilisant au maximum des fonctions (si vous pouvez me donner quelques conseils pour l'optimisation)

    #!/bin/bash set -xv
    clear
    ###################function hide_word#################
    function hide_word () {
    hidden_word=$(echo $solution|tr "[a-z-A-Z]" ".")
    }
    #####################case one player###################
    function one_player () {
    #array of words :
    Stored_words="delphi java testing analyst unix linux windows php pascal"
    word=($Stored_words)
    #number of word in array:
    nb_words=${#word[*]}
    #the word is randomly generated and it is hidden:
    solution=${word[$((RANDOM%nb_words))]}

    #hidden_word=$(echo $solution|tr "[a-z-A-Z]" ".")
    hide_word
    #number of life is equal of number of letter in word:
    nb_letters=$(echo $solution |wc -c|cut -f1)
    echo "you've got" $(($nb_letters-1)) "life :"
    # display the hidden word
    echo $hidden_word

    # insert each characters of solution in an array of char
    mot=($solution)
    for char in $mot
    do
    mot_find[$i]=$char
    done

    #don't forget to delete these lines
    echo "solution:"$mot_find

    #while loop => if not find a good letter, enter a letter
    nb_life=$(($nb_letters-1))
    i=1
    while [ $i -le $nb_life ]
    do
    echo -e "enter a letter:\n";read letter
    #if "$letter" in "$letters"
    #then
    #echo "choose another character:"
    #read letter
    #fi
    letters="$letters$letter"
    echo "used characters :"$letters
    # used_char[$i]="$letter" #this array to conserve used characters
    # echo $used_char
    #display good charaters in hidden_word
    # good=$(echo $mot_find|tr -c "$letter" ".")
    # echo ${mot_find[@]///}
    good=$mot_find
    good=$(echo $good|tr -c "$letters" ".")
    #echo $x $good
    echo $good
    let i=1+$i
    done
    echo "the right word is:$solution"
    }

    #######################################################
    ################menu: select one or two player#########
    cat<<menu
    *************MENU**************
    ********1) one player**********
    ********2) two players*********
    ********3) quit****************
    enter your selection (1,2 or 3)
    menu
    read nbplayers
    case $nbplayers in
    "1") one_player;;
    "2") two_players;;
    "3") echo "GOOD BYE";;
    esac

    merci encore.
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tiens je te file ce que j'avais pondu hier soir, ça ne concerne qu'un seul joueur, j'ai pas de fonctions par contre, mais dans l'ensemble c'est assez proche de ton cheminement il me semble.

    Bon ça ne gère pas directement les lettres déjà saisies, par contre ça influe sur le nombre de vies restante si elles sont fausses mais pas si elles sont bonnes ;-))

    Voilà le code :
    #! /bin/bash
    
    # Décommenter pour débugage
    #set -xv
    
    ### Initialisation des variables ###
    # Tableau contenant la liste
    stored_word=(java delphi testing analyst unix linux windows)
    # Nombre d'éléments de la liste
    nbr=${#stored_word[*]}
    # Génération d'un nom au hasard
    word=${stored_word[$((RANDOM%nbr))]}
    # Nombre de lettres du mot
    nbr_lettre=${#word}
    # Compteur
    count=0
    # Compteur de vie
    vie=${#word}
    
    
    ### Décor ###
    
    # On efface le terminal
    clear
    # On plante le décor
    echo
    echo -e "Nombre de vie : ${vie}"
    echo -e "Lettres employées : ${lettre_usitee}"
    # On affiche le mot à trouver sous la forme "______"
    echo -e "Mot à trouver ($nbr_lettre lettres) : ${word//[a-z-A-Z-0-9]/_}" 
    
    ### Début script ###
    
    # Boucle tant que toutes les lettres du mot n'ont pas été trouvées
    while [ "$count" -lt "$nbr_lettre" ]
    do
    echo -e "Entrer une lettre : \c"
    read lettre
    # Récupération des lettres déjà sélectionnées pour affichage ultérieur
    lettre_usitee=${lettre_usitee}${lettre}
    # On recherche la lettre sélectionnée
    grep -o "$lettre" <<< $word >/dev/null
    # On récupère le code retour
    retval=$?
    # Choix
    case $retval in
    0)        clear   # code retour vrai
      # On récupère la liste des lettres exactes
      mot="${mot}${lettre}"
      echo
      # Affichage nombre de vie
      echo -e "Nombre de vie : ${vie}"
      # Affichage lettres sélectionnées
      echo -e "Lettres employées : ${lettre_usitee}"
      # On affiche à nouveau le mot à trouver sous la forme "______"
      #+ mais en affichant les lettres trouvées à leur emplacement
      echo "Mot à trouver : ${word//[^$mot]/_}"
      # On incréménte le compteur
      count=$((count + 1))
      # On teste si toutes les lettres composant le mot mystère ont été trouvées
      if [ "${word//[^$mot]/_}" == "${word}" ]
      # Si c'est le cas on l'affiche
      then echo "Gagné"
      # Et on quitte la boucle
      break
      # Dans le cas contraire on redémarre une nouvelle boucle
      else continue
      fi
      ;;
    1)        clear   # code retour faux
      # On récupère quand même la liste des lettres exactes
      mot="${mot}${lettre}"
      # On affiche un message 
      echo "Mauvais choix"
      # On décrémente le compteur du nombre de vies
      vie=$((vie - 1))
      # On affiche l'état
      echo -e "Nombre de vie : ${vie}"
      # Affichage lettres sélectionnées
      echo -e "Lettres employées : ${lettre_usitee}"
      # On affiche à nouveau le mot à trouver sous la forme "______"
            #+ en affichant toujours les lettres trouvées à leur emplacement
      echo "Mot à trouver : ${word//[^$mot]/_}"
      # On teste s'il reste des vies
      if [ "$vie" = 0 ]
      # Si plus de vies on affiche un message
      then echo "Perdu"
      # La réponse
      echo "Le mot à trouver était ${word}"
      # et on quitte la boucle
      break
      # Dans le cas contraire on redémarre une nouvelle boucle
      else continue
      fi
      ;;
    esac
    done
    0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Voilà une version incluant "tput" afin de gérer l'adressage du curseur et les couleurs, donc à lancer sur un terminal ayant un fond sombre pour profiter de la coloration :
    #! /bin/bash
    
    #set -xv
    
    #### Initialisation des variables tput ####
    
    #+ Mode normal
    ResetColor="$(tput sgr0)"
    # "Surligné" (bold)
    bold=$(tput smso)
    # "Non-Surligné" (offbold)
    offbold=$(tput rmso)
    
    # Couleurs (gras)
    #+ Rouge
    Red="$(tput bold ; tput setaf 1)"
    #+ Vert
    Green="$(tput bold ; tput setaf 2)"
    #+ Jaune
    Yellow="$(tput bold ; tput setaf 3)"
    #+ Bleue
    Blue="$(tput bold ; tput setaf 4)"
    #+ Cyan
    BlueCyan="$(tput bold ; tput setaf 6)"
    
    #### Fin initialisation variables tput ####
    
    #### Initialisation des variables du script ####
    # Tableau contenant la liste
    stored_word=(java delphi testing analyst unix linux windows)
    # Nombre d'éléments de la liste
    nbr=${#stored_word[*]}
    # Génération d'un nom au hasard
    word=${stored_word[$((RANDOM%nbr))]}
    # Nombre de lettres du mot
    nbr_lettre=${#word}
    # Compteur
    count=0
    # Compteur de vie
    vie=${#word}
    
    #### Fin initialisation variables du script ####
    
    # Effacement du terminal
    clear
    
    # Adressage du curseur ligne 0 colonne 30
    tput cup 0 30
    #echo "${bold}${Yellow}Jeu du Pendu${ResetColor}${offbold}"
    echo "${Yellow}Jeu du Pendu${ResetColor}"
    
    # Adressage du curseur ligne 2 colonne 5
    tput cup 2 5
    echo -e "Mot à trouver (${nbr_lettre} lettres) : ${word//[a-z-A-Z-0-9]/_}"
    
    # Pré-affichage des champs
    tput cup 3 5
    echo -e "Nombre de vie : ${Red}${vie}${ResetColor}"
    tput cup 4 5
    echo -e "Lettres employées : ${BlueCyan}${lettre_usitee}${ResetColor}"
    
    
    while [ "$count" -lt "$nbr_lettre" ]
    do
    # Adressage du curseur ligne 6 colonne 5
    tput cup 5 5
    echo -e "Entrer une lettre : \c"
    read lettre
    lettre_usitee=${lettre_usitee}${lettre}
    grep -o "$lettre" <<< $word >/dev/null
    retval=$?
    case $retval in
    0)      # Effacement "Mauvais choix"
            tput cup 7 5
            echo -e "                    "
            mot="${mot}${lettre}"
            # Adressage du curseur ligne 2 colonne 5
            tput cup 2 5
            echo "Mot à trouver (${nbr_lettre} lettres) : ${word//[^$mot]/_}"
            tput cup 4 5
            echo -e "Lettres employées : ${BlueCyan}${lettre_usitee}${ResetColor}"
            count=$((count + 1))
            tput cup 5 25
            echo -e " "
            if [ "${word//[^$mot]/_}" == "${word}" ]
            then
            # Adressage du curseur ligne 8 colonne 30
            tput cup 8 30
            echo "${Green}Gagné${ResetColor}"
            break
            else continue
            fi
            ;;
    1)      tput cup 7 5
            echo "${Yellow}Mauvais choix${ResetColor}"
            vie=$((vie - 1))
            tput cup 3 5
            echo -e "Nombre de vie : ${Red}${vie}${ResetColor}"
            tput cup 4 5
            echo -e "Lettres employées : ${BlueCyan}${lettre_usitee}${ResetColor}"
            tput cup 5 25
            echo -e " "
            if [ "$vie" = 0 ]
            then
            # Adressage du curseur ligne 8 colonne 30
            tput cup 8 30
            echo "${Red}Perdu${ResetColor}"
            # Adressage du curseur ligne 9 colonne 30
            tput cup 9 20
            echo "Le mot à trouver était ${BlueCyan}${word}${ResetColor}"
            break
            else continue
            fi
            ;;
    esac
    done
    ;-))
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. billy
     
    pouvez-vous m'expliquer cette ligne : grep -o "$lettre" <<< $word >/dev/null
    Pourquoi "<<<" ?

    merci
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    On appelle ça une redirection. Tu dois connaitre la forme avec un fichier :
    cat < fichier
    Ben là c'est la forme "officielle" de faire une redirection directement depuis une variable (avec 3 chevrons). Il existe une autre forme pour faire une redirection directement depuis une commande :
    while read file
    do echo $file
    done < <(find /chemin/ -name "*.txt" -print)
    ;-))
    0
  8. billy
     
    non je ne savais pas que 3 < permet de faire une redirection à partir d'une variable..c'est très pratique!
    encore une question concernant cette ligne :
    dans case 0)
    echo "Hidden word (${nbr_lettre} letters) : ${word//[^$mot]/.}"
    Est-ce que avec ${word//[^$mot]/.} :
    paramètre :word
    motif :[^$mot]
    chaine :.
    donc on recherche et remplace dans parametres les lettres qui ne correspondent pas à $mot par un "." ???
    Pouvez-vous m'expliquer si ce n'est pas le cas? merci
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Rien d'autre à rajouter, si ce n'est de remplacer "paramètre" par "variable" et c'est tout bon ;-))
    [tmpfs]$ variable="bonjour"
    
    [tmpfs]$ mot="roj"
    
    [tmpfs]$ echo ${variable//[^$mot]/_}
    
    _o_jo_r
    
    [tmpfs]$
    ;-)
    0
  10. hugnix
     
    Voici une version 2 joueurs, le joueur1 doit doit insérer un mot à trouver pour le joueur2 .

    !!!!!!! ATENTION MESSAGE AU NOUVEAU/FUTUR CCMISTES !!!!!!!!!!!!!!

    Lors de l'utilisation de doubles crochets veuillez insérer un espace entre les "ouvrant" sinon, comme ce le fut pour ce script, les tests vont apparaitre en tant que liens!

    exemple: if [ [ $1 = 2 ]]

    merci.

    #!/bin/bash
    life=15
    checkletter="-"
    letterguessed=""
    life2=15
    checkletter2="-"
    letterguessed2=""
    function playagain()
    {
    echo "do you want to play again? (enter y or n)"
    read ans
    clear
    if [ [ $ans = y* || $ans = Y* ]]
    then
    sh hangman.final
    else
    echo GOOD BYE
    fi
    exit
    }
    function oneplayer ()
    {
    hazard=$(echo $((($RANDOM%15)+1)))
    word=$(cat words | head -$hazard | tail -1)
    if [ [ $life = 15 ]]
    then until [ [ $life = 0 ]]
    do
    echo "you have $life live left"
    echo "You tryed this letter(s) : $letterguessed"
    echo ${word//[^$checkletter]/_}
    echo "will you find the word $name1?"
    echo "try a letter :"
    read letter
    clear
    letterguessed=$letterguessed$letter,
    echo $word | grep $letter > /dev/null
    retval=$?
    case $retval in
    0) clear
    checkletter=$checkletter$letter
    echo GOOD LETTER
    if [[ ${word//[^$checkletter]/_} = $word ]]
    then clear
    echo "CONGRATULATION $name, YOU WIN"
    echo "THE HIDDEN WORD WAS: $word"
    break
    else continue
    fi
    ;;
    1) clear
    life=$(($life -1))
    checkletter=$checkletter$letter
    echo WRONG LETTER YOU HAVE LOST 1 life
    if [ [ $twoplayers_mode = 1 ]]
    then clear
    until $life2 = 0
    do
    echo "you have $life2 live left"
    echo "You tryed this letter(s) : $letterguessed2"
    echo ${word2//[^$checkletter2]/_}
    echo "will you find the word $name2?"
    echo "try a letter :"
    read letter2
    clear
    letterguessed2=$letterguessed2$letter2,
    echo $word2 | grep $letter2 > /dev/null
    retval=$?
    case $retval in
    0) clear
    checkletter2=$checkletter2$letter2
    echo GOOD LETTER
    if [[ ${word2//[^$checkletter2]/_} = $word2 ]]
    then clear
    echo CONGRATULATION $name2, YOU WIN
    echo "THE HIDDEN WORD WAS: $word2"
    playagain
    break
    else continue
    fi
    ;;
    1) clear
    life2=$(($life2 -1))
    checkletter2=$checkletter2$letter2
    echo WRONG LETTER YOU HAVE LOST 1 life
    break
    if [ [ $life2 = 0 ]]
    then clear
    echo YOU ARE A LOOSER $name2
    echo "the hidden word was: $word2"
    playagain
    break
    else continue
    fi
    ;;
    esac
    done
    fi
    if [ [ $life = 0 ]]
    then clear
    echo YOU ARE A LOOSER $name
    echo "the hidden word was:" $word
    break
    else continue
    fi
    ;;
    esac
    done
    fi
    playagain
    }
    cat<<menu
    ######**HANGMAN///////Jeu du Pendu**######
    1) 1player
    2) 2players
    3) exit
    Please enter your selection (1 to 3)
    menu
    read input
    clear
    case $input in
    1) echo "Hello $USER, please enter a name:"
    read name
    echo "welcome $name, press ENTER for play against computer"
    read ans
    if [ [ $ans = * ]]
    then oneplayer
    fi
    ;;
    2)echo "Hello $USER, please enter a name:"
    read name1
    echo "$name1 choose a word for player 2"
    read word2
    clear
    echo "player2 please enter your name:"
    read name2
    clear
    twoplayers_mode=1
    oneplayer
    ;;
    3) exit
    ;;
    *) echo "WRONG SELECTION PLEASE ENTER A NUMBER FROM 1 TO 3"
    sh hangman.final
    esac 


    Ça ira comme ça Jipicy?

    Sinon d'un point de vue"professionnel" tu en penses quoi? ça fait pas longtemps que je me suis mis a la programmation ( 6 mois ) et je ne jamais fait d'informatique auparavant, a part installer des jeux........... donc je me demandais si j'étais sur la bonne voix!!? :)
    J'ai commencé avec un peu de html pis unix et sql+ là j'attends le prochain test pour espérer passer la certif javasun a brighton!

    Encore merci.
    0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ça ira comme ça Jipicy?
    Yes, à part que l'avertissement c'était plutôt dans l'autre sens, c'est à dire :
    Pour une utilisation optimale de de ce script, veuillez bien faire attention à supprimer l'espace rajouté entre les crochets ouvrants des expressions de test... (espace rajouté pour faire face à la mise en page des balises internes au forum)

    Mais bon c'est pas grave, si ça marche pas, ils viendront nous en faire part sur le forum ;-))

    Sinon d'un point de vue"professionnel" tu en penses quoi ?
    Professionnel c'est un bien grand mot, juste passionné tout au plus ;-)))

    Bon honnêtement j'y ai jeté juste un œil comme ça dans les grandes lignes et j'ai pas eu le temps de le tester, mais bon je te fais confiance si tu dis que ça à l'air correct (à part quelques petites imperfections que tu dis...).

    Sinon si c'est vrai que ça ne fait que 6 mois que tu t'es mis à l'informatique et à la programmation, ben ça m'a l'air plutôt bien parti dis donc, chapeau. Et je suppose que tu es tout jeune en plus de ça (ce qui n'es plus mon cas ;-(( ).

    Continue comme ça , bon courage et bonne chance pour la suite ;-))

    PS. Billy avait promis de venir coller le résultat de son travail une fois fini, mais il n'a pas tenu ses promesses.
    0
  12. hugnix
     
    Ah désolé pour l'avertissement, j'essayerai de m'appliquer un peu plus la prochaine fois! ;)

    "Professionnel c'est un bien grand mot"
    C'est pour ça que j'ai mis professionnel entre "", expert ou spécialiste aurait été plus approprié....... :)

    Bon sur ma machine ça marche en tout cas, les petites imperfections c'est juste au cas on insére la même lettre deux fois, j'aimerais y rajouter un test qui permet de prévenir le joueur que la lettre a déjà été essayé, sinon ya un message d'erreur de grep, et pis juste préciser au joueur qu'on son tour est passé et que l'autre joueur peux commencer! ( c'est juste un ou deux echo a rajouter mais j'avais plus le courage... )

    En recomptant les mois ça fait un peu plus.... j'ai fait, en fevrier, une formation forem( anpe belge ) en html et j'ai enchainé direct avec la formation unix, une belle occasion, formation unix, sql+ gratuite ensuite séminaire, si positive on par a brighton suivre soit des cours java ou du testing ou de la finance ou du .net et ensuite pour rembourser tout ça en bosse pour l'entreprise pendant 2 ans, avec un bon p'tit salaire!
    J'ai vraiment galéré au début vu que pas de bases du tout, à part le html qui fut facile, et ça fait depuis septembre que je m'y suis vraiment mis du coup bin, j'ai progressé un peu :)

    Suis jeune oui mais je commence a vieillir ;) j'ai 24 ans, je ne te demande pas ton age.......................... :)

    Si je revois billy je lui dirait de le poster ici, si il a encore une copie de son script, mais a mon avis il doit être assez proche du tiens...

    Merci et bonne continuation a toi aussi :)

    A+
    0
  13. hugnix
     
    J'ai juste oublié un truc, j'y ai repenser cet après midi en me levant :) , j'utilise le fichier words dans lequel je recherche un mot au hasard.

    hazard=$(echo $((($RANDOM%15)+1)))
    word=$(cat words | head -$hazard | tail -1)

    N'oubliez pas de le recréer pour un bon fonctionnement de ce script!

    Désolé pour l'oubli!
    0
  14. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Merci de l'info ;-))

    Bon sur ma machine ça marche en tout cas, les petites imperfections c'est juste au cas on insére la même lettre deux fois, j'aimerais y rajouter un test qui permet de prévenir le joueur que la lettre a déjà été essayé,
    Rajoute ça dans ta fonction "oneplayer" (adapte pour la fonction "<ital>twoplayer"</ital>) après le 1er "clear" :
    grep -o "$letter" <<< "$letterguessed" >/dev/null
    retour=$?
    if [ "$retour" -eq 0 ]
    then
    echo "LETTER ALREADY CHOOSEN"
    continue
    fi


    sinon ya un message d'erreur de grep,
    A quel niveau ? (numéro de ligne)

    ;-))
    0
  15. hugnix Messages postés 129 Date d'inscription   Statut Membre
     
    Bien le merci a toi, j'imaginais un truc dans se style mais j'aurais continué avec 0) echo letter already choosen etc... donc, encore merci.
    Aussi je me demandais si il était utile de rajouter des test au cas où deux lettres ou plusieurs était selectioné, ça serait bien de prévenir le joueur qu'il doit rentré une seule lettre a la fois mais quand même permettre au joueur de rentré le bon en une fois mais si il loupe il est pendu, je vais me casser un peu la tête la dessus j'ai des idées dans la tête mais faut que j'me motive a lancer mon putty et à faire tout ça..... on verras demain :)

    pour le message d'erreur du grep, il apparait si on on valide la lettre alors que aucune valeur n'est rentré donc a ""read letter"" ligne 33, il suffit de rentré une lettre après et c'est bon mais y'a le message qui fait pas beau!

    Ça existe pas ça un test genre if $machin = vide then..... ? Me fais-je comprendre au moins? :)

    Bon je vais allez rajouter ces quelques lignes dans mon script.

    A bientôt, surement....

    Edit: ça marche nikel ( le contraire m'aurait étonné mais bon on ne sait jamais :) ). encore merci.
    0
  16. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Rajoute ça dans ton script :
    then until [ [ $life = 0 ]]
    do
    unset letter
    echo "you have $life live left"
    echo "You tryed this letter(s) : $letterguessed"
    echo ${word//[^$checkletter]/_}
    echo "will you find the word $name1?"
    echo "try a letter :"
    read letter
    clear
    if [ "$letter" = "" ]
    then
    echo "YOU HAVE TO CHOOSE A LETTER"
    continue
    fi
    grep -o "$letter" <<< "$letterguessed" >/dev/null
    retour=$?
    idem pour le "twoplayers" en adaptant... n'oublie pas les quotes surtout...

    ;-))
    0
  17. hugnix Messages postés 129 Date d'inscription   Statut Membre
     
    Merci, me sens un peu bête de ne pas y avoir pensé, surtout que j'utilise les "" dans ma déclaration de variables..... :)

    Par contre pourquoi unset letter ? Je viens de faire un test sans et ça fonctionne bien comme ça.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Pour le plaisir ;-))

      Non, effectivement ça ne sert à rien, le fait de valider sans entrer de lettre initialise la variable à rien. Dans mon raisonnement de ce matin je pensais quelle pouvait contenir le résultat précédent ;-[

      Merci de me l'avoir signaler ;-))
      0
  18. hugnix Messages postés 129 Date d'inscription   Statut Membre
     
    Pas d'prob ;)

    J'ai eu un doute aussi, c'est pour ça que j'ai fait le test, ça me paraissais logique mais vu que l'on compare une nouvelle lettre à chaque fois son utilité me semblât donc inutile. ( oh tiens une utilité inutile... :) )

    J'ai corrigé mes imperfections et rajouté les lignes de test que tu m'as pondu, il me reste plus que à faire 2 ou 3 dernier test et je pense qu'il sera bien boulonné de partout.

    Bonne soirée.
    0
  19. hugnix Messages postés 129 Date d'inscription   Statut Membre
     
    Et voilà j'ai reussi mon dernier ""petit"" test, donc le joueur peux rentrer une seule lettre a la fois mais il peux tout de même essayer de trouver le mot en le tapant en entier, mais si il se trompe il a perdu!
    Je n'ai pas encore essayé avec le deuxiéme joueurs mais techniquement ça devrait être ok!!!! edit: ça fonctionne, voir plus bas!
    A placer juste aprés "read letter".

    Nletter=$(echo -n $letter | wc -c)
    maxletter=$(echo -n $word | wc -c)
        clear
         if [ [ $letter = "" ]]
          then echo "PLEASE $name1, INSERT A LETTER BEFORE PRESS ENTER. PAY ATTENTION"
               continue
         elif [ [ $Nletter -gt 1 && $Nletter -lt $maxletter ]]
          then echo "PLEASE $name1, INSERT ONLY ONE LETTER"
               continue
         elif [ [ $Nletter = $maxletter && $letter = $word ]]
          then echo "CONGRATULATION $name1." && if [ [  $twoplayers_mode = 1 ]]
                                                then echo "$name2 HAVE BEEN HANGED"
                                                fi
               echo "the hidden word was: $word" && if [ [  $twoplayers_mode = 1 ]]
                                                    then echo "$name2's WORD WAS: $word2"
                                                    fi
               playagain
         elif [ [ $Nletter = $maxletter && $letter != $word ]]
          then echo "YOU'VE BEEN HANGED $name1?" && if [ [  $twoplayers_mode = 1 ]] 
                                                    then echo "$name2 IS RUNNING AWAY"
                                                    fi
               echo "the hidden word was: $word" && if [ [  $twoplayers_mode = 1 ]]
                                                    then echo "$name2's WORD WAS: $word2"
                                                    fi
               playagain
         fi
    


    Bon bin j'ai passé plus de temps a éditer ce post pour le rendre lisible( c'etait un peu le bronx quand j'ai fait le premier "visualiser" ) que à taper les lignes de codes pour réussir ce script......................
    0
  20. hugnix Messages postés 129 Date d'inscription   Statut Membre
     
    Je ne suis pas arrivé a éditer le post précédent pour rajouter ceci.
    C'est le test supplémentaires mais pour le deuxiéme joueur:

    A placer juste après ""read letter2""

      Nletter2=$(echo -n $letter2 | wc -c)
      maxletter2=$(echo -n $word2 | wc -c)
      clear
           if [ [ $letter2 = "" ]]
            then echo "PLEASE, $name2, INSERT A LETTER BEFORE PRESS ENTER. PAY ATTENTION"
                    continue
           elif [ [ $Nletter2 -gt 1 && $Nletter2 -lt $maxletter2 ]]
            then echo "PLEASE $name2, INSERT ONLY ONE LETTER"
                 continue
           elif [ [ $Nletter2 = $maxletter2 && $letter2 = $word2 ]]
            then echo "CONGRATULATION $name2, YOU'VE FOUND THE HIDDEN WORD"
                    echo "$name1 HAVE BEEN HANGED"
                    echo "YOUR HIDDEN WORD WAS: $word2"
                    echo "THE $name1's HIDDEN WORD WAS: $word"
                   playagain
           elif [ [ $Nletter2 = $maxletter2 && $letter2 != $word2 ]]
            then echo "YOU'VE BEEN HANGED $name2"
                    echo "$name1 IS RUNNING AWAY"
                    echo "YOUR HIDDEN WORD WAS: $word2"
                    echo "THE $name1's HIDDEN WORD WAS: $word"
                    playagain
            fi
    


    Bon bin je pense que ce script/jeux doit être assez complet comme ça, si je trouve des trucs a rajouter, je vous en ferez part!!!
    Peut être que un peu de couleurs pourrais améliorer la visibilité.
    0
  21. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Mais c'est qu'il est doué ce d'jeuns ;-)))

    Merci en tout cas ;-))
    0
  • 1
  • 2