Python文本游戏:如何制作保存功能?

时间:2013-09-04 05:35:05

标签: python save

我正在使用Python制作基于文本的游戏,我对此有一个大致的想法。但是我要把游戏深入到一定程度,完成它需要的时间超过一次。因此,我希望能够将游戏制作到退出的位置,它会将变量列表(玩家健康状况,黄金,房间位置等)保存到文件中。然后,如果玩家想要加载文件,他们会转到加载菜单,然后加载文件。

我目前正在使用Python的2.7.5版本,而且是在Windows上。

8 个答案:

答案 0 :(得分:8)

如果我正确理解了这个问题,那么就是在询问一种序列化对象的方法。最简单的方法是使用标准模块pickle

import pickle

player = Player(...)
level_state = Level(...)

# saving
with open('savefile.dat', 'wb') as f:
    pickle.dump([player, level_state], f, protocol=2)

# loading
with open('savefile.dat', 'rb') as f:
    player, level_state = pickle.load(f)

标准Python对象和具有任何嵌套级别的简单类都可以这种方式存储。如果您的类有一些非常重要的构造函数,则可能需要使用相应的protocol提示pickle实际需要保存的内容。

答案 1 :(得分:4)

首先,不要过度思考这个问题。您不需要使用任何复杂的东西。作为初步步骤,研究python中的基本文件输入/输出。

其次,我假设你的游戏中有一个玩家类?或者可能是跟踪游戏状态的整体课程。那么这个类存储你的变量的默认值,比如健康,黄金等。然后有一个方法可以修改这个类,如def load_stats(player):def load_stats(game):。并从保存文件中读取,该文件可以包含您喜欢的任何格式并修改您的播放器/游戏状态的变量。

首先测试加载游戏文件,并确保你可以获得它,以便你的玩家类被修改。

然后,您只需添加一个保存游戏功能,该功能可以将这些变量输出回目录系统中的某个文件。

尝试这样做,如果您之后需要任何帮助,请告诉我。

答案 2 :(得分:3)

要添加到Bogdan的答案,更容易理解的方法是存储包含所有数据的字典。所以如果你有这个:

import pickle
data = {'health':100, 'gold': 1560, 'name': 'mariano'}
你会这样做:

with open('savefile', 'w') as f:
    pickle.dump(data, f)

with open('savefile') as f:
    data = pickle.load(f)

它应该加载。

答案 3 :(得分:0)

我认为你可以使用txt文件记录你在游戏中需要的东西,只需使用file()和open()函数。或者你可以使用python中的sqlite3模块来保存你的记录。 试试吧:

导入sqlite3

holp有帮助。 :)

这是一个在python中使用sqlite3的例子:

只需更改即可保存到文件中:

    import sqlite3
    cx=sqlite3.connect("stu.db") # get a connect object
    cu=cx.cursor() # get a cursor


    cu.execute("""create table stu
    (
            number char(10) primary key not null,
            name char(10) not null,
            sex int not null default 1 check (sex in (1,0)),
            major char(5) not null,
            mark int not null,
            birthday datetime not null
    )""")

    cu.execute("insert into stu values ('010011','Jim',1,'computer',58,'1989-01-01')")
    cu.execute("insert into stu values ('080011','Jimmy',1,'computer',59,'1990-02-25')")
    cu.execute("insert into stu values ('080001','Jack',1,'computer',58,'1989-10-01')")
    cu.execute("insert into stu values ('081102','Zimmer',1,'computer',60,'1990-01-01')")
    cu.execute("insert into stu values ('081103','Hans',1,'computer',58,'1991-2-08')")
    cu.execute("insert into stu values ('090210','Lily',0,'computer',58,'1990-05-31')")
    cu.execute("insert into stu values ('090125','Mary',0,'computer',59,'1992-07-08')")
    cu.execute("insert into stu values ('080136','Tom',1,'computer',58,'1989-01-01')")
    cu.execute("insert into stu values ('090012','Lisa',0,'software',59,'1990-04-05')")
    cu.execute("insert into stu values ('080028','Lee',0,'software',58,'1990-05-07')")

    cx.commit()# commit the sql

    cu.execute("select * from stu") #get the all records
    cu.fetchone() # fetch one
    cu.execute("select mark from stu where name='Jim'")

    cu.execute("""select name=
            case
                    when mark >55 and mark<60 then 'ok'
                    when mark=60 then 'good'
                    else 'unkown'
            end
            from stu""")

    cu.execute("""update stu      
            set major='software'
                    where name='Jim'
    """)# update one

    cu.execute("""select min(mark) from stu""")#get the min
    cu.execute("select count(*) from stu") #get the number of stu
    cu.execute("select avg(mark) from stu") #get ave
    cu.execute("select * from stu where name='Jim'")#look jim
    cu.execute("select * from stu where mark=60")
    cu.execute("select * from stu where name like 'Li__'")
    cu.execute("select * from stu where Birthday not between '1989-01-01' and '1989-12-31'") 


    cx.commit()

    res=cu.fetchall()#get all 
    #cu.fetchone()
    for i in res:
            print i

    cu.close()
    cx.close()

