Script.sh ?

Fermé
mino2z Messages postés 1 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 8 juin 2007 - 8 juin 2007 à 11:49
FireCode Messages postés 1 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 8 juin 2007 - 8 juin 2007 à 23:08
salut à tous le monde en faite j'ai un projet à rendre aujord'hui, c'est un script.sh qui est un jeu de connaissance de capitale et de pays et qu'on peut l'appeler de trois façons:
./script.sh -v Paris(par exemeple) --> le script lit le fichier capitales.txt et nous affiche une question "quel est le pays dont la capitale est Paris?" tu tape France il te dit bien joué (exemple).
./script.sh -p France (le méme mais à l'inverse)
./script.sh -battle --> c'est ici que j'ai le probléme, le script doit fixer le nombre de questions, les noms des joueurs et à chaque round il demande si on veut jouez -v ou -p (genre "vous voulez jouez au mode p ou v).
je vous donne ce que j'ai écrit et merci d'avance:



#!/bin/bash



if [ ! \( "$1" = "-v" -o "$1" = "-p" -o "$1" = "-battle" \) ]
then
echo "Erreur : le premier argument doit étre -v , -p ou -battle"
echo "Usage : $0 -p Pays, $0 -v Ville ou $0 -battle"
exit 1
fi

var=`find $(pwd) -name capitales.txt`
if $var = ""
then
echo "Accés au fichier capitales.txt impossible"

else
ligne=$(grep "$2" $var)
pays=${ligne%,*}
capitale=${ligne#*,}
fi
if [ "$1" = "-v" ]
then
echo " De quel pays $2 est-elle la capitale ? "
read reponse
if [ "$reponse" = "$pays" ]
then
echo "Bien joué!"
else
echo "Mais non! $2 est la capitale de $pays "
fi
elif [ "$1" = "-p" ]
then
echo "quel est la capitale de la (l') $2?"
read reponse
if [ "$reponse" = "$capitale" ]
then
echo "Bravo"
else
echo "Mais non!la capitale de $2 est $capitale"
fi
elif [ "$1" = "-battle" ]
then
echo "bienvenue les joueurs!"
echo "vous voulez combien de round?"
read nbround
echo "donnez le nom du joueur 1: "
read joueur1
echo "donnez le nom du joueur 2: "
read joueur2
for((i=0;i<nbround;i++))
do
echo "on commence avec toi $joueur1, tu veux jouer le mode capitale (tape v) ou le mode pays (tape p)"
read mode

1 réponse

FireCode Messages postés 1 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 8 juin 2007
8 juin 2007 à 23:08
Salut mino2z,

Je me suis amusé à développer ton script, je ne sais pas s'il est trop tard il y a peut-être des erreurs:

le script:
#! /bin/bash

# <CONFIG/>
#------------------------------------
SCR_NAME=`basename "$0"`
DATA_DIR="`pwd`"
DATA_FILE="${DATA_DIR}/capitales.dat"
#------------------------------------
CAP_OPT="-c"
CTR_OPT="-p"
BTL_OPT="-b"
#------------------------------------
MODE_CAP=0
MODE_CTR=0
#------------------------------------
MODE_BTL=0
ROUND_NB=0
PL1_NAME=
PL2_NAME=
#------------------------------------
# </CONFIG>

if [ ! -f "$DATA_FILE" ]; then
echo "${SCR_NAME}: fichier source \`~/`basename $DATA_FILE`' absent !" 2>&1
exit -1
else
if [ ! -r "$DATA_FILE" ]; then
echo "${SCR_NAME}: accès à \`~/`basename $DATA_FILE`' refusé !" 2>&1
exit -1
fi
fi

function usage() {
echo "Usage: $SCR_NAME [ MODE ]"
echo -e "\nModes:"
echo "$CAP_OPT,    lancer le mode capitale"
echo "$CTR_OPT,    lancer le mode pays"
echo "$BTL_OPT,    lancer le mode battle"
}

function pline() { echo "----------------------------" ;}

# ========> SET PARAMETERS  <==========
if [ $# -eq 0 ]; then
echo "${SCR_NAME}: paramètre manquant !" 2>&1
usage
exit -1
fi

while [ $# -gt 0 ]; do
case "$1" in
$CAP_OPT)
if [ $MODE_CAP -ne 0 -o $MODE_CTR -ne 0 ]; then
echo "${SCR_NAME}: paramètre non valide !" 2>&1
usage
exit -1
else
MODE_CAP=1
fi
;;
$CTR_OPT)
if [ $MODE_CAP -ne 0 -o $MODE_CTR -ne 0 ]; then
echo "${SCR_NAME}: paramètre non valide !" 2>&1
usage
exit -1
else
MODE_CTR=1
fi
;;
$BTL_OPT)
if [ $MODE_CAP -ne 0 -o $MODE_CTR -ne 0 ]; then
echo "${SCR_NAME}: paramètre non valide !" 2>&1
usage
exit -1
else
MODE_BTL=1
echo -e "\nMode battle ..."
pline
while : ; do
printf "Entrez le nombre de partie: "
read ROUND_NB
test $ROUND_NB -gt 0 2> /dev/null
if [ $? -ne 0 ]; then
echo "Nombre \`$ROUND_NB' invalide !"
else
pline
break
fi
done
for PL_NB in 1 2; do
while : ; do
printf "Entrez le pseudo du joueur n${PL_NB}: "
case $PL_NB in
1)read PL1_NAME
test -n "$PL1_NAME" && pline && break
;;
2)read PL2_NAME
test -n "$PL2_NAME" && pline && break
;;
esac
done
done
fi
;;
-h|--help)
usage
exit 0
;;
*)echo "${SCR_NAME}: paramètre \`$1' non valide !" 2>&1
usage
exit -1
;;
esac
shift
done

