2013-02-15 268 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: "))]