3

我对我的 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。谁能帮我看看我的代码是否错误?

4

5 回答 5

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]
于 2013-02-15T09:55:34.080 回答
3

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

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

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

2.第1节的原因,你if x>y:没有做你认为它做的事情。它只是检查字母表中的内容x是否在内容之前。y(假设x和的内容y是字符)


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

这是一个与您的完全不同的解决方案,但这个解决方案有效。它只是使用许多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因为它们更能代表玩家的选择,但如果你必须使用xand y,只需将它们改回来。

于 2013-02-15T09:39:43.497 回答
3

您问:

谁能帮我看看我的代码是否错误?

是的,这是错误的。这就是为什么。

如果你跑步rps('R','S'),你应该得到1,因为摇滚胜过纸。同样rps('R','P')应该给出-1,因为纸能打败岩石。这两种方法都适用于您的代码。

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

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

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

我假设您认为正在定义要使用的顺序,实际上不做任何事情。

于 2013-02-15T10:49:49.323 回答
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: "))]
于 2013-04-30T00:22:36.337 回答
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
于 2013-02-15T09:35:40.647 回答