2013-09-25 79 views
3

我是新來的蟒蛇,我試圖創建一個簡單的程序,允許用戶選擇使用8,12或24面的骰子,然後顯示滾動的結果。在Python中模擬骰子的問題

這是我的代碼,但我不確定爲什麼當我輸入時是否希望再次滾動它會產生錯誤。

import random 

def dice4(): 
min=1 
max=4 
print random.randint(min, max); 
return; 

def dice6(): 
min=1 
max=6 
print random.randint(min, max); 
return; 

def dice12(): 
min=1 
max=12 
print random.randint(min, max); 
return; 

roll = "yes" 
y = 1 

while roll == "yes" or roll == "y": 
    x = input("What dice do you want to use? 4/6/12?"); 
    if x ==8: 
    dice4(); 
    elif x==12: 
    dice6(); 
    elif x==16: 
    dice12(); 
    else: 
    print "You have not entered a valid dice number"; 

    roll = input("Do you want to roll again? y/n"); 

print "Thanks for rolling!"; 
input("Press <Enter> to quit"); 

感謝您的幫助,我意識到這可能是一個微不足道的錯誤。

+1

你看到什麼錯誤?你可以將它編輯成你的問題嗎? –

+0

另外,你能指定你使用的是哪個Python版本嗎? –

+4

不要在行尾添加分號,添加無用的'return'語句等,這會讓您的代碼難以閱讀。 – abarnert

回答

5

我不確定爲什麼當我輸入時是否希望再次滾動時會產生錯誤。

所以問題出在這部分代碼中。讓我們看看它:

roll = input("Do you want to roll again? y/n"); 

您正在使用input函數。這將嘗試評估您輸入的任何Python表達式。

因此,如果您鍵入yes,它將嘗試查找yes的值,並提高NameError。對於nno也是如此。

如果您輸入y,則應該發生同樣的情況...除非您碰巧有一個名爲y的無關變量,它實際上會找到值1。因此,稍後在while roll == "yes" or roll == "y":中檢查時,顯然1與這兩個字符串中的任何一個都不相等,因此它只會退出。

你可以鍵入的唯一的工作是"y""yes"(或單引號相同)。顯然你不希望你的用戶必須輸入。

解決方案是使用raw_input而不是input,它只是給你一個字符串輸入,而不是試圖評估它。

roll = raw_input("Do you want to roll again? y/n"); 

這是使用input一個原因通常是一個壞主意。即使在前面的情況下,如果你想要一個整數,錯別字的錯誤將會很難看。

對於一個更重要的原因,看到當你鍵入__import__('os').system('dir C:\\')(替代ls /如果你是在Unix而不是Windows),並想象你的用戶可以有多大的惡作劇與其他輸入導致發生了什麼。

所以,我會推薦總是使用raw_input。如果要將輸入轉換爲整數,請將其傳遞給int。如果您想將其視爲任何類型的文字值,請使用ast.literal_eval。如果你真的想評估它爲任意的Python代碼,使用eval(它不比input安全,但至少它更明確)。

+0

非常感謝! – user2816617

1

讓我只是添加其他問題與您的代碼。您可以在函數中覆蓋內建的minmax,並使用不需要的分號。您使用空的return語句。

然後你用dice4,dice6dice12重複太多的代碼。你應該使用一個帶參數的函數。現在你將能夠拋出許多不同的骰子。

def dice(value): 
    print random.randint(1, value) 

dice(4) 
dice(6) 
dice(8)