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

Reply via email to