5

私は Python でテキスト ベースのゲームを作成している途中ですが、一般的なアイデアはありません。しかし、私はゲームを完成させるのに1回座っているよりも長くかかるところまで、ゲームを深くするつもりです. そのため、ゲームを終了時に変数 (プレイヤーの健康状態、金、部屋の場所など) のリストをファイルに保存できるようにしたいと考えています。次に、プレーヤーがファイルをロードしたい場合は、ロード メニューに移動すると、ファイルがロードされます。

現在、Python のバージョン 2.7.5 を使用しており、Windows を使用しています。

4

8 に答える 8

12

質問を正しく理解できれば、オブジェクトをシリアル化する方法について質問しています。最も簡単な方法は、標準モジュール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 オブジェクトと、任意のレベルのネストを持つ単純なクラスは、この方法で格納できます。クラスに重要なコンストラクターがある場合は、対応するプロトコルpickleを使用して、実際に保存する必要があるものをヒントする必要がある場合があります。

于 2013-09-04T05:56:25.383 に答える
4

まず、これを考えすぎないでください。複雑なものを使用する必要はありません。準備段階として、Python での基本的なファイルの入出力について調べます。

第二に、あなたのゲームにはプレーヤー クラスがあると思いますか? または、ゲームの状態を追跡する全体的なクラスかもしれません。そのクラスに、ヘルス、ゴールドなどの変数のデフォルト値を保存してもらいます。次に、このクラスを変更できるメソッドを作成しdef load_stats(player):ますdef load_stats(game):。任意の形式の保存ファイルから読み込み、プレーヤー/ゲームの状態の変数を変更します。

最初にゲーム ファイルの読み込みをテストし、それを取得できることを確認して、プレーヤー クラスを変更します。

あとは、これらの変数をディレクトリ システムのどこかにあるファイルに出力できるセーブ ゲーム機能を追加するだけです。

これを試してみて、後でサポートが必要な場合はお知らせください。

于 2013-09-04T05:51:00.073 に答える
3

ボグダンの答えに追加するには、すべてのデータを辞書に保存するだけのわかりやすい方法です。したがって、これがある場合:

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)

ロードする必要があります。

于 2013-09-04T06:01:06.420 に答える
0

txt ファイルを使用してゲームに必要なものを記録するだけで、file() と open() 関数を使用できます。または、python で sqlite3 モジュールを使用して記録を保存することもできます。ちょうど試して :

インポートsqlite3

役立つホルプ。:)

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() 関数を使用してください。

于 2013-09-04T05:39:57.310 に答える