Some time ago there was a post asking for help on a rock/paper/scissors game. I read that thread at the time it was posted, but since it received several answers I didn't pay too much attention to it. But I can't find that thread again right now. However, the subject stuck (loosely) in my mind, and it finally fermented enough that I wanted to try writing a version myself.
My approach is very different from the original. It is based on the fact that there are only nine possible combinations. I calculate a value based on the combination (it's effectively calculating the value of a ternary number) and use this value as an index into a tuple of Results strings and a tuple of win/lose/draw codes. Probably the least obvious and most confusing aspect is how I piece together these output strings, using the new-style print formatting syntax. The rest of the program should be pretty straight-forward. I think it's fairly well commented. Of course, I don't claim this to be optimum, or even necessarily a good approach -- but it works. And I thought some people might find it interesting look at and try. (An irrelevant side-note: I wrote it on a Raspberry Pi.) =========== <Code starts here> ========== #!/usr/bin/env python3 # rps.py -- Rock, Paper, Scissors game from random import choice WIN = 0 LOSE = 1 DRAW = 2 def get_result(h, c): """Determine who wins this round, return appropriate string and win/lose/draw code. h: Human's selection (r, p or s) c: Computer's selection (r, p or s) """ def val(c): """Convert charcter r, p or s to values 0, 1 or 2""" return 'rps'.index(c) # Strings used in results rp = 'Paper covers Rock. {}' rs = 'Rock smashes scissors. {}' ps = 'Scissors cuts paper. {}' ti = 'We both have {}. {}' # Win/lose/draw codes win = (DRAW, WIN, LOSE, LOSE, DRAW, WIN, WIN, LOSE, DRAW) # Win/lose/draw strings wins = ('You win', 'I win', "It's a draw") # Results strings res = ( ti.format('rocks', wins[DRAW]), # r-r rp.format(wins[WIN]), # r-p rs.format(wins[LOSE]), # r-s rp.format(wins[LOSE]), # p-r ti.format('paper', wins[DRAW]), # p-p ps.format(wins[WIN]), # p-s rs.format(wins[WIN]), # s-r ps.format(wins[LOSE]), # s-p ti.format('scissors', wins[DRAW]) # s-s ) score = val(h) + 3 * val(c) # Calculate score return res[score], win[score] # Result string & win code def get_rps(): """Get Rock/Paper/Scissor choice.""" while True: select = input('\nDo you choose Rock, Paper or Scissors ').lower() # Check for empty input or quit command if not select or select in ['q', 'quit']: return 'q' # Return quit code # Check for valid input if select in ['r', 'rock', 'p', 'paper', 's', 'scissors']: return select[0] # Return first character print('What did you say?? Try again please') #================= Main Program starts here ============== # Keep track of results: # scores[0] = number of human wins # scores[1] = number of computer wins # scores[2] = number of draws scores = [0] * 3 things = {'r':'a rock', 'p':'paper', 's':'scissors'} print("Let's play a game or Rock, Paper, Scissors.\n") print('Enter "r", "p", "s", "rock", "paper", or "scissors" for your choice.') print('Use empty input, "q" or "quit" to end the game.') while True: computer = choice('rps') # Computer selects human = get_rps() # Human selects if human == 'q': break print('You have {}, I have {}. '.format( things[human], things[computer]), end='') res, scr = get_result(human, computer) scores[scr] += 1 # Count win/lose/draw print(res) # And show results # Show final scores print('\nTotal scores:') print('\tYou won {} games'.format(scores[WIN])) print('\tComputer won {} games'.format(scores[LOSE])) print('\tThere were {} tie games'.format(scores[DRAW])) print('\nThanks for playing with me. Bye now.') ========== <Code ends here> ========== -=- Larry -=- -- http://mail.python.org/mailman/listinfo/python-list