Jeremy B
Jeremy B

Reputation: 863

Rock Paper Scissors in Python

I am trying to write a Python program and I am having a hard time getting my score. I have written it as a value returning function and every time I run the program it seems to skip the step where it retrieves the score unless I include an else statement which it will automatcially jump the the else statement. I will attach the full code below. Thank you very much for any help, I'm greatful! This is also my first time posting in this forum I apologize if I screw something up.

#constants
Rock = 1
Paper = 2
Scissors = 3

#Define the main function
def main():

    #set control loop
    keep_going = 'Y'


    #set counter to zero
    computer_wins = 0
    player_wins = 0
    tie_score = 0

    #call display message
    display_message()

    while keep_going == 'y' or keep_going == 'Y':

        play_game()


        #prompt user to keep going
        keep_going = input('would you like to play again? (Y for Yes): ')

    print('The computer won', computer_wins, 'times')
    print('The player won', player_wins, 'times')
    print('There were', tie_score, 'tie scores')

def play_game():

    #get random input
    computer = get_random()

    #get the players input
    play = get_play()

    #validate input
    if play == '1' or play == '2' or play == '3':
        play == True
    else:
        play == False
        print('Error: Invalid Entry')
        play = input('Please enter 1 for Rock, 2 for Paper, or 3 for Scissors: ')

    if play == computer:
        print('Tie Score, Please try again')
        tie_score += 1

    else:
        get_score(computer, play)

    print('The computer chose:', computer)
    print('The player chose: ', play)


#define display message
def display_message():
    print('Welcome to Rock Paper Scissors, a game of chance to see who will')
    print('outsmart the other. This game is Man VS Computer.')
    print('The program will select a random integer and then ask you for an integer')
    print('1 for Rock 2 for paper or 3 for Scissors. The program will then tell')
    print('you who won the game.')
    print('GOOD LUCK!')
    print
    print

def get_random():
    import random

    #generate random int
    computer = random.randint(1, 3)
    return computer


def get_play():
    #prompt user to enter an integer 1, 2, or 3
    play = input('Select 1 for Rock, 2 for Paper, or 3 for Scissors: ')
    return play

def get_score(computer, play):

    if computer == 1 and play == 2:
        score = 'player wins'
        print('Paper covers Rock, Player Wins')
        #player wins
        player_wins += 1

    elif computer == 1 and play == 3:
        score = 'computer wins'
        print('Scissors cut Paper, Computer Wins')
        #computer wins
        computer_wins += 1


    elif computer == 2 and play == 1:
        score = 'computer wins'
        print('Paper covers Rock, Computer Wins')
        #computer wins
        computer_wins += 1

    elif computer == 2 and play == 3:
        score = 'player wins'
        print('Scissors cut Paper, Player Wins')
        #player wins
        player_wins += 1


    elif computer == 3 and play == 1:
        score = 'player wins'
        print('Rock smashes Scissors, Player Wins')
        #player wins
        player_wins += 1

    elif computer == 3 and play == 2:
        score = 'computer wins'
        print('Scissors cut Paper, Computer Wins')
        #computer wins
        computer_wins += 1


#call main function
main()

Upvotes: 4

Views: 29490

Answers (10)

Sunil Soni
Sunil Soni

Reputation: 11

import random
lst=['rock','scisor','paper']
player_score=0
comp_score=0
print('''Welcome to the game of our childhood Rock, Paper and scisor.
play this game against the computer.You must input the 
rock,paper,scisor .So let's start the game.''')

def new_game():       
    user_input=input("START A NEW GAME![Y/N]: \n")
    if user_input.upper()=="Y":
        global player_score
        player_score=0
        global comp_score
        comp_score=0
        RPS_game()
    else:
        print("Have a great day ahead!\n") 



