2013-05-21 2 views
1

J'essaie d'implémenter une fonction qui prend un entier n et simule n ronds de Rock, Paper, Scissors entre les joueurs Player 1 et Player 2. Le joueur qui gagne le plus de rounds gagne le jeu n-rond, avec des liens possibles. La fonction devrait imprimer le résultat du jeu comme indiqué.Simuler plusieurs tours de roche, de papier et de ciseaux

>>> simul(1) 
    Player 1 
    >>> simul(1) 
    Tie 
    >>>simul(100) 
    Player 2 

Je pense que je dois aborder cela de façon modulaire. En d'autres termes, j'ai besoin de combiner au moins 2 fonctions, mon problème est que je n'arrive pas à comprendre comment faire cela. Comment puis-je activer le résultat d'une fonction intégrée lors de l'appel de la fonction simul()?

J'ai donc créé une fonction qui simule le jeu Rock, Paper, Scissors en exécutant la fonction rps(p1, p2). Le code est le suivant:

def rps(p1,p2): 
     #tie 
     if (p1==p2): 
      return 0 
     # player 1 wins  
     elif p1+p2 in ['PR','RS','SP']: 
      return -1 
     else: 
      return 1 
     # player 2 wins 

C'est où je suis un peu coincé. J'ai besoin d'activer cette fonction lors de l'exécution de la fonction simul() - comment puis-je faire cela? Ce que j'ai jusqu'ici est le suivant:

def rps(p1,p2): 
    #tie 
     if (p1==p2): 
      return 0 
    # player 1 wins  
     elif p1+p2 in ['PR','RS','SP']: 
      return -1 
     else: 
      return 1 
    # player 2 wins 

    def choose_rps(): 
     import random 
     random.choice('RPS') 

    def simul(n): 
     p1_wins, p2_wins = 0, 0 
     for i in range(n): 
      p1 = choose_rps() 
      p2 = choose_rps() 
      result = rps(p1, p2) 
      if result == -1: 
       p1_wins += 1 
      elif result == 1: 
       p2_wins += 1 
      if p1_wins > p2_wins: 
       return 'Player 1' 
      elif p1_wins == p2_wins: 
       return 'Tie' 
      else: 
       return 'Player 2' 

Répondre

5

Pour "activer" une fonction, il suffit de l'appeler. Par exemple:

def simul(n): 
    score = 0 
    for i in range(n): 
     p1 = choose_rps() 
     p2 = choose_rps() 
     result = rps(p1, p2) 
     score += result 
    if score < 0: 
     print('Player 1') 
    elif score == 0: 
     print('Tie') 
    else: 
     print('Player 2') 

Bien sûr, vous devez écrire la fonction choose_rps (qui randomly chooses et retourne l'un des R, P ou S), mais, comme vous pouvez le voir, vous appelez simplement la même manière que la rps fonction.


Pour mettre tout cela ensemble dans un script:

def rps(p1, p2): 
    # ... your code here 

def choose_rps(): 
    # implement this here 

def simul(n): 
    # code from above 

Et alors vous voudrez probablement quelque chose à conduire, comme ceci:

if __name__ == '__main__': 
    import sys 
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 5 
    simul(n) 

... ou ...

while True: 
    n = int(input('How many trials?')) # raw_input for Python 2.x 
    simul(n) 

Si vous le souhaitez, vous pouvez simplifier cela davantage. Par exemple, vous pouvez activer la boucle entière en un appel sum avec une expression de générateur:

def simul(n): 
    score = sum(rps(choose_rps(), choose_rps()) for _ in range(n)) 
+0

Merci, mais comment puis-je fusionner les deux fonctions Code sage - autrement dit, comment puis-je écrire les fonctions en un seul code? RPS doit être le premier droit? – Snarre

+0

hmm, je gues je n'ai jamais vu une fonction de choix :) – Snarre

+0

@Snarre: Laissez-moi éditer la réponse pour traiter votre première question. Mais vraiment, cela devrait être couvert dans n'importe quel tutoriel ou classe vous avez assez loin pour écrire tout cela ... – abarnert

0

est ici une fonction équivalente, sans le récit RPS:

import random 

def simul(n): 
    score = sum([random.choice([-1, 0, 1]) for i in xrange(n)]) 
    winner_idx = 0 if score > 0 \ 
      else 1 if score < 0 \ 
      else 2 
    print ['Player 1', 'Player 2', 'Tie'][winner_idx] 

Voici celui qui suit l'histoire et est étendu à roche, papier, ciseaux, lézard, Spock:

import random 

def rand_RPSLK(): 
    while True: 
     yield random.choice('PSKLR') 

def simul(n): 
    p1 = rand_RPSLK() 
    p2 = rand_RPSLK() 
    choice = lambda px: 'PSKLR'.index(next(px)) 
    score = sum([[0,1,-1,1,-1][choice(p1)-choice(p2)] for i in xrange(n)]) 
    winner_idx = 0 if score > 0 \ 
      else 1 if score < 0 \ 
      else 2 
    print ['Player 1', 'Player 2', 'Tie'][winner_idx] 
+0

Il manque le bit crucial de la simulation de la fonction 'rps'. Bien sûr, vous savez que ce jeu a une chance égale de gagner/dessiner/perdre, mais tout l'intérêt de simuler des jeux est quand vous ne le savez pas. Ou, si vous voulez ignorer cela, pourquoi même prendre la peine de résumer n jeux, quand vous pouvez simplement calculer le résultat avec un seul appel à 'random '? – abarnert

+0

Plus d'un jeu dans une série n'a pas une chance égale de gagner, de perdre ou de tirer. Win ou Loose sont égaux, mais le lien devient plus faible lorsque le n augmente, c'est pourquoi la somme est nécessaire. Voir combien de fois n = 1000 résultats en cravate. Ce programme fournit exactement le même comportement de sortie statistique que la version plus complexe qui est construite pour modéliser le récit. – dansalmo

+0

Qui a dit quoi que ce soit à propos d'une série N-jeu ayant une distribution égale? Il est trivial de _calculer_ la distribution donnée par N, puis de faire un seul appel à random.random. – abarnert

Questions connexes