Могу ли я создать 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()

В основном вы разделяете строку на части с помощью запятой. Вы убираете ненужные символы (круглые скобки и т. Д.), Конвертируете его в точный тип данных и присваиваете свои переменные, если не хотите загружать, или ваша строка недопустима (недопустимый слишком короткий), вы устанавливаете значения по умолчанию.,

Другие вопросы по тегам