从列表中分配变量,或“如何创建优雅的保存函数”

2024-09-25 08:35:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个基于文本的小游戏,这个游戏会根据全局变量来记忆游戏状态,例如,地精死亡,看看你是否已经杀死了地精。你知道吗

在我决定添加一个save and load函数之前,这个方法非常有效。save函数起作用,load函数不起作用,虽然我知道原因,但我不能想出一个简单的解决方法。你知道吗

save函数目前的工作方式是这样的,我有一个列表,其中列出了到目前为止我们在游戏中使用的所有全局变量。然后我让列表遍历每个变量,如果为真,则给出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中的,但我不确定如何开始可靠地访问和存储这些变量,或者是否可以使用全局字典来正确地存储游戏中的所有变量。基本上,我不确定如何“正确地”使用字典的全部潜力,特别是它如何与变量交互。你知道吗


Tags: 列表字典valueloadvariablepopgloballist
1条回答
网友
1楼 · 发布于 2024-09-25 08:35:44

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

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表示True。布尔实际上是int的一个子类。你甚至可以用它们来做数学,例如True+True等于2。你知道吗

相关问题 更多 >