function choice_mode()
{
while : ; do
printf "Choisi un mode joueur ${1},\ncapitale: mode [1]\npays:     mode [2]\nmode: "
read RTR_MODE
test $RTR_MODE -ge 1 -a $RTR_MODE -le 2 2> /dev/null
if [ $? -ne 0 ]; then
echo "Mode \`$RTR_MODE' non valide !"
else
break
fi
done

return $RTR_MODE
}

function play_mode()
{
PLM_CAP=`cat "$DATA_FILE" | gawk -v CL=$CUR_LINE '(NR == (CL+1)) { sub("CAP:",""); printf("%s", toupper($0)); exit 1 }'`
PLM_CTR=`cat "$DATA_FILE" | gawk -v CL=$CUR_LINE '(NR == CL) { sub("COUNTRY:",""); printf("%s",toupper($0)); exit 1 }'`
test -n "$2" && PNAME_STR="Joueur $2, "

case $1 in
# CAPITAL MODE
1)echo -e "\nMode capitale ..."
pline
while : ; do
printf "${PNAME_STR}Quelle est la capitale de: $PLM_CTR\nréponse: "
read PLM_PLAYER_CAP
test -n "$PLM_PLAYER_CAP" && break
done

PLM_PLAYER_CAP=`printf "$PLM_PLAYER_CAP" | gawk '{ printf("%s",toupper($0))}'`
if [ "$PLM_PLAYER_CAP" == "$PLM_CAP" ]; then
pline
echo "Bonne réponse :p"
pline
else
pline
echo "Faux :(, c'était la capitale: $PLM_CAP"
pline
fi
;;
# COUNTRY MODE
2)echo -e "\nMode pays ..."
pline
while : ; do
printf "${PNAME_STR}Quel est le pays de la capitale: $PLM_CAP\nréponse: "
read PLM_PLAYER_CTR
test -n "$PLM_PLAYER_CTR" && break
done

PLM_PLAYER_CTR=`printf "$PLM_PLAYER_CTR" | gawk '{ printf("%s",toupper($0))}'`
if [ "$PLM_PLAYER_CTR" == "$PLM_CTR" ]; then
pline
echo "Bonne réponse :p"
pline
else
pline
echo "Faux :(, c'était le pays: $PLM_CTR"
pline
fi
;;
esac

let $((CUR_LINE += 2))
}

if [ $MODE_BTL -ne 0 ]; then
# MODE BATTLE
CUR_LINE=1
CURR_RND=0
while [ $CURR_RND -ne $ROUND_NB ]; do
echo "PARTIE no `expr $CURR_RND + 1`:"
pline
test $CUR_LINE -ge `wc -l "$DATA_FILE" | gawk '{print $1}'` && CUR_LINE=1
# PLAYER 1
choice_mode "$PL1_NAME"
CURR_MODE=$?
play_mode $CURR_MODE "$PL1_NAME"

# PLAYER 2
choice_mode "$PL2_NAME"
CURR_MODE=$?
play_mode $CURR_MODE "$PL2_NAME"

let $((CURR_RND += 1))
done
else
CUR_LINE=`expr $RANDOM % $(wc -l capitales.dat | gawk '{ print $1}')`

case $CUR_LINE in
*0)
CUR_LINE=1
;;
*2|*4|*6|*8)
let $((CUR_LINE -= 1))
;;
esac

if [ $MODE_CAP -ne 0 ];  then
play_mode "1"
else
if [ $MODE_CTR -ne 0 ];  then
play_mode "2"
fi
fi
fi

exit 0


Le fichier des capitales "capitales.dat":

COUNTRY:France
CAP:Paris
COUNTRY:Allemagne
CAP:Berlin
COUNTRY:Espagne
CAP:Madrid
COUNTRY:Italie
CAP:Rome
COUNTRY:Portugal
CAP:Lisbonne
COUNTRY:Royaume-uni
CAP:Londre


Voilà, dis moi ce que t'en pense ...
0