岩石纸剪刀
问题描述:
我有一个测试我的比赛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会打纸。任何人都可以帮助我看看我的代码是否错误?
答
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
答
,我们在您的代码几个问题:
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
我p1, p2
更换x, y
因为它们代表了玩家的,选项更好海事组织,但如果你有使用x
和y
,就改回来。
答
你可以做到以下几点:
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]
答
你问:
谁能帮我看看我的代码是错误的?
是的,这是错误的。这是为什么。
如果你运行rps('R','S')
你应该得到1
,因为摇滚打纸。同样rps('R','P')
应该给-1
,因为纸打败了摇滚乐。这两个工作在你的代码中。
但是,如果您运行的是rps('S','P')
,您应该获得1
,因为剪刀会跳动纸张,但是不会 - 您的代码返回-1
,这是错误的。
由于eumiro在评论中指出,三大行
'R'>'S'
'P'>'R'
'S'>'P'
我假设你认为定义的顺序使用,实际上没有做任何事情。
答
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: "))]
的线 'R'> 'S', 'P'> 'R', 'S'> 'P' 不要做任何东西。 – eumiro 2013-02-15 09:32:03
你已经被教过什么字典吗? – 2013-02-15 09:36:01
你说“它的工作”,但显然它没有工作。没有语法错误的程序运行是不够的。使用测试用例并检查结果。 – Matthias 2013-02-15 09:38:55