剪刀石头布
我在计算机科学课上有一个测试,其中有一个问题是要做一个剪刀石头布的游戏。如果玩家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
之前。(假设 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
,因为我觉得这样更能代表玩家的选择,但如果你必须使用 x
和 y
,可以把它们改回来。