Script.sh ?

mino2z Messages postés 1 Statut Membre -  
FireCode Messages postés 1 Statut Membre -
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
Configuration: Windows XP
Internet Explorer 6.0

1 réponse

  1. FireCode Messages postés 1 Statut Membre
     
    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