JGrazza
JGrazza

Reputation: 75

Rock Paper Scissors

I had a test for my comp sci class and one of the questions was to make a rock paper scissors game that if player 1 won it would return -1, if player 2 won it would return 1 and if it were a tie it would return 0. I made my program and ran it and it worked but according to my professor he said it didn't.

def rps(x,y):
    player1 = -1
    player2 = 1
    tie = 0
    'R'>'S'
    'P'>'R'
    'S'>'P'
    if x>y:
        return player1
    if x<y:
        return player2
    else:
        return tie

I don't see what is wrong with it? It if you do rps('R','P') then it would return -1 because x = player1 and because Rock beats Paper. Can anyone help me to see if my code is wrong?

Upvotes: 3

Views: 1271

Answers (5)

dansalmo
dansalmo

Reputation: 11686

def rps(x,y):
    return [0, -1, 1]['RPS'.index(x) - 'RPS'.index(y)]

Or if you want an interactive program:

from random import randint
['Tie', 'I win', 'You win'][randint(0, 2) - 'RPS'.index(raw_input("Enter R, P, or S: "))]

Upvotes: 1

user2032433
user2032433

Reputation:

There are few problems in your code:

1. The following lines don't do anything. You can't set character R to be larger than character S:

'R' > 'S'
'P' > 'R'
'S' > 'P'

2. Cause of section 1, your if x>y: doesn't do what you think it does. It simply checks if content of x is before content of y in the alphabet. (Supposing contents of x and y are characters)


Your code is kinda hard to fix as it is, I would recommend you to approach this problem from a very different angle.

Here's a solution totally different from yours, but this one works. It simply uses many if checks to get to your result.

def rps(p1, p2):
    if p1 == p2:
        return 0
    elif (p1 == "R" and p2 == "S")\
    or (p1 == "S" and p2 == "P")\
    or (p1 == "P" and p2 == "R"):
        return -1
    else:
        return 1

I replaced x, y with p1, p2 since they represent players' choises better imo, but if you have to use x and y, just change them back.

Upvotes: 3

Chris Taylor
Chris Taylor

Reputation: 47392

You asked:

Can anyone help me see if my code is wrong?

Yes, it is wrong. Here's why.

If you run rps('R','S') you should get 1, because rock beats paper. Similarly rps('R','P') should give -1 because paper beats rock. Both of these work in your code.

However, if you run rps('S','P') you should get 1, because scissors beats paper, but you don't - your code returns -1, which is wrong.

As eumiro pointed out in the comments, the three lines

'R'>'S'
'P'>'R'
'S'>'P'

which I assume you think are defining the ordering to be used, don't actually do anything.

Upvotes: 3

Argeman
Argeman

Reputation: 1353

You can do following:

def rps(p1,p2):
    retval= {
        'R':{'R': 0, 'S':-1, 'P': 1},
        'S':{'R': 1, 'S': 0, 'P':-1},
        'P':{'R':-1, 'S': 1, 'P': 0}
    }
    return retval[p1][p2]

Upvotes: 3

eumiro
eumiro

Reputation: 212885

def rps(x,y):
    d = {'R': 1, 'S': 2, 'P': 3}
    return ((d[x] - d[y]) + 1) % 3 - 1


for p1 in 'RPS':
    for p2 in 'RPS':
        print p1, p2, rps(p1, p2)

prints

R R 0
R P 1
R S -1
P R -1
P P 0
P S 1
S R 1
S P -1
S S 0

Upvotes: 0

Related Questions