2011-09-10 8 views
0

Je suis actuellement en train de coder un petit jeu de roche, de papier, de ciseaux en Python, mais j'ai l'impression d'avoir trébuché sur un problème. Le jeu fonctionne, même si le code est un peu approximatif, mais j'ai essayé de faire en sorte que le programme informe le joueur qu'il a fait une erreur, et quand je le mets à l'essai, il informe le joueur qu'il a fait une erreur. ils n'ont pas. Voici le bloc de code qui est mon problème, ce n'est pas tout le jeu.Problème avec un jeu de roche, papier, ciseaux en Python

def game(self): 

    print "This is rock, paper, scissors!" 

    rps = ('rock', 'paper', 'scissors') 

    comp1 = raw_input("Rock, paper or scissors?\n> ") 
    comp2 = random.choice(rps) 

    if comp1 == 'rock' and comp2 == 'scissors' or comp1 == 'scissors' and comp2 == 'paper' or comp1 == 'paper' and comp2 == 'rock': 
     print "You won! The computer chose %s" % comp2 
     return "game" 
    elif comp1 == 'rock' and comp2 == 'rock': 
     print "In a stalemate, there are no winners, only losers :)\nThe computer also chose %s" % comp2 
     return "game" 
    elif comp1 == 'scissors' and comp2 == 'scissors': 
     print "In a stalemate, there are no winners, only losers :)\nThe computer also chose %s" % comp2 
     return "game" 
    elif comp1 == 'paper' and comp2 == 'paper': 
     print "In a stalemate, there are no winners, only losers :)\nThe computer also chose %s" % comp2 
     return "game" 
    elif comp1 != 'rock' or 'scissors' or 'paper': 
     print "Try choosing between rock, paper and scissors next time. It might help. 
     return "game" 
    else: 
     print "The computer %s. You have failed. Problem?" % comp2 
     return "game" 
+0

Sur mon téléphone, mais essayez de lancer comp1 en minuscules. Vous pouvez également simplifier la logique par comp1 == comp2 pour l'impasse – billinkc

+0

Vous n'avez pas copié le code réel puisque ce que vous avez copié contient des littéraux de chaîne non valides. –

+0

Pourquoi renvoyez-vous toujours la chaîne "jeu", cela semble étrange ... Probablement n'a rien à voir avec votre problème. –

Répondre

9

changement

elif comp1 != 'rock' or 'scissors' or 'paper': 

à

elif comp1 not in rps: 

Que faisiez-vous avant était équivalent à:

elif (comp1 != 'rock') or 'scissors' or 'paper': 

Alors, pourquoi était la condition toujours remplie?

Regardez de plus près la pièce or 'scissors' or 'paper'.

1) En Python, les chaînes non vides sont traitées comme True et les chaînes vides sont traitées comme False. Jetez un oeil à cette session interactive:

>>> bool('') 
False 
>>> bool('a') 
True 

2) également en Python, if déclarations sans une comparaison (par exemple if var1:) sont inexplicity vérifier si l'expression est vraie. Ainsi,

if var1: 

est le même que

if var1 == True: 

Si vous combinez ces deux idées:

if 'rock': 
    # Always executed 
if '': 
    # Never executed 

Retour à l'original si la déclaration:

elif comp1 != 'rock' or 'scissors' or 'paper': 

deux 'ciseaux' et 'papier' reviendront toujours Vrai, Les instructions contenues seront donc toujours évaluées.

Alors, quel est l'opérateur "in"?

L'opérateur in en elif comp1 not in rps: verra si le contenu de comp1 est un élément dans le tuple rps (qui est égal à ('rock', 'paper', 'scissors')). Le not en face de lui annulera, en vérifiant si le contenu de comp1 est un élément dans le tuple rps. Par conséquent, les instructions contenues ne seront exécutées que si l'entrée utilisateur stockée dans comp1 n'est pas valide.

2

Il devrait être

comp1 not in ['rock', 'scissors', 'paper'] 

'ciseaux' et 'papier' évaluer toujours vrai (ou en cas de or se)

comp1 != 'rock' or 'scissors' or 'paper' 

Aussi, utilisez comp1 == comp2, il est beaucoup plus simple, .

+1

utiliser le monde plus simple, c'est beaucoup plus simple. : P –

1

Le problème est avec votre logique ici elif comp1 != 'rock' or 'scissors' or 'paper':. Les chaînes «ciseaux» et «papier» sont évaluées à une valeur booléenne, ce qui est vrai car elles ne sont pas nulles.

Qu'est-ce que vous voulez est elif comp1 != 'rock' and comp1 != 'scissors' and comp1 != 'paper': ou depuis que vous l'avez déjà dans le rps tuple, vous pouvez le faire elif comp1 not in rps:

0

Je pense que cela est un peu plus la version nettoyée, mais pas la meilleure mise en œuvre. J'ai également ajouté une option pour continuer à jouer, et l'ai modifiée pour que l'entrée de l'utilisateur soit insensible à la casse.

def game(): 
    import random 
    import string 
    print "This is rock, paper, scissors!" 

    rps = ('rock', 'paper', 'scissors') 

    comp1 = raw_input("Rock, paper or scissors? ") 
    comp1 = comp1.lower() 
    comp2 = random.choice(rps) 

    if comp1 == 'rock' and comp2 == 'scissors' or comp1 == 'scissors' and comp2 == 'paper' or comp1 == 'paper' and comp2 == 'rock': 
     print "You won! The computer chose %s" % comp2 
    elif comp1 == comp2: 
     print "In a stalemate, there are no winners, only losers :)\nThe computer also chose %s" % comp2 
    elif comp1 not in rps: 
     print "Try choosing between rock, paper and scissors next time. It might help." 
    else: 
     print "The computer chose %s. You have failed. Problem?" % comp2 
    new_game = raw_input('Would you like to play again? ') 
    new_game = new_game.lower() 
    if new_game == 'yes': 
     game() 
Questions connexes