从列表中分配变量,或者"如何制作优雅的保存功能"

时间:2015-11-23 04:38:26

标签: python python-2.7 dictionary

我目前正在制作基于小型文字的游戏,游戏会根据全局变量记住游戏状态,例如goblins_dead,看看你是否已经杀死了地精。

这很好用,直到我决定添加一个保存和加载功能。保存功能起作用,加载功能不起作用,虽然我知道为什么,但我不能提出一个简单的修复方法。

保存功能目前的工作方式是这个,我有一个列表,其中包含我们到目前为止在游戏中使用的所有全局变量。然后我让列表遍历每个变量并且如果它是真的则给出1或者如果不是则给出0,最后它打印一个"种子"由用户可以输入的1和0列表组成。在我的示例测试代码

中看起来像这样
def game_save():
    print "This will give you a seed. Write it down, or see seed.txt"
    print "When you start a new game, you will be propted to give your seed. Do so to reload."
    global goblins_defeated 
    global lucky
    global princesshelp

    end = "done"
    load_seed =[goblins_defeated, lucky, princesshelp, end]
    load_seed.reverse()
    variable = load_seed.pop()
    seed = []
    print globals()

    while end in load_seed:
        if variable == True:
            seed.append("1")
            print "APPENEDED 1"
            print load_seed
            variable = load_seed.pop()
        elif variable == False:
            seed.append("0")
            print "APPENED 0"
            print load_seed
            variable = load_seed.pop()
        else:
            print "ERROR"
            break

    seedstring = ' '.join(seed)

    print "This is your seed %s" %seedstring

此代码有效,它产生一个字符串,以我想要的方式匹配值。

问题来自于加载时间。我颠倒了这个过程,就像这样:

def game_load():
print "Please type your seed in here:"
global goblins_defeated 
global lucky
global princesshelp
end = "done"

seedlist = [goblins_defeated, lucky, princesshelp, end]

seed = raw_input("> ")
seed_list = seed.split(" ")
seed_value = seed_list.pop()
variable_list = [end, goblins_defeated, lucky, princesshelp]
variable = variable_list.pop()
testlist = []

while end in variable_list:
    if seed_value == '1':
        variable = True
        print variable_list
        print variable
        print seed_value
    elif seed_value == '0':
        variable = False
        print variable_list
        print variable
        print seed_value
    else:
        print "ERROR ERROR FALSE LOOP RESULT"
        break

    if bool(seed_list) == False:
        print "List is empty"
    else:
        seed_value = seed_list.pop()

    variable = variable_list.pop()

对于经验丰富的程序员来说,这个错误是显而易见的,事实证明变量指向的是列表加载,而不是变量名称,因此我不能以这种方式分配事物。

这是我难倒的地方,我可以列出一长串if语句,但这不是很优雅。进一步阅读表明字典方法可能是解决这个问题的方法,但我不确定如何实施字典,更具体地说,我不确定如何字典与变量交互,我的理解是这是变量实际存储在python中的方式,但是我不确定如何开始可靠地访问和存储这些变量,或者我是否可以使用全局字典来存储所有变量我在游戏中的变量正确。基本上,我不确定如何"正确"使用字典充分发挥潜力,特别是它如何与变量交互。

1 个答案:

答案 0 :(得分:1)

这比必要的要大得多。只需使用字符串格式提供保存密码:

print 'Your seed is {}{}{}{}'.format(goblins_defeated+0, lucky+0, princesshelp+0, end+0)

添加0会将每个布尔值转换为其数字表示形式。每个值都插入到字符串中,替换{}

像这样加载:

seed = raw_input("> ")
goblins_defeated, lucky, princesshelp, end = map(bool, map(int, seed.split()))

这会在空格上拆分seed,将每个元素映射到一个整数,然后将每个整数映射到布尔值,然后将map个对象解包为适当的变量。

您根本不必将这些条件存储为布尔值,因为10的评估方式类似,0用于False和{{1}对于1。无论如何,布尔值实际上是True的子类。你甚至可以用它们做数学,例如int等于True+True