Script bash avancé

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

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.

Bobot (l’IA à votre service)
  1. Voilà la version "light", j'ai pas mal galéré avec la partie du deuxième joueur mais finalement je l'ai eu a l'usure.....
    L'utilisation de function ma fait gagné 90 lignes!!!!

    #!/bin/bash
    clear
    function playagain ()
    {
    echo "do you want to play again? (enter y or n)"
    read ans
    clear
    if [ [ $ans = y* || $ans = Y* ]];then sh esai;else echo GOOD BYE
    fi
    exit
    }
    function lastchecking ()
    {
    echo $3 | grep $letter > /dev/null
    retval=$?
    case $retval in
    0) clear
    echo GOOD LETTER
    if [ [ ${3//[^$1]/_} = $3 ]];then clear;echo "CONGRATULATION $2, YOU WIN!"
    echo "THE HIDDEN WORD WAS: $2"
    playagain
    else continue
    fi
    ;;
    1) clear
    life=$(($4 -1))
    echo "WRONG LETTER $2 YOU HAVE LOST 1 LIFE!"
    if [ [ $life = 0 ]]
    then clear;echo "YOU ARE A LOOSER $3, YOU'VE BEEN HANGED"
    echo "the hidden word was: $1"
    playagain
    fi
    esac
    }
    function firstchecking ()
    {
    clear
    Nletter=$(echo -n $letter | wc -c)
    maxletter=$(echo -n $2 | wc -c)
    if [ [ $letter = "" ]]
    then echo "PLEASE $1, INSERT A LETTER BEFORE PRESS ENTER. PAY ATTENTION";continue
    elif [ [ $Nletter -gt 1 && $Nletter -lt $maxletter ]]
    then echo "PLEASE $1, INSERT ONLY ONE LETTER";continue
    elif [ [ $Nletter = $maxletter && $letter = $2 ]]
    then echo "CONGRATULATION $1, YOU'VE FOUND THE HIDDEN WORD"
    echo "the hidden word was: $2";playagain
    elif [ [ $Nletter = $maxletter && $letter != $2 ]]
    then echo "YOU'VE BEEN HANGED $1, WHY NOT WAIT UNTIL YOU FIND MORE LETTERS?"
    echo "the hidden word was: $2"
    playagain
    elif [ [ $Nletter -gt $maxletter ]]
    then error=$(($error +1))
    echo "YOU HAVE ENTERED TOO MUCH CHARACTERS $1, NEXT TIME YOU ARE DEAD!!!"
    if [ [ $error = 2 ]];then echo "YOU'VE BEEN HANGED $1, YOU HAVE BEEN WARN"
    playagain;fi
    continue
    fi
    echo $3 | grep $letter > /dev/null
    return=$?
    if [ [ $return -eq 0 ]];then echo "LETTER ALREADY CHOOSEN $1, AS I'M NICE I DON'T TAKE YOU A LIFE" ;continue
    fi
    }
    function wordchecking ()
    {
    echo "you have $1 lives left"
    echo "You tryed this letter(s) $3"
    echo ${4//[^$2]/-}
    echo "will you find the word $5?"
    echo "try a letter :"
    read letter
    }
    function  difficulty ()
    {
    checkletter1="-"
    letterguessed1="-->>"
    checkletter2="-"
    letterguessed2="-->>"
    echo hello please select a difficulty
    echo insert 1 for easy mode
    echo insert 2 for normal mode
    echo insert 3 for hard mode
    echo insert 4 for kamikaze mode
    read dif
    case $dif in
    1) life1=26; life2=26 ;;
    2) life1=15; life2=15 ;;
    3) life1=7; life2=7 ;;
    4) life1=1; life2=1
    esac
    clear
    }
    cat<<choix
    1) Play against computer
    2) Play against another player
    3) EXIT
    Please enter your selection (1 to 3)
    choix
    read input
    clear
    case $input in
    1) error=0
    echo "Hello $USER what's your nickname?"
    read name1
    echo "WELCOME $name1, UNIX WILL BE YOUR JUDGE, YOU HAVE THE RIGHT TO CHOOSE A DIFFUCLTY, press enter"
    read ans
    clear
    if [ [ $ans = * ]]
    then difficulty
    hazard=$(echo $((($RANDOM%15)+1)));word1=$(cat words | head -$hazard | tail -1)
    while [ [ $life != 0 ]]
    do wordchecking $life1 $checkletter1 $letterguessed1 $word1 $name1
    firstchecking $name1 $word1 $letterguessed1
    checkletter1=$checkletter1$letter
    letterguessed1=$letterguessed1$letter,
    lastchecking $checkletter1 $name1 $word1 $life1
    life1=$life
    continue
    done
    fi ;;
    2) twoplayersmode=0
    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
    difficulty
    hazard=$(echo $((($RANDOM%15)+1)));word1=$(cat words | head -$hazard | tail -1)
    while [ [ $twoplayersmode = 0 ]]
    do wordchecking $life1 $checkletter1 $letterguessed1 $word1 $name1
    firstchecking $name1 $word1 $letterguessed1
    letterguessed1=$letterguessed1$letter,
    checkletter1=$checkletter1$letter
    lastchecking $checkletter1 $name1 $word1 $life1
    life1=$life
    while [ [ $twoplayersmode = 0 ]]
    do wordchecking $life2 $checkletter2 $letterguessed2 $word2 $name2
    firstchecking $name2 $word2 $letterguessed2
    letterguessed2=$letterguessed2$letter,
    checkletter2=$checkletter2$letter
    lastchecking $checkletter2 $name2 $word2 $life2
    life2=$life
    break
    done
    done;;
    3) exit ;;
    esac


    Le combat fut dur mais j'en suis sortit vainqueur :))))))
    1. Modérateur
      Ben pour le case, peut être qu'en payant avec 1$ en plus ça marcherait mieux, non :
      read difficulty_mode
      case $difficulty_mode in
      1) life=26; life2=26 ;;
      2) life=15; life2=15 ;;
      3) life=7; life2=7 ;;
      4) life=1: lfe2=1
      esac
      ;-))
      1. ok merci........ encore une erreur de syntaxe, il serait que j'ouvre les yeux un peu plus grand, je l'ai relu au moins 20 foi mais c'est pas grave :))))
        la partie deuxième joeuur me broute un peu, elle sera surement fini demain ou au pire après demain, je la posterais ici.

        encore merci :)))
    2. BESOIN D'AIDE!!!!!!

      Bon là je décroche... donc je suis entrain de réécrire le script mais en le divisant en plusieurs fonctions, jusque là pas trop de soucis mais j'ai un problème, lorsque le script passe de la fonction "difficulty" a "wordchecking" la variable "$life" n'est pas prise en compte et lorsque j'en fait l'echo rien ne s'affiche, juste le bla bla mais sans la valeur de la variable alors que la variable $checkletter elle est prise en compte, pourquoi?

      #!/bin/bash
      function wordchecking ()
      {
      if [ [ $life = $life2 ]]
      then echo "You have $life lives left"
              echo $checkletter
      fi
      }
      function  difficulty ()
      {
      checkletter="-"
      letterguessed=""
      checkletter2="-"
      letterguessed2=""
      echo hello please select a difficulty
      echo insert 1 for easy mode
      echo insert 2 for normal mode
      echo insert 3 for hard mode
      echo insert 4 for kamikaze mode
      read difficulty_mode
      case difficulty_mode in
      1) life=26; life2=26 ;;
      2) life=15; life2=15 ;;
      3) life=7; life2=7 ;;
      4) life=1: lfe2=1
      esac
      clear
      wordchecking
      }
      cat<<choix
      1) Play against computer
      2) Play against another player
      3) EXIT
      Please enter your selection (1 to 3)
      choix
      read input
      clear
      case $input in
      1) echo "Hello $USER what's your nickname?"
         read name1
         echo "WELCOME $name1, UNIX WILL BE YOUR JUDGE, YOU HAVE THE RIGHT TO CHOOSE A DIFFUCLTY, press enter"
         read ans
         clear
         if [ [ $ans = * ]]
         then difficulty
         fi ;;
      2) echo in progress, come back soon ;;
      3) exit ;;
      esac
      
      
      1. Bon bin je vais m'auto-répondre, apparemment il n'aime pas trop les "case" dans les fonctions du coup j'ai essayé avec des if et ça à marché!

        function  difficulty ()
        {
        checkletter="-"
        letterguessed=""
        checkletter2="-"
        letterguessed2=""
        echo hello please select a difficulty
        echo insert 1 for easy mode
        echo insert 2 for normal mode
        echo insert 3 for hard mode
        echo insert 4 for kamikaze mode
        read difmode
        if [ [ $difmode = 1 ]]; then life=26 ; life2=26 ;
        elif [ [ $difmode = 2 ]]; then life=15 ; life2=15 ;
        elif [ [ $difmode = 3 ]]; then life=7 ; life2=7 ;
        elif [ [ $difmode = 4 ]]; then life=1 ; life2=1 ;
        fi
        clear
        }


        il ne me reste plus que à faire la partie du deuxième joueur et le script gagneras dans les alentours de 80 lignes...... si je compte bien :)))
    3. Salut,

      alors voilà l'énoncé, je le met en anglais, pas fort envie de me taper la traduc :)))))))))))))))

      Summary

      The object this exercice is for you to write a script that emulates the classic game hangman. The object of this game is for a user to try and guess a word which has been generated by the program or entered by someelse. The user will generally have a certain amount of lives and is then requested to try and guessed a letter in the word. On successful guesses the letter is shown within the word in its relevant position. An unsuccessful guess leads to a loss of a life. A record of guessed letters must be kept.

      Specification

      1) The program must allow for one or thw player game. If a one player game is selected, the word is randomly generated from a list of stored words. If a two player game is selected, one player should be prompted to enter a word.

      2) The guessed letters must be visible to the player.

      3) the current lives must be visible

      4) the number of guesses must be visible.

      5) when the number of lives has run out or the word is guessed a message should be displayed to the user stating how they have done
      EXAMPLE

      Sorry the word was " THE-SECRET-WORD3

      OR

      well donne the word was "THE_SECRET_WORD" you guessed it in 15 attempts with the loss of 2 lives.

      Et voilà :)))

      Comme je t'ai dit dans le mp, il m'a demandé de le diviser en plusieurs function plus petites, je pensais y arriver hier mais j'ai mon menu qui c'est mis a merder, il ne s'affiche même pas et il me dit qu'il y a une erreur la derniere ligne+1, c'est à dire par exemple que mon script fait 20 lignes il me met l'erreur à la ligne 21 et me dit unexpected end of files! si les experts peuvent m'aider..... merci d'avance.
      Du coup je suis entrain de le réécrire entièrement, à noter que l'utilisation des function va me faire gagner pas mal de lignes et me donner la possibilité d'ajouter plusieurs joueur sans trop de soucis.

      N'hésite pas a me contacter si il y a des trucs que tu comprends pas dans le script!
      1. Trouvé l'erreur du menu, j'avais oublié de fermer une fonction avec un } , du coup il aimait trop........
    4. Salut tout le monde!

      je refais surface ....

      Hug, peux-tu envoyer le texte de pendu, comme problème, pour que je juge ce qui était demandé !

      Merci d'avance

      M
      1. Ok bin voilà la bête dans sa version final! 234 lignes, si quelqu'un peux me le faire plus court avec des explications, fait moi signe!

        #!/bin/bash
        clear
        function playagain()
        {
        echo "DO YOU WANT TO PLAY AGAIN ( insert y or n )"
        echo "IF YOU WANT TO GO BACK TO THE MENU PLEASE INSERT 'menu'"
        read ans
        clear
         if [ [ $ans = 'menu' || $ans = menu ]]
          then sh hangman
         elif [ [ $ans = y* || $ans = Y* ]]
          then difficulty_mode
          else echo GOOD BYE
         fi
        exit
        }
        function oneplayer()
        {
        hazard=$(echo $((($RANDOM%15)+1)))
        word=$(cat words | head -$hazard | tail -1)
        if [ [ $life = $life2 ]]
         then until [ [ $life = 0 ]]
          do
            echo "YOU HAVE $life LIVES LEFT"
            echo "YOU TRYED THESE LETTER(s) : $letterguessed"
            echo ${word//[^$checkletter]/-}
            echo "WILL YOU FIND THE WORD $name1?"
            echo "TRY A LETTER :"
            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 : $word2"
                                                       fi
                   playagain
             elif [ [ $Nletter = $maxletter || $Nletter -gt $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
            echo $letterguessed | grep $letter > /dev/null
            return=$?
             if [ [ $return -eq 0 ]]
              then echo "LETTER ALREADY CHOOSEN $name1, AS I'M NICE I DON'T TAKE YOU A LIFE"
              continue
             fi
            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 "$name1, YOU WIN!" && 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
                        break
                     else continue
                    fi
                  ;;
               1) clear
                  life=$(($life -1))
                  checkletter=$checkletter$letter
                  echo "WRONG LETTER $name1 YOU HAVE LOST 1 LIFE!"
                     if [ [  $twoplayers_mode = 1 ]]
                      then until [ [ $life2 = 0 ]]
                             do
                          echo "$name2 THIS IS YOUR TURN"
                          echo "YOU HAVE $life2 LIVES LEFT"
                          echo "YOU TRYED THESE LETTER(S) : $letterguessed2"
                          echo ${word2//[^$checkletter2]/-}
                          echo "WILL YOU FIND THE HIDDEN WORD $name2?"
                          echo "TRY A LETTER :"
                          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 || $Nletter2 -gt $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
                          echo $letterguessed2 | grep $letter2 > /dev/null
                          return=$?
                           if [ [ $return -eq 0 ]]
                             then echo "LETTER ALREADY CHOOSEN $name2, AS I'M NICE I DON'T TAKE YOU A LIFE"
                             continue
                           fi
                          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! $name1 HAVE BEEN HANGED"
                                     echo "THE HIDDEN WORD WAS: $word2"
                                     echo "THE $name1's HIDDEN WORD WAS: $word"
                                     playagain
                                     break
                                  else continue
                                 fi
                               ;;
                            1) clear
                               life2=$(($life2 -1))
                               checkletter2=$checkletter2$letter2
                               echo "WRONG LETTER YOU HAVE LOST 1 life! $name1 THIS IS YOUR TURN"
                               break
                                 if [ [ $life2 = 0 ]]
                                  then clear
                                     echo "YOU ARE A LOOSER $name2, YOU'VE BEEN HANGED AND $name1 IS RUNNING AWAY"
                                     echo "THE HIDDEN WORD WAS: $word2"
                                     echo "THE $name1's HIDDEN WORD WAS: $word"
                                     playagain
                                     break
                                  else continue
                                 fi
                               ;;
                           esac
                          done
                        fi
                  if [ [ $life = 0 ]]
                   then clear
                      echo "YOU ARE A LOOSER $name1, YOU'VE BEEN HANGED" && if [ [  $twoplayers_mode = 1 ]]
                                                                                                                             then echo "AND $name2 IS RUNNING AWAY"
                                                                                                                            fi
                      echo "THE HIDDEN WORD WAS: $word" && if [ [  $twoplayers_mode = 1 ]]
                                                                                              then echo "THE $name2's HIDDEN WORD WAS: $word2"
                                                                                             fi
                      break
                   else continue
                  fi
                  ;;
            esac
          done
        fi
        playagain
        }
        function difficulty_mode()
        {
        checkletter="-"
        letterguessed=""
        checkletter2="-"
        letterguessed2=""
        if [ [  $twoplayers_mode = 1 ]]
         then echo "PLEASE $name1, CHOOSE A WORD FOR PLAYER2'S GAME"
              read word2
        fi
        echo "PLEASE SELECT A DIFFICULTY BEFORE PLAYING, IT COULD SAVE YOUR LIVE or not... :)"
        echo INSERT 1 FOR EASY MODE
        echo INSERT 2 FOR NORMAL MODE
        echo INSERT 3 FOR HARD MODE
        echo INSERT 4 FOR KAMIKAZE MODE
        read dif
        case $dif in
        1) life=26; life2=26
         ;;
        2) life=15; life2=15
         ;;
        3) life=7; life2=7
         ;;
        4) life=1
        esac
        clear
        oneplayer
        }
        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 YOUR NICKNAME:"
           read name1
           echo "WELCOME $name1, UNIX WILL BE YOUR JUDGE, YOU HAVE THE RIGHT TO CHOOSE A DIFFUCLTY, press enter"
           read ans
           clear
           if [ [ $ans = * ]]
           then difficulty_mode
           fi
         ;;
        2) echo "HELLO $USER, PLEASE ENTER YOUR NICKNAME:"
           read name1
           clear
           echo "HELLO PLAYER2, PLEASE ENTER YOUR NICKNAME:"
           read name2
           clear
           twoplayers_mode=1
           difficulty_mode
         ;;
        3) exit
         ;;
        *) sh hangman
        esac
        


        La version "carnaval" arriveras incéssament sous peu....... en attendant amusez-vous bien. :)))))
        Pour tout problème(s) concernant l'exécution du ce script et/ou autres renseignements, n'hésitez pas a me contacter!

        p.s.: j'ai dit petit soucis avec les lignes un peu trop grandes donc désolé pour les problèmes de lisibilités éventuelles
        1. OK, pour l'italique c'est pas bien grave c'était juste un exemple :)))))
          C'est plus les couleurs qui m'intéresse, pour la visibilité et un peu le clignotement pour les messages d'erreurs et de fin.

          Encore merci et re-bonne nuitée. :)
          1. Modérateur
            Normalement oui, avec "echo -e" devant, mais apparemment l'italique ne passe pas ;-((
            1. Et bin je te remercie, en plus de ça j'ai droit a une avant premiere :)
              Je m'amuserais demain avec tout ça, je vais nous faire un vrai hangman de carnaval!!!!! :)))))

              juste pour être sure de la syntaxe en ANSI, ceci est correct?
                \e[3m  bla bla bla \e[23m 
              1. Modérateur
                Oui pour les deux ;-))

                Sinon pour les couleurs tu as le choix, soit avec des codes "ANSI" soit avec "tput".
                Tiens voilà en avant-première un extrait d'une astuce qu'il faut que je me décide à finir pour la FAQ concernant la personnalisation de son ".bashrc" :
                Séquence d'échappement ANSI
                
                \e	Échappement (\033 ASCII)
                [n      Activation d'un attribut (n étant une valeur, 1 active la valeur gras et 0 la désactive)
                m       Termine la séquence d'échappement
                
                \e[0m    Désactivation
                \e[1m    Attribut gras
                \e[3m    Attribut italique
                \e[4m    Attribut soulignement
                \e[5m    Attribut clignotement
                \e[6m    Attribut contour noir (nécessite un arrière-plan coloré pour être perceptible)
                \e[7m    Attribut vidéo inverse
                \e[8m    Attribut invisible (nécessite un arrière-plan coloré)
                \e[9m    Attribut barré
                \e[22m   Attribut désactive gras
                \e[23m   Attribut désactive italique
                \e[24m   Attribut désactive soulignement
                \e[25m   Attribut désactive clignotement
                \e[27m   Attribut désactive vidéo inverse
                \e[29m   Attribut désactive barré


                Couleurs

                Code ANSI

                Note : Les codes couleurs ci-dessous sont préfixés avec la séquence d'échappement (\e[)

                Texte

                noir='\e[0;30m'
                gris='\e[1;30m'
                rougefonce='\e[0;31m'
                rose='\e[1;31m'
                vertfonce='\e[0;32m'
                vertclair='\e[1;32m'
                orange='\e[0;33m'
                jaune='e[1;33m'
                bleufonce='\e[0;34m'
                bleuclair='\e[1;34m'
                violetfonce='\e[0;35m'
                violetclair='\e[1;35m'
                cyanfonce='\e[0;36m'
                cyanclair='\e[1;36m'
                grisclair='\e[0;37m'
                blanc='\e[1;37m'
                
                neutre='\e[0;m'

                Arrière-plan

                APnoir='\e[0;40m]'
                AProuge='\e[0;41m'
                APvert='\e[0;42m'
                APmarron='\e[0;43m'
                APbleu='\e[0;44m'
                APviolet='\e[0;45m'
                APcyan='\e[0;46m'
                APgris='\e[0;47m'

                Commande tput
                Black="$(tput setaf 0)"				# Noir
                BlackBG="$(tput setab 0)"			# Arrière-plan noir
                DarkGrey="$(tput bold ; tput setaf 0)"		# Gris foncé
                LightGrey="$(tput setaf 7)"			# Gris clair
                LightGreyBG="$(tput setab 7)"			# Arrière-plan gris clair
                White="$(tput bold ; tput setaf 7)"		# Blanc
                Red="$(tput setaf 1)"				# Rouge foncé
                RedBG="$(tput setab 1)"				# Arrière-plan rouge foncé
                LightRed="$(tput bold ; tput setaf 1)"		# Rouge clair
                Green="$(tput setaf 2)"				# Vert foncé
                GreenBG="$(tput setab 2)"			# Arrière-plan vert foncé
                LightGreen="$(tput bold ; tput setaf 2)"	# Vert clair
                Brown="$(tput setaf 3)"				# Marron
                BrownBG="$(tput setab 3)"			# Arrière-plan marron
                Yellow="$(tput bold ; tput setaf 3)"		# Jaune
                Blue="$(tput setaf 4)"				# Bleu foncé
                BlueBG="$(tput setab 4)"			# Arrière-plan bleu foncé
                LightBlue="$(tput bold ; tput setaf 4)"		# Bleu clair
                Purple="$(tput setaf 5)"			# Pourpre
                PurpleBG="$(tput setab 5)"			# Arrière-plan pourpre
                Pink="$(tput bold ; tput setaf 5)"		# Rose
                Cyan="$(tput setaf 6)"				# Cyan foncé
                CyanBG="$(tput setab 6)"			# Arrière-plan cyan foncé
                LightCyan="$(tput bold ; tput setaf 6)"		# Cyan clair
                
                NC="$(tput sgr0)" 				# Retour à la normale
                1. Merci :)))
                  Je vais encore en gagner quelque-unes comme ça, là il fait 230 lignes...
                  pour la couleur juste une petit question sur la syntaxe, est-ce que l'on peut faire
                  ${vert} echo blablabla
                  echo albalbalb
                  echo lbalbalba ${resetcolor} 
                  


                  ou encore
                    ${vert}echo "will you find the word ${resetcolor} ${rouge} $name ${resetcolor}" 


                  Sinon y a-t-il d'autres couleur que celles proposer dans ton script en première page?
                  1. Modérateur
                    Oui, mais tu peux aussi mettre les ";;" en bout de ligne :
                    1) life=26; life2=26;;
                    2) etc...
                    ;-))
                    1. Ok merci pour la petite explication, en fait là je l'utilise surtout pour gagner 1 lignes ( 3 en tout... )

                      Donc si j'ai bien compris la syntaxe c'est 1) life=26; life2=26
                      ;;
                      2) etc...
                      1. Modérateur
                        Pour revenir sur le "&&", c'est une condition qui s'applique si la commande précédente a renvoyé un code retour vrai (0). Dans ton cas, la déclaration d'une variable ne conditionne pas de code retour, du moins elle ne renvoie pas d'erreur, donc ici elle ne sert à rien, d'où l'emploi dans le case d'un retour à la ligne ou si tu veux tu peux aussi l'écrire :

                        life=26; life2=26

                        ;-))
                        1. euh bin en fait oui je viens de remarquer que if [ [ dificulty_mode = 1 ]] c'est pas la même chose if [ [ $dificulty_mode = 1 ]] :)
                          encore une faute à la c.., j'avais même pas fait gaffe surtout que quand j'écrit une variable ça devient mauve mais bon c'est pas grave, on va dire que je suis fatigué.
                          Et pour le case oui effectivement c un peu plus court, je me disais bien qu'il y avait plus simple, merci encore :)))

                          Voilà ce que ça donne:
                          function difficulty_mode()
                          {
                          echo hello please select a difficulty
                          echo insert 1 for easy mode
                          echo insert 2 for normal mode
                          echo insert 3 for hard mode
                          echo insert 4 for kamikaze mode
                          read dificulty
                          case $dificulty in
                          1) life=26 && life2=26
                           ;;
                          2) life=15 && life2=15
                           ;;
                          3) life=7 && life2=7
                          ;;
                          4) life=1
                          esac
                          oneplayer
                          }
                          


                          Les modifications que j'ai dû faire sont:
                          - remplacer dans le menu la fonction "oneplayer" par "difficulty_mode"
                          - remplacer dans le début de "oneplayer" if [ [ $life = 15 ]] par if [ [ $life = $life2 ]]
                          - la déclaration des variables en tout début de script $life et $life2 étant devenu inutile, je les ai effacées.
                          -dans la fonction "playagain", remplacer "sh hangman.final" par one player ce qui en théorie devrait permettre de rejouer sans devoir repasser par le menu, à y rajouter éventuellement le moyen de retourner vers le menu, pour permettre de passer au mode 2 joueurs. et inversement.
                          Je rajouterais les couleurs demain et le posterais.

                          Bonne nuitée :))
                          1. Modérateur
                            Salut,

                            Déjà :
                            if [ [ "$dificulty_mode" = 1 ]]
                            serait un plus ;-))

                            Et en faisant avec un "case ... esac" plutôt, non ?
                            case "$dificulty_mode" in
                            1)     life=26
                                    life2=26
                                    ;;
                            2)     life=15
                                    life2=15
                                    ;;
                            etc.
                            esac
                            ;-))
                            1. J'ai un petit souci avec une fonction, celle pour choisir la difficulté.
                              function difficulty ()
                              {
                              echo hello please select a difficulty
                              echo insert 1 for easy mode
                              echo insert 2 for normal mode
                              echo insert 3 for hard mode
                              echo insert 4 for kamikaze mode
                              read dificulty_mode
                              if [ [ dificulty_mode = 1 ]]
                                then life=26 && life2=26
                              elif [ [ dificulty_mode = 2 ]]
                                then life=15 && life2=15
                              elif [ [ dificulty_mode = 3 ]]
                                then life=7 && life2=7
                              elif [ [ dificulty_mode = 4 ]]
                                then life=1
                              fi
                              oneplayer
                              }
                              

                              J'ai essayé sans les "&& " mais ça ne change rien, le probléme est que la variable $life* n'est pas prise en compte et donc rien ne s'affiche, j'ai pourtant fais les changement neccessaire dans oneplayer pour que diffuclty_mode fonctionne mais ça ne marche pas!!!

                              Any help is welcome :))))))))))))))
                              1. MDR c'est sur c'est plus court :))

                                Je traine souvent sur ccm maintenant, j'essaye d'aider les gens quand je le peux, on se recroiseras surement!

                                A+
                                1. Modérateur
                                  P.s.: si un jour, par hasard, tu trouves un moyen de le faire plus court fais moi signe.
                                  Une feuille de papier et un crayon. Pas mieux ;-DDD

                                  Bonne chance pour la suite et @ quand tu veux ;-)
                                  1. Il fait ce qu'il peux........ :-))))))))))))))))))))))))))))))))))))))))
                                    Mais là je doit dire que je suis content de moi, je l'ai trouvé tout seul sans personne!!!! :)

                                    C'est toi que je remercie, sans ton exemple je serais surement encore entrain de me casser la tête dessus, ça m'as permis de m'améliorer grandement!
                                    Y'a encore 2 mois de ça je n'y serait pas arrivé.

                                    J'ai un séminaire fin février, en espérant le réussir et partir pour brighton pendant 3 mois et pis après je sais pas encore où!

                                    Donc encore merci et ce fût un plaisir de poster mes résultat ici et surtout d'avoir des réponses, quand j'aurais mis les couleurs je posterais le tout complet et fini ici ou alors je commencerais une nouvelle discussion, aussi je pense y rajouter un niveau de difficultés facile/moyen/dur il me suffiras de bidouiller un peu la variable $life et pis ça seras bon.

                                    Que UNIX soit avec toi...

                                    P.s.: si un jour, par hasard, tu trouves un moyen de le faire plus court fais moi signe.
                                    • 1
                                    • 2