首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -函数

Python -函数
EN

Stack Overflow用户
提问于 2013-11-13 18:09:11
回答 4查看 126关注 0票数 0

我正在做一个选择你自己的冒险项目,它的主要功能是接受3个参数。

  • 第一个参数由函数打印。这始终是一个包含描述场景的文本的变量。
  • 第二个参数总是包含与当前场景相关的选项的变量,该选项由函数打印。
  • 第三个参数是一个字典,其键对应于场景选择,并与用户的输入进行比较。键的值包含接下来的3个参数。

举例说明。

代码语言:javascript
复制
text1 = 'This is the scenario'  
text2 = 'These are the choices'

dict2 = {'1':[text2, text1, dict1]}
dict1 = {'1':[text1, text2, dict2]}

def mainloop(scenario, choice, consequence):
    print scenario
    print choice

    answer = raw_input('Please input 1, 2 or 3>>> ')

    if answer in consequence.keys():
        mainloop(*consequence[answer])

mainloop(text3, text2, dict1)   

我认为这将是设计我的项目的一个很好的方法,但是我遇到了字典参数的问题。因为字典值包含一个参数列表,其中包括其他字典,所以我一直收到错误:

代码语言:javascript
复制
NameError: name 'dict1' is not defined

翻翻我定义字典的顺序会导致同样的错误,只是没有定义'dict2‘。关于如何让这个概念发挥作用,有什么建议吗?还是该采取完全不同的方法了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-13 18:44:45

有几件事,我建议重新考虑的方法作为一个整体。

正如其他人指出的那样,mainloop()实际上不是一个循环;它是一个递归函数。理想情况下,如果这是一个游戏循环,您会希望它更像…

代码语言:javascript
复制
def myGameLoop():
    gameRunning = True
    while gameRunning:
        # code that displays your rooms, gets user input,
        #and checks to make sure that gameRunning is not False.
        #for an example, something like:
        if somethingAwfulHappened
            gameRunning = False

这样,您就不必不止一次地调用mainloop,也没有理由让它自己调用它。

另外,你的房间清单告诉你它们不存在的原因是,嗯,它们不存在:)这实际上是一个很好的例子,说明为什么把你的关注点分开是个好主意!

你可以这样想:为什么一个“房间”对象--不管它是一个迪克,一个列表,一个对象,等等--需要包含任何关于其他房间的数据?你的厨房可能通向你的浴室,当然--但你的厨房知道它通向浴室吗?它是否有一个新的用途,引导到浴室而不是你的卧室?就像你的厨房不关心它与你的浴室相连一样,你的老二也不需要通过在自己的数据中明确地命名彼此来“知道”它们之间的联系。

一个理想的方法可能是去定义您所有的房间,然后创建一个“地图”来描述您的房间之间的关系。例如:

代码语言:javascript
复制
kitchen = {
    "name":"Kitchen",
    "description": "This is the kitchen! It's nice and clean.",
    "exits": "S", "E"
}

bathroom = {
    "name":"Bathroom",
    "description":"This is the bathroom. Someone left a towel on the floor.",
    "exits":"W", "S"
}
#and so on, creating rooms

现在,创建一个只保存所有这些信息并描述这些出口是如何工作的地图迪克。

代码语言:javascript
复制
mapOfHouse = {
    "kitchen": kitchen,
    "leadsTo": {
        "S": bathroom,
        "E": someOtherRoom ##some other place you've defined
    },
    "bathroom": bathroom,
    "leadsTo": {
        "S": otherAwesomePlaces,
        "E": kitchen
    },

    #and so on for other rooms in the house/on the map/etc
 }

一旦你把所有这些都画出来,你就会设置你的游戏程序来获取玩家的输入,根据房间的出口来检查它,如果有匹配的话,只要循环仍然是True,它就会返回到顶部,显示更新的信息。

这似乎是更多的工作,但实际上,这给了你巨大的自由。它让你在设计房间的时候把注意力严格放在房间上,然后在你更新的时候把注意力放在地图上,然后让你设计一个游戏循环,它不太关心它正在循环的内容,只要它一直保持True,并从玩家那里得到好的指示。

票数 1
EN

Stack Overflow用户

发布于 2013-11-13 18:14:19

我不太清楚您为什么需要两个dicts,但假设需要使用循环引用来定义dicts是可能的:

代码语言:javascript
复制
text1 = 'This is the scenario'  
text2 = 'These are the choices'

dict1, dict2 = {}, {}
dict2['1'] = [text2, text1, dict1]
dict1['1'] = [text1, text2, dict2]
票数 3
EN

Stack Overflow用户

发布于 2013-11-13 18:11:17

您在dict2中引用了dict2,但是dict1还不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19961202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档