2012-07-29 4 views
0

Comment puis-je comptabiliser les gains une fois la boucle terminée?Comment faire pour gagner gagne dans le jeu de papier, de rock, de ciseaux?

print 'PLAY ROCK PAPER SCISSORS' 

for roundd in range(1,6): 
    print 'Round: ' + str(roundd) 
    human = raw_input('Whats your draw: ') 
    from random import choice 
    cpu = choice(('rock', 'paper', 'scissors')) 

    if human == cpu: 
     print 'CPU: ' + cpu 
     print 'Draw' 

    if cpu == 'rock' and human == 'scissors': 
     print 'CPU: ' + cpu 
     print 'You Lose' 
    if cpu == 'scissors'and human == 'paper': 
     print 'CPU: ' + cpu 
     print 'You Lose' 
    if cpu == 'paper'and human == 'rock': 
     print 'CPU: ' + cpu 
     print 'You Lose' 

    if cpu == 'rock' and human == 'paper': 
     print 'CPU: ' + cpu 
     print 'You Win!' 
    if cpu == 'scissors'and human == 'rock': 
     print 'CPU: ' + cpu 
     print 'You Win' 
    if cpu == 'paper'and human == 'scissors': 
     print 'CPU: ' + cpu 
     print 'You Win' 
+0

En utilisant '' \\ comme ça semble mauvais et est considéré comme une mauvaise pratique selon pep8 – jamylak

+1

trop paresseux pour taper tout le code, mais juste garder un entier pour le cpu et un pour la utilisateur, et si le cpu gagne, 'cpu_score + = 1', sinon incrémenter les utilisateurs –

+1

Vous devez valider l'entrée de vos utilisateurs. À l'heure actuelle, rien d'utile ne se produit si la contribution des utilisateurs se trouve en dehors de l'ensemble de «roche, papier, ciseaux»; vous devez informer les utilisateurs (et leur permettre de sélectionner à nouveau, en leur indiquant ce qui constitue une entrée valide) s'ils vous donnent un choix inattendu. – atomicinf

Répondre

3

Vous pouvez garder une trace d'une variable wins pour les cpu et human, et incrémenter chaque fois une victoire est enregistrée. Par exemple.

human_wins = 0 
cpu_wins = 0 

for roundd in range(1,6): 
    if cpu == 'paper'and\ 
     human == 'rock': 
     cpu_wins += 1 
     print 'CPU: ' + cpu 
     print 'You Lose' 

    if cpu == 'paper'and\ 
     human == 'scissors': 
     human_wins += 1 
     print 'CPU: ' + cpu 
     print 'You Win' 
    ... 
5

La réponse de kaveman est la bonne. Je voudrais juste souligner que vous pouvez rendre votre code beaucoup plus concis en utilisant un dictionnaire et en prenant la ligne répétée print 'CPU: ' + cpu de toutes les instructions if.

Ce code vérifie également que l'entrée de l'utilisateur est valide, comme suggéré par @atomicinf. Sinon, le code que j'écrirais compterait 'lol' comme gain automatique. :) C'est ce que fait la boucle while ci-dessous: si l'utilisateur tape un mouvement invalide, il lui donne un message d'erreur et lui demande d'essayer à nouveau jusqu'à ce qu'il en valide un.

le code est ici qui fait cela et d'autres changements, avec quelques commentaires au sujet de pourquoi je l'ai fait différentes choses:

from random import choice # usually, imports go at the top; easier to manage 

print 'PLAY ROCK PAPER SCISSORS' 

# This dictionary associates a move to the move that it beats. 
beats = { 
    'rock': 'scissors', 
    'paper': 'rock', 
    'scissors': 'paper', 
} 
moves = ('rock', 'paper', 'scissors') # The tuple of all valid moves 
# could also do moves = beats.keys() 

draws = cpu_wins = human_wins = 0 # start our counter variables off at 0 

for roundd in range(1,6): 
    print 'Round: ' + str(roundd) 
    human = raw_input("What's your draw: ") 
    while human not in moves: # keep retrying if they gave a bad move... 
     print "Invalid move '%s' - expected one of %s." % (human, ', '.join(moves)) 
     # this % formatting just replaces the %s with the variable on the left 
     print "Try again!" 
     human = raw_input("What's your draw: ") 
    cpu = choice(moves) 

    print 'CPU: ' + cpu # this happens every time, no need to retype it so many times :) 

    if human == cpu: 
     print 'Draw' 
     draws += 1 
    elif human == beats[cpu]: 
     print 'You Lose' 
     cpu_wins += 1 
    else: 
     print 'You Win' 
     human_wins += 1 

# done - print out the overall record 
print "Your record: %s wins, %s losses, %s draws" % (human_wins, cpu_wins, draws) 

sens?

2

Voici une version nettoyée; peut-il être édifiant:

import random 

class RockPaperScissors(object): 
    choices = ['rock', 'paper', 'scissors'] 

    def __init__(self): 
     self.wins = 0 
     self.draws = 0 
     self.losses = 0 

    def cpu(self): 
     return random.choice(type(self).choices) 

    def human(self): 
     while True: 
      res = raw_input("What's your draw: ").strip().lower() 
      if res in type(self).choices: 
       return res 
      else: 
       print('Enter one of {}'.format(', '.join(type(self).choices))) 

    def win(self): 
     print('You win!') 
     self.wins += 1 

    def draw(self): 
     print('Draw') 
     self.draws += 1 

    def lose(self): 
     print('You lose') 
     self.losses += 1 

    def play(self): 
     """ 
     Play one hand 
     """ 
     human = self.human() 
     cpu = self.cpu() 
     print("Computer chose {}".format(cpu)) 
     val = type(self).choices.index 
     [self.draw, self.lose, self.win][(val(cpu) - val(human)) % 3]() 

def main(): 
    print('PLAY ROCK PAPER SCISSORS') 
    rps = RockPaperScissors() 

    for rnd in xrange(1,6): 
     print('Round: {}'.format(rnd)) 
     rps.play() 

    print('Final tally: {} losses, {} draws, {} wins'.format(rps.losses, rps.draws, rps.wins)) 

if __name__=="__main__": 
    main() 
+0

Vous pouvez améliorer cela en faisant de '6' dans la ligne' for rnd in xrange' une variable qui est alimentée lorsque vous appelez 'main', vous permettant de choisir le nombre de tours. – TankorSmash

+1

J'irais avec 'self.choices' plutôt qu'avec' RockPaperScissors.choices': plus concis pour taper et plus facile à sous-classer. Aussi, bien que l'indexation arithmétique modulaire soit mignonne, je ne sais pas si c'est vraiment mieux que de le dire explicitement. – Dougal

+0

@Dougal: bon point; J'ai utilisé 'type (self)' pour faire référence à la classe à la place. –

Questions connexes