def again():
    user_input=input("WANNA PLAY AGAIN![Y/N]: \n")
    if user_input.upper()=="Y":
        RPS_game()
    else:        
        print("YOUR FINAL SCORE: ",player_score)
        print("COMPUTER'S FINAL CORE: ",comp_score)
        if comp_score>player_score:
            print("OOPS!YOU LOOSE THE GAME\n")
            new_game()
                      
        elif comp_score<player_score:
            print("GREAT! YOU WON THE GAME\n")
            new_game()
        else:
            print("IT'S A DRAW!\n")   
            new_game()
   

def RPS_game():
    comp_move=random.choice(lst)

    player_move=input("Enter your move: ")
    if player_move=='rock' or player_move=='paper' or player_move=='scisor':

        print("Computers Move:",comp_move)
        if player_move=="rock":
            if comp_move=="scisor":          
                print("YOU WON!")
                global player_score
                player_score=player_score+1          
            elif comp_move=="paper":
                print("YOU lOOSE!")
                global comp_score
                comp_score=comp_score+1
            elif comp_move=="rock":
                print("TRY AGAIN!")
        elif player_move=="paper":
            if comp_move=="paper":
                print("TRY AGAIN!")
            elif comp_move=="scisor":
                print("YOU lOOSE!")
                comp_score=comp_score+1
            elif comp_move=="rock":
                print("YOU WON!")
                player_score+=1
        elif player_move=="scisor":
            if comp_move=="paper":
                print("YOU WON!")
                player_score+=1
            elif comp_move=="scisor":
                print("TRY AGAIN!")
            elif comp_move=="rock":
                print("YOU LOOSE!")
                comp_score=comp_score+1
        
        again()
    else:
        print('''Enter correct spellings !
as "rock,paper,scisor"''' )
        RPS_game()


RPS_game()

Upvotes: 0

ult
ult

Reputation: 11

well... I would use a dictionary. If/elif/else statements work fine, but they are often messy. This is how I would approach it.

By the way, I am using Python 2. It seems like you are using Python 3 based on the way you use print and input. Don't copy off this code; just take the idea. I am using Python 2 because I am more comfortable with it; make the changes from both versions.

# Imports
import random

# Constants
SELECTION = ["rock", "paper", "scissors"]
WIN = -1 # This is a dummy assignment: we will return this value later.
WIN_LOSE_DICT = {("rock", "paper"): False,
                 ("paper", "rock"): True,
                 ("paper", "scissors"): False,
                 ("scissors", "paper"): True,
                 ("scissors", "rock"): False,
                 ("rock", "scissors"): True}

# Variables
total_wins = 0

# Functions
def do_round():
    comp = random.choice(SELECTION)
    player = raw_input("Rock, paper, scissors, SHOOT! ").lower() # Set player response 
# to lowercase
    # Use input() on Python 3 and not raw_input()
    while player not in SELECTION:
        player = raw_input("Please choose either rock, paper, or scissors. ").lower()
    if player == comp:
        print "The computer chose %s: it is a tie." % comp
    else:
        result = WIN_LOSE_DICT[(player, comp)]
        if result: # If you want to be clear, do - if result == True:
            print "The computer chose %s: you win!" % comp
            return WIN
        else:
            print "The computer chose %s: you lose" % comp

# Main
if __name__ == "__main__":
    running = True
    while running:
        this_round = do_round()
        if this_round == WIN:
            total_wins += 1
        print "You won %s times so far." % total_wins
        continue_ = raw_input("Do you want to play another round (y/n) ?").lower()
        if continue_ == "n":
            continue
        else:
            running = False

print "Thank you for playing!"

I might have made a few mistakes here and there, but the concept is still there: use a dictionary and set a constant to be a negative number. You should also work on following PEP8 a bit more.

Upvotes: 0

dansalmo
dansalmo

Reputation: 11686

Yet another way, adding Lizard and Spock

import random

