IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

pierre papier ciseaux shell


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 77
    Points : 34
    Points
    34
    Par défaut pierre papier ciseaux shell
    bonjour,
    voila je viens demander votre aide sur un script en shell portant sur pierre papier ciseaux.

    mais le problème est que je suis débutant et que le prof nous pose sa de but en blanc. Après plusieurs recherche sur internet j'ai réussi à trouver des informations.

    echo -n "enter name player1: "
    read player1


    echo "$player1"
    echo "rock 1"
    echo "paper 2"
    echo "cissors 3"
    echo "end 5"
    echo -n "choie $player1 : "
    read choice1
    donc logiquement j'ai ca dans 2 fichier séparé pour les 2 joueur (variable :choice1;choice2;player1;player2)

    et dans un troisième j'ai pour le moment ceci

    if $choice1<$choise2
    then
    echo $player2 win
    fi

    if $choise1>$choise2
    then
    echo $player1 win
    fi

    if $choice1=$choise2
    then
    no winner
    fi

    if $choise1=1 && $choise2=3
    then
    echo $player1 win
    fi

    if $choise1=3 && $choise2=1
    then
    echo $player1 win
    fi
    mes problèmes son que je ne sais pas récupérer une variable d'un fichier à l'autre pour les comparaisons.

    Ensuite mon fichier pour comparer ne fonctionne pas, sachant que pour le moment je n'est pas mit dans ce dernier le code permettant d'écrire dans un fichier txt les résultats

    [edit 1] je viens de voir que mes variable n'apparaisse pas dans le dash, comment remédier à cela ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    L'instruction "if" ne peut tester que le status d'un programme. Donc il faut écrire "if programme" => signifiant "si le programme est vrai alors..."

    if $choice1<$choice2 ne marchera pas vu que $choice1 n'est pas un programme, c'est une variable. Si tu veux comparer 2 variables, il te faut utiliser le programme "test" qui sert à ça et qui, lui, est bien un programme
    if test $choice1 -lt $choice2

    Citation Envoyé par Phoenix2025
    mes problèmes son que je ne sais pas récupérer une variable d'un fichier à l'autre pour les comparaisons.
    On ne peut pas récupérer une variable d'un script à un autre. On ne peut que récupérer une valeur stockée dans un fichier.
    Exemple: t'as un fichier "toto" qui contient
    variable :choice1;choice2;player1;player2
    En tapant , tu récupères dans ta variable "lig" le contenu du fichier "toto"

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 77
    Points : 34
    Points
    34
    Par défaut
    merci pour ton aide j'avance

    mais comment tu fait pour les deux fichiers qui me servent au joueur ? pour rentrer les valeurs dans un fichier comme tu me là expliqué vue que c'est le seul moyen pour pouvoir les faire lire pas un autre script.

    je croyait que si ces dernières était contenu dans le dash on pouvais les réutiliser.

    voici mes fichiers maintenant
    echo -n "enter name player1: "
    read player1
    echo "$player1"
    echo "rock 1"
    echo "paper 2"
    echo "cissors 3"
    echo "end 5"
    echo -n "choie $player1 : "
    read choice1
    toto:choise1;player1
    lig=`cat toto`
    if test $choice1 It $choise2
    then
    echo $player2 win
    fi

    if test $choise1 It $choise2
    then
    echo $player1 win
    fi

    if test $choice1= It$choise2
    then
    no winner
    fi

    if test $choise1=1 && It $choise2=3
    then
    echo $player1 win
    fi

    if test $choise1=3 && It $choise2=1
    then
    echo $player1 win
    fi

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 77
    Points : 34
    Points
    34
    Par défaut
    voila après pas mal de travail j'ai réussi à insérer les variables des 2 premier fichiers dans un .txt

    mais j'ai un problème dans la 2eme parti plutôt gênant car il m'empêche de tester cette partie. Quand j'essaie de le lancer j'ai fin de fichier prématuré


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/bin/bash
     
     
    echo -n "enter name player1: "
    read player1
    player1=$player1
    export player1
     
     
     
    echo "$player1"
     
    echo "rock 1"
    echo "paper 2"
    echo "scissors 3"
    echo "end 4"
    echo -n "choice of $player1 : "
    read -s choice1 
    echo ""
     
     
    echo -n "enter name player2: "
    read player2
     
    echo "$player2"
    echo "rock 1"
    echo "paper 2"
    echo "scissors 3"
    echo "end 4"
    echo -n "choise $player2 : "
    read -s choice2
    echo""
     
     
    echo $player1 > toto.txt
    echo $choice1 >> toto.txt
    echo $player2 >> toto.txt
    echo $choice2 >> toto.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/bin/bash
     
    cat toto.txt | while read ligne
    do
    set $(echo $ligne)
    init_p=$(eval echo $1)
    player1=$(eval echo $2)
    choice1=$(eval echo $3)
    player2=$(eval echo $4)
    choise2=$(eval echo $5)
    #echo -e "player1=$player1\nplayer2=$player2\nchoise1=$choise1\nchoise2=$choise2\n"
    done
     
    if [ $choice1 > $choise2 ]
     then 
       echo $player2 win >> toto.txt
    fi
     
    if [ $choise1 < $choise2 ]
     then
       echo $player1 win >> toto.txt
    fi
     
    if [ "$choice1" =  "$choise2" ]
     then 
       echo no winner >> toto.txt
    fi
     
    if [ $choise1="1" ] || [ $choise2="3" ]
     then
       echo $player1 win >> toto.txt
    fi
     
    if [ $choise1="3" ] || [ $choise2="1" ]
     then
       echo $player2 win >> toto.txt
    fi

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cat toto.txt | while read ligne
    do
    set $(echo $ligne)
    player1=$(eval echo $1)
    choice1=$(eval echo $2)
    player2=$(eval echo $3)
    choise2=$(eval echo $4)
    echo -e "player1=$player1\nplayer2=$player2\nchoise1=$choise1\nchoise2=$choise2\n"
    cette partie n est pas correcte

    je l aurais fait ainsi mais dis moi si tu veux garder ta syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    player1=`cat toto.txt | sed -n '1p'`
    choise1=`cat toto.txt | sed -n '2p'`
    player2=`cat toto.txt | sed -n '3p'`
    choise2=`cat toto.txt | sed -n '4p'`
    echo -e "player1=$player1\nplayer2=$player2\nchoise1=$choise1\nchoise2=$choise2\n"


    Après la suite ça ne vas pas non plus, la syntaxe est bonne mais le fonctionnement non :

    Le joueur1 a son choix a 2 et le joueur2 a 3

    donc $choise1 < $choise2 ==> echo $player1 win >> toto.txt
    après $choise2="3" ==> echo $player1 win >> toto.txt


    Je ne sais pas comment tu veux le faire fonctionner ( tes différentes règles ) mais elles doivent s'appliquer une unique fois.

    Le plus simple serait de fonctionner avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    si choix1==x && choix2==y =>> tel traitement
    si choix1==y ....
    vu le faible nombre de possibilités ce n'est pas très lourd (ça en fait 7 avec un test d'egalité en premier) mais c'est a toi de décider

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 77
    Points : 34
    Points
    34
    Par défaut
    j'ai suivi tes instructions mais j'ai toujours là même erreur récurante : fin de fichier prématurée

    voici le nouveau code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/bin/bash -x
     
     
     
    player1=`cat toto.txt | sed -n '1p'`
    choice1=`cat toto.txt | sed -n '2p'`
    player2=`cat toto.txt | sed -n '3p'`
    choice2=`cat toto.txt | sed -n '4p'`
     
     
    if $choice1=="1" && $choice2=="2" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="3" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="1" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="3" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="1" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="2" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="3" ==> echo "no winner" >>toto.txt fi
    [EDIT]en ce qui concerne les variables player et choice cela fonction super merci[/EDIT]

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    je me suis mal exprimé, la deuxième partie n était pas du code mais un prototype


    tu peux faire ça si tu préfères mais ce n'est qu un exemple et je pense qu'il peut etre mieux optimisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/bin/sh
     
    player1=`cat toto.txt | sed -n '1p'`
    choise1=`cat toto.txt | sed -n '2p'`
    player2=`cat toto.txt | sed -n '3p'`
    choise2=`cat toto.txt | sed -n '4p'`
    echo -e "player1=$player1\nplayer2=$player2\nchoise1=$choise1\nchoise2=$choise2\n"
     
    if [ $choise1 = $choise2 ]
    then
    	echo "${choise1}/${choise2}"
    else
    	if [ $choise1 = "1" -a $choise2 = "2" ]
    	then echo "1/2"
    	fi
    	if [ $choise1 = "1" -a $choise2 = "3" ]
    	then echo "1/3"
    	fi
    	if [ $choise1 = "2" -a $choise2 = "1" ]
    	then echo "2/1"
    	fi
    	if [ $choise1 = "2" -a $choise2 = "3" ]
    	then echo "2/3"
    	fi
    	if [ $choise1 = "3" -a $choise2 = "1" ]
    	then echo "3/1"
    	fi
    	if [ $choise1 = "3" -a $choise2 = "2" ]
    	then echo "3/2"
    	fi
    fi

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Phoenix2025 Voir le message
    j'ai suivi tes instructions mais j'ai toujours là même erreur récurante : fin de fichier prématurée

    voici le nouveau code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/bin/bash -x
     
     
     
    player1=`cat toto.txt | sed -n '1p'`
    choice1=`cat toto.txt | sed -n '2p'`
    player2=`cat toto.txt | sed -n '3p'`
    choice2=`cat toto.txt | sed -n '4p'`
     
     
    if $choice1=="1" && $choice2=="2" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="3" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="1" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="3" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="1" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="2" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="3" ==> echo "no winner" >>toto.txt fi
    [EDIT]en ce qui concerne les variables player et choice cela fonction super merci[/EDIT]
    L'instruction "if" ne peut tester que des programmes ou des commandes (déjà dit). A moins que la variable "$choice" ne contienne un chemin vers une commande, ça ne fonctionnera pas.

    Par ailleurs, l'instruction "player1=$(eval echo $1)" peut s'écrire plus simplement "player1=$1". De même l'instruction "player1=$player1" est totalement inutile ainsi que l'instruction "export"

    Enfin l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if commande then instruction_unique fi
    est mal écrite car il manque les séparateurs ";" pour que le shell sache où s'arrêter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if commande ; then instruction_unique ; fi
    Personnellement, j'écrirais plutôt de façon détaillée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if commande
    then
          instruction_unique
    fi
    mais surtout, dans le cas d'une instruction unique, on peut éviter le if...fi de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande && instruction_unique
    Tu devrais cependant télécharger un tutoriel Shell Linux : http://linux.developpez.com/cours/ . Le temps que tu perdras à le lire tu le regagneras en tapant plus vite un code qui fonctionne...

  9. #9
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Citation Envoyé par Phoenix2025 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #!/bin/bash -x
     
     
     
    player1=`cat toto.txt | sed -n '1p'`
    choice1=`cat toto.txt | sed -n '2p'`
    player2=`cat toto.txt | sed -n '3p'`
    choice2=`cat toto.txt | sed -n '4p'`
     
    if $choice1=="1" && $choice2=="2" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="3" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="1" ==> echo "$player1 win" >>toto.txt fi
    if $choice1=="2" && $choice2=="3" ==> echo "$player2 win" >>toto.txt fi
    if $choice1=="1" && $choice2=="1" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="2" ==> echo "no winner" >>toto.txt fi
    if $choice1=="3" && $choice2=="3" ==> echo "no winner" >>toto.txt fi
    L'utilisation du cat avec sed est redondant. Sed est capable de lire par lui-même un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    player1=`sed -n '1p' toto.txt`
    Il est préférable d'utiliser case...esac à la place de if...fi dans ce genre de cas.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 77
    Points : 34
    Points
    34
    Par défaut
    Ok compris je vais faire mon max pour finir tous ca avec vos instructions.

    Merci à vous !

Discussions similaires

  1. Pierre Feuille Ciseaux
    Par Wilvart dans le forum C++
    Réponses: 12
    Dernier message: 20/08/2006, 13h19
  2. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 11h45
  3. [Système] Vider le Presse Papier
    Par babe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/09/2002, 17h46
  4. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39
  5. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo