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

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
30 oct. 2007 à 11:34
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
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
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
30 oct. 2007 à 20:18
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
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
30 oct. 2007 à 20:36
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

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

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

merci
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
30 oct. 2007 à 23:38
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
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
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
31 oct. 2007 à 06:38
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
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
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
15 janv. 2008 à 20:09
Ç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
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
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
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 janv. 2008 à 18:59
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
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
18 janv. 2008 à 00:08
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
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
18 janv. 2008 à 10:05
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
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
18 janv. 2008 à 19:11
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
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
18 janv. 2008 à 19:17
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
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
18 janv. 2008 à 19:47
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
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
22 janv. 2008 à 20:30
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
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
22 janv. 2008 à 21:17
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
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 à 21:42
Mais c'est qu'il est doué ce d'jeuns ;-)))

Merci en tout cas ;-))
0