或者我认为,如果您的游戏不是很复杂,只需使用file()函数。

答案 4 :(得分:0)

我一直在做这样的事情。它使用JSON来实现易用性和可扩展性。这是:

   import json
//save files below
def save_file():
//to enter a name for your file
//if you don't want to just make it a string
    save_name = input("savename: ")
    path = 'path_to_dir{0}.json'.format(save_name)
    data = {
        'name': save_name
    }
    with open(path, 'w+') as f:
        json.dump(data, f)


def load_file():
    load_name = save_name
   path_two = 'path_to_dir{0}.json'.format(load_name)
    with open(path_two, 'r') as f:
        j = json.load(f)
        name = str(j['name'])

这是我在所有项目中使用的文件保存系统。 我希望它有所帮助

答案 5 :(得分:0)

def cache (filename):
    global c,code
    try:
        c = open(filename + " cache.txt", "rt")
        code = eval(c.read())
        c.close()
    except:
        c = open(filename + " cache.txt", "wt")
        c.write("{'': ''}")
        c.close()

        c = open(filename + " cache.txt", "rt")
        code = eval(c.read())
        c.close()

def find(filename,variable):
    global c,code
    c = open(filename + " cache.txt", "rt")
    code = eval(c.read())
    c.close()
    variable2 = code.get(variable)
    return variable2

def store(filename,variable,info):
    global c,code
    code[variable] = info
    c = open(filename + " cache.txt", "wt")
    c.write(str(code))
    c.close()

def clearcache(filename):
    c = open(filename + " cache.txt", "w")
    c.write("{'': ''}")
    c.close()

file = "DungeonQuest"

#Creates the file for storage
cache (file);

#Stores a variable for later use
x = 15
store(file,"x",x);

#Finds a stored variable
x = find(file,"x");

#Clears all stored variables in the cache
clearcache(file);

这是我自己的一些代码,用于将变量存储到外部文本文件中。唯一的问题是,您必须将每个单独存储并分别查找每个。我将其用于我自己的python游戏地下城任务,似乎工作正常

答案 6 :(得分:0)

好吧,我用Python制作了一个点击游戏,没有使用泡菜或其他东西。 1.制作一个关卡变量,该关卡在关卡开始时会更改。

def level1():
    level = 1
  1. 将该变量插入文本文件。
    #this is the level1 command part
    with open ("level.txt", "w") as level_data:
        level_data.write(str(level))
  1. 游戏开始时,它必须检查文本文件。
#not the level1 command part
import os

data_check = os.path.exists("level.txt")

if data_check == True:
    data_load = open("level.txt", "r")
    level = int(data_load.read())
else:
    level = 0

答案 7 :(得分:0)

我也在游戏中使用了类似的方法:

with open("game_data.txt", "w") as f:
    f.write(str(amount_of_gold) + "\n")

现在,这将返回list()。 然后,您想在其中写一些东西。您可以使用write()函数。注意:不要忘记在每行之后str()并添加一个\n。 这正在保存数据。 现在阅读:

import os
if os.path.getsize("game_data.txt") > 0:
    with open("game_data.txt", "r") as f:
            data = f.read().splitlines()
            amount_of_gold = int(data[0])

等... 注意:不要忘记使用int()。您必须使用os.path.getsize(),因为否则游戏将读取一个空文件(即玩家首次启动游戏时),并且您将获得Index Error