2017-03-05 69 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等