Arrays 生成一个反向工程代码来保存游戏,python 3

Arrays 生成一个反向工程代码来保存游戏,python 3,arrays,python-3.x,Arrays,Python 3.x,因此,我正在用Python制作一个基于文本的小游戏,我决定使用旧的“插入代码”技巧来实现一个保存系统。代码需要跟踪玩家清单(以及其他东西,但清单是我遇到的问题) 因此,我的思考过程是将游戏中的每个项目和事件绑定到一个代码。例如,您的库存中的剑将存储为“123”或类似的独特内容 因此,对于将生成的代码来保存游戏,假设您的库存中有一把剑和一个盾牌,并且您在军械库中 地点(军械库)=abc 剑=123 屏蔽=456 当播放器输入生成代码的命令时,我希望输出如下: abc.123.456 我认为,在代码

因此,我正在用Python制作一个基于文本的小游戏,我决定使用旧的“插入代码”技巧来实现一个保存系统。代码需要跟踪玩家清单(以及其他东西,但清单是我遇到的问题)

因此,我的思考过程是将游戏中的每个项目和事件绑定到一个代码。例如,您的库存中的剑将存储为“123”或类似的独特内容

因此,对于将生成的代码来保存游戏,假设您的库存中有一把剑和一个盾牌,并且您在军械库中

地点(军械库)=abc

剑=123

屏蔽=456

当播放器输入生成代码的命令时,我希望输出如下:

abc.123.456

我认为,在代码中的项目之间加上句点,可以更容易地在解码代码时区分一个项目和另一个项目

然后,当玩家重新开始游戏并输入代码时,我希望abc.123.456被翻译回你的位置,即军械库,并且在你的库存中有一把剑和盾牌

这里有几个问题:

  • 如何将每个库存项目与其各自的代码关联
  • 如何生成完整的代码
  • 当播放器重新加载时,我如何解码它

  • 我对Python非常陌生,我真的不知道如何开始这项工作。。。任何帮助都将不胜感激,谢谢

    所以,如果我没弄错的话,你想把信息序列化成一个字符串,这个字符串不能“保存”,但可以输入到你的程序中

    不需要使用圆点,您可以编写应用程序,在不使用圆点的情况下读取代码。。这将在长度上为您节省一些字符

    你的游戏需要“保存”的信息越多,你的代码就会越长;我建议使用尽可能短的字符串

    根据要存储在保存代码中的位置、项目等的数量:您可能更喜欢较长或较短的选项:

    • 数字(0-9):允许您保留10个名称,每个名称存储1个字符
    • 十六进制(0-9+a-f或0-9+a-f):允许保留16到22个名称(如果代码区分大小写,则保留22个)
    • alphanum(0-9+a-z或0-9+a-z):允许您保留36到62个名称(如果区分大小写,则为62个)
    • 如果您决定使用标点符号和标点字符,则可能会有更多选项,本示例将不在其中,如果需要,您需要自己涵盖该部分
    在这个例子中,我将坚持使用数字,因为我不会列出超过10个项目或位置

    在源代码中将每个库存项目和每个位置定义为字典:

    你可以用一行,就像我对地方做的那样

    places = {'armory':'0', 'home':'1', 'dungeon':'2'}
    # below is the same dictionary but sorted by values for reversing.
    rev_places = dict(map(reversed, places.items()))
    
    或提高可读性;使用多行:

    items = {
            'dagger':'0',
            'sword':'1',
            'shield':'2',
            'helmet':'3',
            'magic wand':'4'
            }
    #Below is the same but sorted by value for reversing.
    rev_items = dict(map(reversed, items.items()))
    
    将数字存储为字符串,以便于理解,如果使用十六进制或alphanum选项,则需要使用该选项

    然后还可以使用字典来管理游戏中的信息,下面只是一个示例,说明您应该如何表示代码将生成或解析的游戏信息,这部分内容不应该出现在您的源代码中,为了测试它,我特意将项目弄乱了。

    game_infos = {
            'location':'armory',
            'items':{
                'slot1':'sword',
                'slot2':'shield',
                'slot3':'dagger',
                'slot4':'helmet'
                }
            }
    
    然后,您可以使用以下函数生成保存代码,该函数读取您的库存和行踪,如下所示:

    def generate_code(game_infos):
        ''' This serializes the game information dictionary into a save
        code. '''
        location = places[game_infos['location']] 
    
        inventory = ''
        #for every item in the inventory, add a new character to your save code.
        for item in game_infos['items']:
            inventory += items[game_infos['items'][item]]
    
        return location + inventory # The string!
    
    还有读取功能,它使用反向字典来解密您的保存代码

    def read_code(user_input):
    ''' This takes the user input and transforms it back to game data. '''
    result = dict() # Let's start with an empty dictionary
    # now let's make the user input more friendly to our eyes:
    location = user_input[0]
    items = user_input[1:]
    
    result['location'] = rev_places[location] # just reading out from the table created earlier, we assign a new value to the dictionary location key.
    
    result['items'] = dict() # now make another empty dictionary for the inventory.
    # for each letter in the string of items, decode and assign to an inventory slot.
    for pos in range(len(items)):
        slot = 'slot' + str(pos)
        item = rev_items[items[pos]]
        result['items'][slot] = item
    
    return result # Returns the decoded string as a new game infos file :-)
    
    我建议您使用这个工作示例程序,创建一个自己的游戏信息字典,在库存中添加更多项目,添加一些位置,等等。 您甚至可以在功能中添加更多的行/循环,以管理hp或游戏所需的其他字段


    希望这有帮助,你没有放弃这个项目

    我建议考虑类似JSON的东西,因为它很容易解码(库在那里),提供可以嵌套的字典键值。我不确定你将如何保存ie.数据库或文本文件,但如果你在数据结构中进行一些规划,解决方案可以是直截了当的。你是否建议绕过整个代码输入,只将清单/进度存储在JSON文件中?老实说,是的,这很理想,但是我想用Pyinstaller打包程序,这被证明在尝试读取/写入外部文件时会有问题。如果您想将python数据存储到文件中,可以使用pickle,它可以让您保存实际的python对象,所以如果您有一个“清单”,您可以保存并重新加载它。问题是,我想使用pyinstaller来冻结代码,从我所看到的情况来看,pickle和pyinstaller并不是很合拍。。。