def winner(p1, p2):
    actors = ['Paper', 'Scissors', 'Spock', 'Lizard', 'Rock']
    verbs = {'RoLi':'crushes', 'RoSc':'breaks', 'LiSp':'poisons',
             'LiPa':'eats', 'SpSc':'smashes', 'SpRo':'vaporizes', 
             'ScPa':'cut', 'ScLi':'decapitate', 'PaRo':'covers', 
             'PaSp':'disproves'}
    p1, p2 = actors.index(p1), actors.index(p2)
    winner, looser = [(p1, p2), (p1, p2), (p2, p1), (p1, p2), (p2, p1)][p1 - p2]
    return ' '.join([actors[winner],
                     verbs.get(actors[winner][0:2] + actors[looser][0:2],
                               'ties'),
                     actors[looser]])

more = True
while more:
    z=random.randint(0,4);
    a=int(input('1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->'))-1;
    if a==z:
        print 'Tie\n';
    else:
        try:
            print winner(a,z) + '\n'
        except IndexError:
            more = False

print ('Thanks for playing the game')

Output:

1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->1
Rock crushes Lizard

1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->2
Paper covers Rock

1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->3
Scissors tie Scissors

1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->4
Lizard poisons Spock

Upvotes: 0

user1883616
user1883616

Reputation: 15

Another way of making Rock, Paper, Scissors but without looping is this...

import random
Rock = '1'
Paper = '2'
Scissors = '3'
print('Welcome to Rock, Paper Scissors! The game of all kids to decide on something. \nIn this game you will have to beat the computer once. \n(Psst if it\'s a draw the start the program again! ;D)\nSo how to play. Well, it\'s simple. Pick 1 for Rock, 2 for Paper and 3 for Scissors. \nSo Rock beats Scissors. Scissors cuts Paper and Paper covers Rock. Got it Lets play')
player=int(input('Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: '))
if player<1 or player>3:
   player=int(input('Invalid number. Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: '))
   if player<1 or player>3:
   print('Well, now you can\'t play this game because you are mucking around. Next time DON\'T!')
else:
   computer=random.randint(1, 3)
   print(player,computer)
   print('Remember Rock = 1, Paper = 2 and Scissors = 3')
   if player==1 and computer==1 or player==2 and computer==2 or player==3 and computer==3:
       print('It\'s a draw. =l Restart the game if you want to.')
   if player==1 and computer==2 or player==2 and computer==3 or player==3 and computer==1:
       print('Computer wins! You lose. Sorry. =(')
   if player==1 and computer==3 or player==2 and computer==1 or player==3 and computer==2:
       print('You have won. Well done. =D')

If that is any help.

Upvotes: 0

P&#39;sao
P&#39;sao

Reputation: 2996

Here is another way to do it:

import random;

print ('Game of chance 1=Rock,2=Paper,3=Scissor');
print ('Type 9 to exit');
while 1:
    z=random.randint(1,3);
    a=int(input('1=Rock,2=Paper,3=Scissor:--->'));
    if a==z:
        print ('Tie!!!');

    if a==1 and z==2:
        print ('Rock covers paper So You Win!!!');

    if a==2 and z==3:
        print ('Scissor cuts paper so you loose :(');

    if a==2 and z==1:
        print ('Rock covers paper so you loose :(');

    if a==3 and z==2:
        print ('Scissor cuts paper So You Win!!!');

    if a==9:
        break

print ('Thanks for playing the game')

Upvotes: 0

Niklas R
Niklas R

Reputation: 16870

This code might be a good reference for you. :)
Good Luck !
Note that this is Py2.x code

# Author: Niklas Rosenstein
# Created: 2011/10/23

import sys
import random

PAPER = 0
ROCK = 1
SCISSOR = 2

WIN = 10
LOSS = 11
TIE = 12

TABLE = {
    PAPER: 'Paper',
    ROCK: 'Rock',
    SCISSOR: 'Scissor',
}
if 'expand TABLE':
    # just for overvieability
    # expands the TABLE conveniently

    tableExpand = [
        (PAPER,('paper', 'p', '0')),
        (ROCK, ('rock', 'r', 'stone', '1')),
        (SCISSOR, ('scissor', 's', '2'))
    ]
    exp = None
    key = None
    for exp in tableExpand:
        for key in exp[1]:
            TABLE[key] = exp[0]
    del tableExpand, exp, key

