剪刀石头布

时间:2013-02-15 09:31:17

标签: python

我对我的comp sci课程进行了测试,其中一个问题是制作一个石头剪刀游戏,如果玩家1赢了它将返回-1,如果玩家2赢了它将返回1并且如果它是一个领带它会返回0.我制作了我的程序并运行它并且它有效但据我的教授说他没有。

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

我没看到它有什么问题?如果你做rps('R','P')那么它将返回-1,因为x = player1并且因为Rock击败Paper。任何人都可以帮我看看我的代码是否错误?

5 个答案:

答案 0 :(得分:3)

您的代码中存在一些问题:

1。 以下几行不做任何事情。您设置字符R不能大于字符S

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

2。 第1部分的原因,您的if x>y:没有按照您的想法执行。它只是检查x的内容是否在字母表中y的内容之前。 (假设xy的内容是字符)


你的代码很难解决,我建议你从一个非常不同的角度解决这个问题。

这是一个完全不同于你的解决方案,但这个解决方案有效。它只是使用许多if检查来获得结果。

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

我将x, y替换为p1, p2,因为它们更好地代表了玩家的选择,但如果您必须使用xy,只需将其更改回来。

答案 1 :(得分:3)

您可以执行以下操作:

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]

答案 2 :(得分:3)

你问:

  

任何人都可以帮我看看我的代码是否错误?

是的,这是错的。这就是原因。

如果你运行rps('R','S'),你应该得到1,因为摇滚乐会打败。同样地rps('R','P')也应该-1,因为纸张会摇滚。这些都适用于您的代码。

但是,如果你运行rps('S','P'),你应该得到1,因为剪刀击败纸张,但你没有 - 你的代码返回-1,这是错误的。

正如eumiro在评论中指出的那样,三行

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

我认为你认为是定义了要使用的顺序,实际上并没有做任何事情。

答案 3 :(得分:1)

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

或者,如果您想要一个互动节目:

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

答案 4 :(得分:0)

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)

打印

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