剪刀石头布

3 投票
5 回答
1090 浏览
提问于 2025-04-17 15:59

我在计算机科学课上有一个测试,其中有一个问题是要做一个剪刀石头布的游戏。如果玩家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代表玩家1,而石头打败了布。有没有人能帮我看看我的代码是不是有问题?

5 个回答

3

你问了:

有人能帮我看看我的代码是不是错了吗?

是的,你的代码是错的。原因如下。

如果你运行 rps('R','S'),你应该得到 1,因为石头打败剪刀。同样,运行 rps('R','P') 应该得到 -1,因为纸打败石头。这两个在你的代码里是对的。

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

正如 eumiro 在评论中指出的,下面这三行

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

我想你认为它们是在定义顺序,其实并没有起到任何作用。

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]
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,可以把它们改回来。

撰写回答