class Game(object):

    wins = 0
    losses = 0
    ties = 0

    def evaluateInput(self, inp):
        # evaluate the input
        # raises ValueError if input is invalid

        # lowercase the string
        inp = inp.strip()
        inp = inp.lower()

        # comparison table
        try:
            return TABLE[inp]
        except KeyError:
            raise ValueError, 'Input is invalid.'

    def choose(self, choice):
        # make a choice and compare it with
        # the computers choice

        # check if the choice is correct
        if choice not in [ROCK, PAPER, SCISSOR]:
            raise ValueError, 'Expected Id of either ROCK, PAPER or SCISSOR'

        # generate a choice for the computer
        com = random.choice([ROCK, PAPER, SCISSOR])

        result = choice - com
        if result == 0:
            self.ties += 1
            return TIE, com
        elif result < 0:
            self.wins += 1
            return WIN, com
        else:
            self.losses += 1
            return LOSS, com

TEXT_CHOOSE             = 'Choose (or "quit" to quit):   '
TEXT_PLAYER_CHOOSE      = "You've choosen:              "
TEXT_COMPUTER_CHOOSE    = 'The computer choosed:        '
TEXT_CHOICE_INVALID     = 'You choice is invalid.\n'
TEXT_WIN                = "You've won this match."
TEXT_LOSS               = "You've lost this match."
TEXT_TIE                = "This match was tie."
TEXT_GOODBYE            = "Thanks for playing."
TEXT_WELCOME            = "Welcome to Rock-Paper-Scissor !\n" \
                          "This game is all about guessing. Try to choose the\n" \
                          "thing that beats the computers choice. Thereby, the\n" \
                          "following rules are importan:\n" \
                          "    Paper beats Rock.\n" \
                          "    Rock beats Scissor.\n" \
                          "    Scissor beats Paper.\n" \
                          "\n" \
                          "Valid inputs are:\n\n" \
                          "   | for Paper:          | p | paper   |   -   | 0 |\n" \
                          "   | for Rock:           | r | rock    | stone | 1 |\n" \
                          "   | for Scissor:        | s | scissor |   -   | 2 |\n" \
                          "   | To quit the game:   | q | quit    |   -   | - |\n" \
                          "\n" \
                          "Much fun whishes you: Niklas Rosenstein (2011)\n" \
                       + ("-" * 50) + "\n"

def printScores(g):
    print "Scores:"
    print "    Wins:     %s" % g.wins
    print "    Losses:   %s" % g.losses
    print "    Ties:     %s" % g.ties

def main():

    g = Game()

    # play the game ;-)
    print TEXT_WELCOME
    while True:
        inp = raw_input(TEXT_CHOOSE)

        if inp.lower() in ('q', 'quit'):
            break

        try:
            inp = g.evaluateInput(inp)
        except ValueError:
            print TEXT_CHOICE_INVALID
            continue

        t, com = g.choose(inp)

        inp = TABLE[inp]
        com = TABLE[com]

        print TEXT_PLAYER_CHOOSE, inp
        print TEXT_COMPUTER_CHOOSE, com
        print 
        if t == WIN:
            print inp, "beats", com + ".",
            print TEXT_WIN
        elif t == LOSS:
            print com, "beats", inp + ".",
            print TEXT_LOSS
        else:
            print inp, "euqals", com + ".",
            print TEXT_TIE
        print
        printScores(g)
        print "-" * 50
        print

    print TEXT_GOODBYE
    printScores(g)
    print

    print "Press any key to exit."
    sys.stdin.read(1)

main()

Upvotes: 0

jfs
jfs

Reputation: 414395

Here's another variant that works both in Python 2.x and 3.x:

try: input = raw_input
except NameError: input = input # py3k

