2013-02-15 85 views
3

我有一个测试我的比赛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会打纸。任何人都可以帮助我看看我的代码是否错误?

+3

的线 'R'> 'S', 'P'> 'R', 'S'> 'P' 不要做任何东西。 – eumiro 2013-02-15 09:32:03

+0

你已经被教过什么字典吗? – 2013-02-15 09:36:01

+0

你说“它的工作”,但显然它没有工作。没有语法错误的程序运行是不够的。使用测试用例并检查结果。 – Matthias 2013-02-15 09:38:55

回答

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 
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 

p1, p2更换x, y因为它们代表了玩家的,选项更好海事组织,但如果你有使用xy,就改回来。

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

你问:

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

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

如果你运行rps('R','S')你应该得到1,因为摇滚打纸。同样rps('R','P')应该给-1,因为纸打败了摇滚乐。这两个工作在你的代码中。

但是,如果您运行的是rps('S','P'),您应该获得1,因为剪刀会跳动纸张,但是不会 - 您的代码返回-1,这是错误的。

由于eumiro在评论中指出,三大行

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

我假设你认为定义的顺序使用,实际上没有做任何事情。

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: "))]