Script bash avancé

Fermé
billy - 29 oct. 2007 à 19:46
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009 - 20 févr. 2008 à 19:06
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.

40 réponses

hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
22 janv. 2008 à 22:00
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.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 janv. 2008 à 22:06
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 ;-)
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
22 janv. 2008 à 22:15
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+
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
23 janv. 2008 à 22:12
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 :))))))))))))))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 janv. 2008 à 22:19
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
;-))
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
23 janv. 2008 à 22:31
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 :))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 janv. 2008 à 22:42
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

;-))
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
23 janv. 2008 à 22:58
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...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 janv. 2008 à 23:01
Oui, mais tu peux aussi mettre les ";;" en bout de ligne :
1) life=26; life2=26;;
2) etc...
;-))
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
23 janv. 2008 à 23:18
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?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 janv. 2008 à 23:30
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
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
23 janv. 2008 à 23:43
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 
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 janv. 2008 à 23:59
Normalement oui, avec "echo -e" devant, mais apparemment l'italique ne passe pas ;-((
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
24 janv. 2008 à 00:22
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. :)
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
25 janv. 2008 à 20:26
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
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
15 févr. 2008 à 22:46
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
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
16 févr. 2008 à 17:27
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!
0
Trouvé l'erreur du menu, j'avais oublié de fermer une fonction avec un } , du coup il aimait trop........
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
16 févr. 2008 à 18:18
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

0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
17 févr. 2008 à 21:47
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 :)))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
17 févr. 2008 à 21:58
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
;-))
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
17 févr. 2008 à 22:53
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 :)))
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
20 févr. 2008 à 19:06
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 :))))))
0