import random
import sys
import textwrap
from collections import namedtuple

ROCK, PAPER, SCISSORS = ROCK_PAPER_SCISSORS = range(1, 4)
NAME = dict(zip(ROCK_PAPER_SCISSORS, "Rock Paper Scissors".split()))

Score = namedtuple('Score', 'win verb')
GAME_MATRIX = { # who wins and who does what
    (PAPER, ROCK):     Score(win=True, verb='covers'),
    (SCISSORS, PAPER): Score(win=True, verb='cut'),
    (ROCK, SCISSORS):  Score(win=True, verb='smashes'),
}
GAME_MATRIX.update(dict(((second, first), Score(not win, verb))
                   for (first,second), (win,verb) in GAME_MATRIX.items()))

def main():
    # keep scores: how many times computer, player win and number of ties
    scores = dict(zip("computer player tie".split(), [0]*3))

    display_welcome_message()

    # set control loop
    keep_going = 'Y'
    while keep_going.upper() == 'Y':
        try: play_game(scores)
        except Exception as e:
            print("Error: %s" % (e,))
            sys.exit(1)

        # prompt player to keep going
        keep_going = input('Would you like to play again? (Y for Yes): ')

    print('\nThe computer won {computer} times\n'
          'The player won {player} times\n'
          'There were {tie} tie scores'.format(**scores))

def play_game(scores):
    # get players choices for this round
    computer_choice = random.choice(ROCK_PAPER_SCISSORS)
    player_choice = get_player_input()

    # print choices
    for player, choice in [('computer', computer_choice),
                           ('player', player_choice)]:
        print('The {0} chose: {1} ({2})'.format(player, NAME[choice], choice))

    # update scores; print who wins
    if player_choice == computer_choice:
        scores['tie'] += 1
        print('Tie Score, Please try again')
    else:
        score = GAME_MATRIX[computer_choice, player_choice]
        if score.win: # computer wins
            scores['computer'] += 1
            template = '{first} {verb} {second}, Computer wins'
        else: # player wins
            scores['player'] += 1
            template = '{second} {verb} {first}, Player wins'
        print(template.format(first=NAME[computer_choice], 
                              second=NAME[player_choice], verb=score.verb))

def display_welcome_message():
    print(textwrap.fill(textwrap.dedent("""
        Welcome to Rock Paper Scissors, a game of chance to see who
        will outsmart the other. This game is Man VS Computer.  The
        program will select a random integer and then ask you to input
        %s for Rock %s for Paper or %s for Scissors. The program will
        then tell you who won the game. GOOD LUCK!
    """ % tuple(ROCK_PAPER_SCISSORS))))

def get_player_input(ntries=10):
    for _ in range(ntries):
        try: 
            choice = int(input('\nSelect %s for Rock, %s for Paper, or '
                '%s for Scissors: ' % tuple(ROCK_PAPER_SCISSORS)))
        except ValueError:
            pass
        else: 
            if choice in ROCK_PAPER_SCISSORS:
                return choice # success
        print('Error: your choice must be one of: %s' % (
                ', '.join(map(str, ROCK_PAPER_SCISSORS))))
    raise RuntimeError('failed to get player choice in %d tries' % ntries)

if __name__=="__main__":
    main()

Upvotes: 0

dkamins
dkamins

Reputation: 21918

I answered your question separately, but just for fun here's a little working Rock, Paper, Scissors game to look at. This one is for Python 2.x and probably won't work in Python 3, but it might be helpful for you or somebody in the future searching for this.

# "Rock, Paper, Scissors" demo for Python 2.x
# by Dan Kamins

import random

ROCK = 1
PAPER = 2
SCISSORS = 3

NAMES = { ROCK: 'Rock', PAPER: 'Paper', SCISSORS: 'Scissors' }
WHAT_BEATS_WHAT = { ROCK: SCISSORS, PAPER: ROCK, SCISSORS: PAPER }
WIN_ACTIONS = { ROCK: 'crushes', PAPER: 'smothers', SCISSORS: 'cuts' }

