我可以创建 RPG 风格的保存并退出,然后重新加载进度吗?

Can I create an RPG-esque save & quit, and then reload progress?

所以我正在创建一个基本的基于文​​本的角色扮演游戏风格的游戏。 它利用剪刀石头布比赛和基于级别的进步。

因为这个游戏太难玩了,为了帮助我进行黑盒测试,我想创建一个保存和加载系统。所以我可以保存并退出程序,在它退出之前它会给我所有重要细节的代码。然后,当我 return 进入程序时,我可以重新输入此代码并 return 到我所在的位置。

在我看来,我想它类似于乐高游戏中创建角色时使用的系统,其中有一个代码伴随着角色,这样你可以保存代码并重新输入它以获得相同的人物外貌回归。但是,我对编程还比较陌生,不确定是否有更好的方法或者我将如何去做。

这是我保存代码的尝试:

if TrainTimes == 5483:
    print("Sorry to see you leave!")
    print("Here's your code to sign-in later:")
    code= name,power,rivalname,level,AP,limit,ExpGain,TotalExp,attack,defense,speed,evasiveness,health
    print(code)
    break

这是我玩到这里之后的一个例子:

('Oliver', 'dark', 'Jim', 8, 3, 25, 14, 0, 5, 1, 1, 5, 10)

虽然我不确定我将如何加载它,但我可以想象我应该使用类似的东西:

while SaveLoaded == False:
(FUNCTION)

对于通常在没有保存文件的情况下播放的代码,如果我加载了一个保存,我需要将 SaveLoaded 更改为 True。 但是我如何让程序识别并加载代码?

提前致谢!

考虑到您希望恢复应用程序的状态,这对 pickle (or, similarly, dill 来说听起来是件好事。

所以,这将做的是将您的对象转储到一个文件中,然后当您重新加载该文件时,您会将这些属性加载回内存中。

现在,关于你想做什么并基于评论讨论。您可以为用户提供一些简单的唯一代码,例如:

"ABCDEFG"

这将通过设置字典指向您的对象。现在,为了更轻松地访问数据,您可以进行的另一项修改是为每个值命名。我不知道您的每个属性是什么意思,但这是您可以执行的操作的示例:

save_state = {
    "ABCDEFG": {
        'name': 'Oliver',
        'color': 'dark',
        'last_name': 'Jim',
        'val_1': 8,
        'val_2': 3,
        'val_3': 25,
        'val_4': 14,
        'val_5': 0,
        'val_6': 5,
        'val_7': 1,
        'val_8': 1,
        'val_9': 5,
        'val_10': 10
    }
}

获取该数据,然后使用 pickle,将其转储到您的 pickle 文件中,如下所示:

import pickle

pickle.dump(save_state, open('dude.txt', 'wb'))

当您准备好加载数据时,只需使用 pickle.load。像这样:

loaded_data = pickle.load(open('dude.txt', 'rb'))

打印此数据:

{'ABCDEFG': {'last_name': 'Jim', 'val_2': 3, 'val_3': 25, 'name': 'Oliver', 'val_5': 0, 'val_10': 10, 'val_8': 1, 'val_7': 1, 'val_9': 5, 'val_1': 8, 'val_6': 5, 'color': 'dark', 'val_4': 14}}
def Load(save):
   if SaveLoaded == True:  
      saveSplit = save.split(',')
      if(len(saveSplit) == 13)
         cleaned = []
         string = ""
         for i in range(0,3):
            string = split[i].strip("'( )")
            cleaned.append(string)

        for i in range(3,13):
           string = split[i].strip("'( )")
           cleaned.append(int(string))

         name,power,rivalname,level,AP,limit,ExpGain,TotalExp,attack,defense,speed,evasiveness,health = saveSplit
      else:
         setDefault()
   else:
      SetDefault()

基本上,您将字符串拆分为带有分隔符蜂逗号的部分。您清除不必要的字符(括号等),将其转换为 crrect 数据类型并分配给您的变量,如果您不想加载,或者您的字符串无效(无效太短),您将值设置为默认值.

您可以使用json module to first serialize the objects into a json string. Then, you can convert it into hexadecimal using the binascii模块。

编码代码:

import json
import binascii

name = 'abc'
power = 5.0
attack = [1, 2, 3]

jsonified = json.dumps((name, power, attack))
secret_number = binascii.hexlify(jsonified.encode('UTF-8'))
print(secret_number)

解码码:

import json
import binascii

secret_number = input()
jsonified = binascii.unhexlify(secret_number).decode('UTF-8')
name, power, attack = json.loads(jsonified)

print(name)
print(power)
print(attack)

演示

Encoding
Decoding