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

Python Discussion :

Sortir d'une boucle while avec un input spécifique


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Alternant Ingénieur
    Inscrit en
    Juillet 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Alternant Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2021
    Messages : 13
    Par défaut Sortir d'une boucle while avec un input spécifique
    Bonjour,

    Je commence à apprendre python et je rencontre ma première difficulté !
    Le programme que je fais est un programme de pierre feuille ciseaux, et je veux que le programme tourne en boucle jusqu'à ce que l'utilisateur entre l'input exit ou x en lieu et place de sa réponse pierre/feuille/ciseau

    Ci-dessous le 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import random
     
    def play():
        flag = True
        while flag:
            user = input(" Type \"rock\", \"paper\" or \"scissors\" !")
            computer = random.choice(["rock", "paper", "scissors"])
     
            if user == "exit" or user == "x":
                flag = False
                return "You exit the game."
     
     
            print(f"\n{user} vs {computer}...\n")
     
            if user == computer:
                return "Tie!"
     
            # Rock > Scissors, Scissors > paper, paper > Rock
            if is_win(user.lower(), computer.lower()): 
                return "You won !"
     
            elif is_win(computer.lower(), user.lower()):
                return "You lost ! :( "
     
     
    def is_win(player, opponent): #return true if 1st argument wins
        if (player == "rock" and opponent == "scissors") or (player == "scissors" and opponent == "paper")\
             or (player == "paper" and opponent == "rock" ):
            return True
     
     
    print(play())
    Mais la boucle ne marche pas, et je ne comprends pas pourquoi !
    Quelqu'un saurait m'expliquer pourquoi, et me guider vers la bonne pratique pour ce genre d'opération (sortir d'une boucle while) ? Merci d'avance !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par James C Voir le message
    Quelqu'un saurait m'expliquer pourquoi, et me guider vers la bonne pratique pour ce genre d'opération (sortir d'une boucle while) ?
    Réfléchissez en français "tant que condition faire" ici votre condition est le booléen flag: sortir de la boucle à coup de "return" fonctionne aussi (on y préférera break et continue) mais alors le flag ne sert à rien.

    Quelque part votre code est incohérent... normal vous débutez à vouloir faire trop compliqué par rapport à vos capacités: ouvrez un tuto. il y a des exercices corrigés et toutes les explications que vous souhaitez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Alternant Ingénieur
    Inscrit en
    Juillet 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Alternant Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2021
    Messages : 13
    Par défaut
    Rebonjour,

    Alors en fait c'est un programme que j'ai copié d'un tutoriel et que j'ai ensuite voulu mdoiifer pour rajouter la boucle et le système de sortie de la boucle.

    Le programme de base imprime le résultat de la fonction "play".
    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
    import random
     
    def play():
        user = input("What's your pick ? 'r' for rock, 'p' for paper, 's' for scissors\n")
        computer = random.choice(['r', 'p', 's'])
     
        if user == computer:
            return "It\'s a tie..."
     
        if is_win(user, computer):
            return "You won !"
     
        return "You lost !"
     
    def is_win(player, opponent):
        if (player == "r" and opponent == "s") or (player == "s" and opponent == "p") or (player == "p" and opponent == "r"):
            return True
     
    print(play())
    En le faisant par moi même de mon côté, j'exécute directement play et à la place de retourner un résultat d ela fonction play, j'imprime :
    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
    import random
     
    #play main function
    def play():
        flag = True
        while flag:
            user = input("Type \"rock\", \"paper\" or \"scissors\" !")
            computer =  random.choice(["rock", "paper", "scissors"])
     
            if user == "exit" or user == "x":
                flag = False
                print("You exit the game !")
                break
     
            print(f"\n{user} versus {computer}")
     
            if has_won(user, computer):
                print("You win !")
            elif has_won(computer, user):
                print("You lost :( !")
            else:
                print("Tie !")
     
    #tells me wether the first argument wins overthe 2d Boolean
    def has_won(player, opponent):
        #Papier bat pierre, pierre bat ciseaux, ciseax battent Papier
        if (player == "rock" and opponent == "scissors") or (player == "scissors" and opponent == "paper")\
             or (player == "paper" and opponent == "rock" ):
            return True
     
    play()
    Mon programme amrche très bien, mais du coup je n'imprime plus play. Est-ce que une structure comme j'ai fait est "bien" ? Je ne vois que des structures où on imprime un résultat, jamais où on exécute une fonction directement.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par James C Voir le message
    Mon programme amrche très bien, mais du coup je n'imprime plus play. Est-ce que une structure comme j'ai fait est "bien" ?
    Est-ce que "play" affiche des messages ou les retourne à l'appelant qui en fait ce qu'il en veut?

    Ce n'est ni bien ni mal... juste une répartition différente du rôle et des responsabilités de chaque morceau que vous décidez suivant des critères non-techniques (pour l'utilisateur ça ne change rien)... et comme c'est vous qui décidez du découpage, c'est à vous de trouver les raisons qui vous feront préférer l'une ou l'autre.

    Qui plus est, ce n'est pas un sujet "python": ça ne dépend pas du langage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 921
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Comme dit plus haut, si tu mets un break pour sortir de ta boucle inutile de te servir d'un flag.
    Autant partir sur :

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    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 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par James C Voir le message
    Est-ce que une structure comme j'ai fait est "bien" ?
    Ca signifie quoi "bien" ??? C'est un peu relatif comme notion.
    Ce que je vois c'est toutes ces répétitions inutiles (if machin == "scissors" and chose == "rock" or machin == "rock" and chose == "paper" etc). Tu n'as pas remarqué que dans le Shifoumi il y a une espèce de cycle (A gagne B, B gagne C et C gagne A). Tu aurais pu l'utiliser. Si par exemple tu dis "pierre=0, papier=1, ciseaux=2" alors quel que soit le choix joueur/computer, si (joueur+1) modulo(3) == computer alors computer gagne, et si (computer+1) modulo(3) == joueur alors joueur gagne.
    Et cette fonction has_won() que tu appelles deux fois. Pouvais pas lui faire renvoyer directement qui gagne ???
    Donc voilà. Ca fait pas très "alternant ingénieur"...

    Code python : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Shifoumi selon Big-Bang Théorie (la série)
    # 5 pièces: caillou, papier, ciseaux, lézard, Spock (celui de Star Trek)
    # Le caillou casse les ciseaux et écrase le lézard
    # Le papier désavoue Spock et attrape le caillou
    # Les ciseaux décapitent le lézard et coupent le papier
    # Le lézard empoisonne Spock et avale le papier
    # Spock explose les ciseaux et le caillou
     
    import random
     
    def play():
    	RCK=0x01
    	PPR=0x02
    	SCS=0x03
    	LZD=0x04
    	SPK=0x05
    	pieces={
    		RCK : {"label" : "caillou", "X" : (SCS, LZD)},
    		PPR : {"label" : "papier", "X" : (SPK, RCK)},
    		SCS : {"label" : "ciseaux", "X" : (LZD, PPR)},
    		LZD : {"label" : "lézard", "X" : (SPK, PPR)},
    		SPK : {"label" : "Spock", "X" : (SCS, RCK)},
    	}
     
    	score=[0, 0]
    	while True:
    		choix=input(
    			"Choissisez [%s] (Q pour quitter) :" % ", ".join(x["label"] for x in pieces.values())
    		)
    		if choix in "Qq": return score
    		joueur=txt2key(pieces, choix)
    		if joueur is None:
    			print("Choix [%s] incorrect - Recommencez" % choix)
    			continue
    		# if
     
    		computer=random.choice(tuple(pieces.keys()))
    		match=analyse(pieces, joueur, computer)
    		if match < 0: # Joueur
    			score[0]+=1
    			print("{} vs {}: le joueur gagne ({})".format(pieces[joueur]["label"], pieces[computer]["label"], score))
    		elif match > 0: # Computer
    			score[1]+=1
    			print("{} vs {}: le computer gagne ({})".format(pieces[joueur]["label"], pieces[computer]["label"], score))
    		else:
    			print("{} vs {}: égalité ({})".format(pieces[joueur]["label"], pieces[computer]["label"], score))
    	# while
    # play()
     
    def txt2key(pieces, txt):
    	for (k, v) in pieces.items():
    		if v["label"] == txt: return k
    	return None
    # txt2key()
     
    def analyse(pieces, j1, j2):
    	if j2 in pieces[j1]["X"]: return -1
    	if j1 in pieces[j2]["X"]: return 1
    	return 0
    # analyse()
     
    if __name__ == "__main__":
    	score=play()
    	print("Fin du jeu - Score %s" % score)
    # if
    Je ne sais pas si ce que j'ai fait est "bien". Ce que je sais en revanche, c'est que si je veux supprimer des pièces (exemple revenir au pierre/papier/ciseaux originel) me suffit de supprimer ce qui est en trop du dictionnaire "pièces" et hop, le reste du code s'adapte
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pieces={
    	RCK : {"label" : "caillou", "X" : (SCS,)},
    	PPR : {"label" : "papier", "X" : (RCK,)},
    	SCS : {"label" : "ciseaux", "X" : (PPR,)},
    }

    De même demain un geek quelconque rajoute 2 pièces de plus avec les liaisons qui vont bien concernant le gain, me suffit de les rajouter selon la même syntaxe...

    Citation Envoyé par James C Voir le message
    Je ne vois que des structures où on imprime un résultat, jamais où on exécute une fonction directement.
    Et comment tu "imprimes" un résultat ? Via la fonction print() non ?? Et appeler print() ce n'est pas "exécuter une fonction directement" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Sortir d'une boucle while wend
    Par 973thom dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/09/2009, 10h14
  2. Sortir d'une boucle while
    Par dahu007 dans le forum Langage
    Réponses: 14
    Dernier message: 15/06/2008, 17h33
  3. comment sortir d'une boucle while d'un Iterator
    Par solawe dans le forum Langage
    Réponses: 6
    Dernier message: 18/03/2008, 13h46
  4. Sortir d'une boucle while
    Par chris81 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/01/2008, 11h50
  5. Probleme pour sortir d'une boucle while
    Par aikinhdo dans le forum Langage
    Réponses: 0
    Dernier message: 27/07/2007, 15h01

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