2017-03-05 71 views
3

我翻譯一個孩子選擇自己的冒險書成python程序例如,「如果你選擇X轉到頁y或如果你選擇了轉到頁面B」減少多個if語句表

雖然這個程序的作品,在本書的最後將會有超過100個if語句是否有任何方法來創建一個表,將用戶輸入與一個頁面列表進行比較。同時研究我看到的例子顯示了類似的表如下:

#this would hold the potential user inputs 
[0,0,0,0,0,0] 
[0,0,0,0,0,0] 
[0,0,0,0,0,0] 

但是我不能確定如何實現它

#imports the pages of the book from another python file 
from Content import * 

clrscrn = (chr(27) + "[2J") 

def page0(): 
    print "\n %s" % page1 

page0() 

#User input loop 
while True: 
    inp = raw_input(">>> ").lower() 

#clears the screen then prints the variable (page) 

if inp == '3': 
    print clrscrn 
    print '%s' % page3 

if inp == '10': 
    print clrscrn 
    print '%s' % page10 

if inp == '5': 
    print clrscrn 
    print '%s' % page5 

if inp == '14': 
    print clrscrn 
    print '%s' % page14 

#quits python 
elif inp == 'quit': 
    raise SystemExit 

回答

1

每個if聲明唯一不同的是哪一頁你訪問變量。既然你想在page14如果用戶輸入「14」你可以使用由globals()返回的字典以動態方式訪問頁面變量。

因此,而不是數百if聲明,你真的不需要任何。您可以使用以下行代替。

print clrscrn 
print globals()['page' + inp] 
+0

我試圖實現這與當前的代碼,但我不知道在哪裏添加全局變量 –

+0

解決它謝謝你!我刪除了輸入行下面的所有內容,並添加了您建議的內容,效果很好! –

1

定義在你的腦袋輸入和輸出的將是什麼。

對我來說,你可能會在不同的頁面上有多個問題。所以一個輸入將是「當前頁碼」。這將確定這個問題。

其他輸入當然是用戶的迴應。在二進制(是/否)系統中,總是會有來自用戶的確切兩個可能的響應(是或否)。在非二進制系統中,可能會有更多可能的響應。

我建議你假設非二進制,並且進一步,即使只有一個問題可能是非二進制的,那就去吧。它有助於保持事物一致。

假設您已經有了一個包含100個問題的非二進制系統。每個問題出現在「頁面」的末尾。 (也許它是在「章節」或「段落」之類的末尾,隨意替換單詞)。當用戶回答時,他們被指示去一個不同的「頁面」。

所以你的映射將是「當前頁面+用戶輸入 - >新頁面」。

在python中最簡單的實現方法是使用字典列表。列表索引可以是當前頁面。這將確定問題以及可能的答案。響應(字典中的鍵)可以是文本字符串。結果(字典中的值)將是整數,表示新的頁碼。因此:

Pages = [ # List of questions, one per page. Use {} for page with no Q 
    {}, # 0 
    {}, # 1 
    { 
     "yes": 12, 
     "no": 16, 
    }, # 2 
] 

如果你想一點更有效,你可以存儲在同一個列表中的問題,使用像" q "的關鍵,不能輸入用戶(因爲你將在用戶運行.strip()輸入,自然)!

{ 
    " q ": "Do you like pizza?", 
    "yes": 12, 
    "no": 16, 
} 

如果你感覺真的精力充沛,可以使字典成一個類,有屬性,存儲各個頁面的JSON等