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 :

une fonction ne retourne pas ce pour quoi elle a été créée


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Apprentissage python
    Inscrit en
    Novembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprentissage python

    Informations forums :
    Inscription : Novembre 2018
    Messages : 10
    Par défaut une fonction ne retourne pas ce pour quoi elle a été créée
    Bonsoir,

    Je suis en train de programmer le jeu de "rock, paper, scissors" en python. J'ai le problème suivant. J'ai créé une fonction pour déterminer si le joueur 1 gagne, ou si c'est le joueur 2 ou alors si c'est match nul.

    Lorsque je teste ma fonction à part, à l'aide d'une boucle, elle produit le résultat correct, mais lorsque j'insère ma fonction dans mon programme, ça ne produit pas du tout le bon résultat, par exemple si le joueur 1 choisi "rock" et le joueur deux choisis "paper" il sort le résultat : match nul, au lieu de : joueur 2 gagne. Quelqu'un pourrait-il m'aider ?
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    1 Tu tire deux fois un choix aléatoire, celui qui est affiché n'est pas celui qui est joué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	def play_round(self):
    		move1 = self.choice
    		move2 = self.p2.move()  # Première fois
    		print(f"Opponent played {move2}")
     
                    print(self.score(self.choice, self.move())) # Deuxième fois
    2 Ta boucle while self.choice not in moves: ne s'exécute que la première fois puisqu'après self.choice est fixé et les trois jeux s'exécutent directement avec la première valeur.

    En virant tout ce qui ne sert à rien et en corrigeant les erreurs:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #!/usr/bin/env python3
     
    import random
     
    moves = ['rock', 'paper', 'scissors']
     
    class Player:
    	def move(self):
    		return random.choice(moves)
     
     
    def beats(one, two):
    	if 	one == two:
    		return "** GAME TIE **"	
     
    	if ((one == 'rock' and two == 'scissors') or 
    		 (one == 'scissors' and two == 'paper') or
    		 (one == 'paper' and two == 'rock')):
    		return "** PLAYER ONE WINS **"
     
    	return "** PLAYER TWO WINS **"
     
     
    class HumanPlayer(Player):
    	def __init__(self):
    		super().__init__()
    		self.choice = None
     
    	def HumanChoice(self):
    		choice = ""
    		while choice not in moves:
    			choice = input("Rock, Paper, Scissors ? ").lower()
    		self.choice = choice
    		#If input correct display it	
    		return (f"You played : {self.choice}.")
     
     
    class Game(HumanPlayer):
    	def __init__(self, p1, p2):
    		super().__init__()
    		self.p1 = p1
    		self.p2 = p2
     
    	def score(self, HumChoice, CompChoice):
    		return beats(HumChoice, CompChoice)
     
    	def play_game(self):
    		print("Game start!\n")
    		for round in range(1, 4):			
    			print(f"Round {round}:")
    			print(self.HumanChoice())
    			print(self.score(self.choice, self.move()))
    		print("Game over!")
     
    if __name__ == '__main__':
    	game = Game(Player(), Player())
    	game.play_game()
    Remarque la simplification de la fonction beats

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PythonJaune Voir le message
    Bonsoir,
    Bonsoir

    Citation Envoyé par PythonJaune Voir le message
    Je suis en train de programmer le jeu de "rock, paper, scissors" en python.
    Tu devrais le faire évoluer en "pierre/papiers/ciseaux/lézard/Spock"
    • la pierre casse les ciseaux et écrase le lézard.
    • le papier bloque la pierre et désavoue Spock
    • les ciseaux coupent le papier et décapitent le lézard
    • le lézard mange le papier et empoisonne Spock
    • Spock pulvérise la pierre et casse les ciseaux

    Nom : pierre-logo_2-300x300.jpg
Affichages : 193
Taille : 14,8 Ko
    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]

  4. #4
    Membre régulier
    Homme Profil pro
    Apprentissage python
    Inscrit en
    Novembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprentissage python

    Informations forums :
    Inscription : Novembre 2018
    Messages : 10
    Par défaut
    Merci à vous deux pour vos réponses.

    VinsS, ta réponse m'a bien empêché de finir en éternelle boucle while True, car ça faisait des lustres que j'étais bloqué dessus. :-))

    J'ai modifié mon code et ça va mieux.

    Malheureusement, je boucle à nouveau :-(. J'essaie de faire incrémenter le score, mais y a rien à faire ! ça ne bouge pas..... Ma variable "round" retourne bien ce que j'attends, ma condition if est bien posée, alors pourquoi il n'incrémentes pas ? Pourrais-tu jeter un oeil ?
    Fichiers attachés Fichiers attachés
    • Type de fichier : py cla.py (2,4 Ko, 273 affichages)

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            for round in range(3):
                print(f"Round {round}:")
                round = self.play_round()           
                if round == "** PLAYER ONE WINS":
                    player1Score += 1
                if round == "** PLAYER TWO WINS":
                    player2Score += 1
    Pas bon du tout ça.

    round est une fonction de Python, tu ne peux pas utiliser ce nom pour ton usage.

    De plus, dans cette boucle, round a deux sens différents, l'itération et le retour de play_round, comment Python fait-il pour savoir ce que tu veux ?

    Et aucune des deux conditions n'est jamais vraie parce qu'il manque les deux astérisques finales.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PythonJaune Voir le message
    Malheureusement, je boucle à nouveau :-(. J'essaie de faire incrémenter le score, mais y a rien à faire ! ça ne bouge pas..... Ma variable "round" retourne bien ce que j'attends, ma condition if est bien posée, alors pourquoi il n'incrémentes pas ? Pourrais-tu jeter un oeil ?
    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
    def play_game(self):
            print("Game start!")
            player1Score = 0    
            player2Score = 0
            for round in range(3):
                print(f"Round {round}:")
                round = self.play_round()           
                if round == "** PLAYER ONE WINS":
                    player1Score += 1
                if round == "** PLAYER TWO WINS":
                    player2Score += 1
                self.player1Score = player1Score
                self.player2Score = player2Score
                print(f"Score : Player One {self.player1Score}, Player two {self.player2Score}")
    Déjà, c'est mieux de poster le code que de nous demander de le télécharger.

    Sinon moi je suis inquiet de voir que la variable "round" récupère un résultat tandis que durant le même temps elle sert d'indice de boucle. A mon avis, comme Python n'est pas encore quantique, ça doit le faire cafouiller grave.

    Accessoirement utiliser une chaine comme flag c'est à la fois lourd et pas vraiment super évolutif. Tu renverrais "1" ou "2" en laissant à l'appelant le soin d'afficher le message tu serais plus dans une philosophie MVC.
    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]

  7. #7
    Membre régulier
    Homme Profil pro
    Apprentissage python
    Inscrit en
    Novembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprentissage python

    Informations forums :
    Inscription : Novembre 2018
    Messages : 10
    Par défaut
    En effet, le string ** .... ** n'était pas complet. C'est le signe d'une grande fatigue. Ca fonctionne à présent mais je vais faire un bon break histoire de me rafraichir les neuronnes.

    Merci VinsS

Discussions similaires

  1. la fonction size d'une liste ne retourne pas un entier
    Par cyclopsnet dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 27/07/2009, 18h50
  2. DLL:exporter une fonction qui retourne un pointeur
    Par ephemeride dans le forum C++
    Réponses: 2
    Dernier message: 29/09/2006, 11h42
  3. Fonction ne retournant pas toujours une valeur
    Par mastochard dans le forum C
    Réponses: 14
    Dernier message: 25/05/2006, 12h13
  4. Réponses: 7
    Dernier message: 03/12/2004, 12h40
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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