|
|
|
|
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
Salut,
# 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...
;-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Bonjour, voilà je comence donc par faire le code pour un joueur.
|
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.
#! /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
Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
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;-))
Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
On appelle ça une redirection. Tu dois connaitre la forme avec un fichier : cat < fichierBen 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);-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Non je ne savais pas que 3 < permet de faire une redirection à partir d'une variable..c'est très pratique!
|
Voici une version 2 joueurs, le joueur1 doit doit insérer un mot à trouver pour le joueur2 .
#!/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. |
Ça ira comme ça Jipicy?
|
Ah désolé pour l'avertissement, j'essayerai de m'appliquer un peu plus la prochaine fois! ;)
|
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.
|
Merci de l'info ;-))
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) ;-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
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.
|
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...
;-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Répondre à hugnix
|
Pas d'prob ;)
|