Могу ли я создать RPG-esque save & quit, а затем перезагрузить процесс?
Итак, я создаю основанную текстовую игру в стиле RPG. Он использует сопоставления Rock-Paper-Scissors и прогрессирование по уровням.
Потому что эта игра настолько изящная, что ее можно найти где угодно, и чтобы помочь в тестировании моего черного ящика, я хотел бы создать систему сохранения и загрузки. Таким образом, я мог сохранить и выйти из программы, и прежде чем она выйдет, она выдаст мне код всех важных деталей. И затем, когда я вернулся в программу, я мог повторно ввести этот код и вернуться туда, где я был.
Я думаю, что это похоже на систему, используемую в играх Lego при создании персонажей, где есть код, сопровождаемый персонажем, чтобы вы могли сохранить код и ввести его заново, чтобы вернуть тот же внешний вид персонажа. Однако я относительно новичок в программировании и не уверен, есть ли лучший способ сделать это или как я поступил бы с этим.
Вот моя попытка сохранить код:
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
И вот пример после того, как я проиграл и дошел до этой точки:
("Оливер", "темный", "Джим", 8, 3, 25, 14, 0, 5, 1, 1, 5, 10)
Я не уверен, как бы тогда загрузить это, хотя, я могу представить, что я должен использовать что-то вроде:
while SaveLoaded == False:
(FUNCTION)
для кода, который обычно воспроизводился бы без файла сохранения, и что мне нужно было бы изменить SaveLoaded на True, если я загрузил сохранение. Но как мне заставить программу идентифицировать и загрузить код?
Заранее спасибо!
3 ответа
Учитывая, что вы хотите восстановить состояние своего приложения, это звучит как хорошая работа для засолки (или, аналогично, укропа).
Таким образом, то, что это будет делать, - это сбросить ваши объекты в файл, а затем, когда вы перезагрузите этот файл, вы загрузите эти свойства обратно в память.
Теперь относительно того, что вы хотите сделать, и на основе обсуждения комментариев. Вы можете предоставить пользователю простой уникальный код, такой как:
"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}}
Вы можете использовать json
модуль для первой сериализации объектов в строку json. Затем вы можете преобразовать его в шестнадцатеричный, используя 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)
Демо:
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()
В основном вы разделяете строку на части с помощью запятой. Вы убираете ненужные символы (круглые скобки и т. Д.), Конвертируете его в точный тип данных и присваиваете свои переменные, если не хотите загружать, или ваша строка недопустима (недопустимый слишком короткий), вы устанавливаете значения по умолчанию.,