我可以创建 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)
演示:
所以我正在创建一个基本的基于文本的角色扮演游戏风格的游戏。 它利用剪刀石头布比赛和基于级别的进步。
因为这个游戏太难玩了,为了帮助我进行黑盒测试,我想创建一个保存和加载系统。所以我可以保存并退出程序,在它退出之前它会给我所有重要细节的代码。然后,当我 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)
演示: