Arrays 生成一个反向工程代码来保存游戏,python 3
因此,我正在用Python制作一个基于文本的小游戏,我决定使用旧的“插入代码”技巧来实现一个保存系统。代码需要跟踪玩家清单(以及其他东西,但清单是我遇到的问题) 因此,我的思考过程是将游戏中的每个项目和事件绑定到一个代码。例如,您的库存中的剑将存储为“123”或类似的独特内容 因此,对于将生成的代码来保存游戏,假设您的库存中有一把剑和一个盾牌,并且您在军械库中 地点(军械库)=abc 剑=123 屏蔽=456 当播放器输入生成代码的命令时,我希望输出如下: abc.123.456 我认为,在代码中的项目之间加上句点,可以更容易地在解码代码时区分一个项目和另一个项目 然后,当玩家重新开始游戏并输入代码时,我希望abc.123.456被翻译回你的位置,即军械库,并且在你的库存中有一把剑和盾牌 这里有几个问题:Arrays 生成一个反向工程代码来保存游戏,python 3,arrays,python-3.x,Arrays,Python 3.x,因此,我正在用Python制作一个基于文本的小游戏,我决定使用旧的“插入代码”技巧来实现一个保存系统。代码需要跟踪玩家清单(以及其他东西,但清单是我遇到的问题) 因此,我的思考过程是将游戏中的每个项目和事件绑定到一个代码。例如,您的库存中的剑将存储为“123”或类似的独特内容 因此,对于将生成的代码来保存游戏,假设您的库存中有一把剑和一个盾牌,并且您在军械库中 地点(军械库)=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个)
- 如果您决定使用标点符号和标点字符,则可能会有更多选项,本示例将不在其中,如果需要,您需要自己涵盖该部分
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并不是很合拍。。。