score_player = 0
score_computer = 0
score_ties = 0

def main():
    intro()
    while main_loop():
        pass
    summary()

def intro():
    print "Welcome to Rock, Paper, Scissors!"

def main_loop():
    player = get_player_input()
    computer = random.randint(1, 3)
    check_result(player, computer)
    return ask_play_again()

def check_result(player, computer):
    global score_player, score_computer, score_ties
    if player == computer:
        print "Tie!  Computer also chose {0}.".format(NAMES[computer])
        score_ties += 1
    else:
        if WHAT_BEATS_WHAT[player] == computer:
            print "Your massive {0} {1} the computer's {2}!".format(
                NAMES[player], WIN_ACTIONS[player], NAMES[computer])
            score_player += 1
        else:
            print "The computer's {0} {1} your pathetic {2}!".format(
                NAMES[computer], WIN_ACTIONS[computer], NAMES[player])
            score_computer += 1

def ask_play_again():
    again = raw_input("Enter Y to play again: ")
    return again in ('y', 'Y')

def get_player_input():
    while True:
        print
        player = raw_input("Enter 1 for Rock 2 for paper or 3 for Scissors: ")
        try:
            player = int(player)
            if player in (1,2,3):
                return player
        except ValueError:
            pass
        print "Please enter a number from 1 to 3."

def summary():
    global score_player, score_computer, score_ties
    print "Thanks for playing."
    print "Player won: ", score_player
    print "Computer won: ", score_computer
    print "Ties: ", score_ties

if __name__ == '__main__':
    main()

Upvotes: 3

dkamins
dkamins

Reputation: 21918

There's so much wrong with this, it's hard to know where to start (but don't get discouraged)...

First of all, it looks like (mostly from your use of input vs. raw_input and your parens with your print statements) you're using Python 3, which already is going to limit the amount of help you get. Most people are still using Python 2.6 or 2.7. But with that out of the way...

The main remaining issues addressing your question are:

First: you're using strings for player input (e.g. '1', '2', '3'), and numbers for computer choice (e.g. 1, 2, 3). So you need to compare them as such. In other words, instead of:

if computer == 1 and play == 2:

You would need to say:

if computer == 1 and play == '2':

Second: you're trying to reference one function's variables in another one, and that won't work. If you want your computer_wins, etc. variables to be global, you need to initialize them at the global scope, e.g. right after your "#constants" are declared and before you get into main. Then in any function that uses them, you must say e.g. global computer_wins to indicate they are global and not local.

Once you get these issues addressed, it should work a bit better, but you'll still need to do a lot of cleanup and keep working on it!

Keep at it, and soon it will be natural for you.

Upvotes: 7

jb.
jb.

Reputation: 10341

A couple quick notes from quickly skimming the code:

In get_score() you could add an else clause to handle any ties that happen and you wouldn't have to check for it explicitly in play_game()

Move the import random to the top of the file. imports are generally always found at the top of the file. Also, there's no need to re-import every time you want a random number.

Not sure if this is a typo, cause play seems to always hold an integer, but you have play == True and play == False inside play_game(). If you want to make play contain either True or False, you need to be using a single equals sign, eg, play = True. But this doesn't seem to make sense because you're comparing play to computer as if they're integers.

Also, what are you trying to accomplish with the score variable in the get_score() method?

Ah, if you made the get_score() method return something so you know who won the match it would be helpful. You can't access computer_wins or player_wins inside the get_score() method because they were defined inside main(). A simple way to do this is return an int from get_score(). here is a rather C-style way of handling it (returning -1/0/1). something like (pseudo code):

def get_score():
  score = 0
  if computer wins:
      score = -1
  elif player wins:
      score = 1

  return score


winner = get_score()
if winner == 0:
    print 'tie game'
elif winner == 1
    print 'the player won'
else:
    print 'the computer won'

Upvotes: 1

Related Questions