2012-03-15 11 views
1

私はJavaで基本的なボードゲームを実装していますが、私は解決の是非を判断するのが難しいです。私は既にゲーム内でアンドゥ機能を有効にするコマンドパターンをうまく利用しており、もともとゲームモデルオブジェクトのセット全体をシリアライズしてゲームセーブ/ロードを実装することを意図していました。保存/読み込みのためのJavaでのコマンドパターンの使用

しかし、ランダムな要素がなく、常に同じ状態で初期化するボードゲームなので、コマンドスタックとコマンド自体を含むオブジェクトを単純にシリアライズして保存/ロード機能を実装することができますゲームを保存された位置に持ち上げるために、すべてのコマンドを再実行してください。

私のコマンドは、私のボードのタイルとピースを構成するオブジェクトインスタンスへの参照を保持しているので、私はこれを行うことができません。それは、それらのモデルオブジェクトを連載しなければならないことを意味します。これは、単にコマンドをシリアル化して実行する目的を無効にします。私の質問は、コマンドを持っているだけボードの整数の場所を保持するかどうかはタイル悪い練習とみなされます。私のCommandクラスのコードの

関連部分:

private GameController controller; 
private Tile sourceTile; 
private Tile[] route; 

public MoveCommand(GameController controller, Tile sourceTile, Tile... route) { 
    this.controller = controller; 
    this.sourceTile = sourceTile; 
    this.route = route; 
} 

@Override 
public void execute() { 
    controller.executeMove(sourceTile, route); 
} 

私はXとYの整数を保持するその旨をTileLocationか何かと呼ばれる新しい直列化可能クラスへの参照にタイル参照を変更しようとしますボードはタイルを見つけることができます。

+0

あなたは常に同じPRNGを使用し、種を保存する限り、ランダム性があることに注意してください。ユーザーの入力とシードを保存するだけで非常に良い方法です(私は自分のプラットフォームゲーム(まだどこかのゲームを持っています)... 1993年;)Warcraft III、StarCraft 2、ゲームを保存してリプレイを保存するために、そのテクニックを正確に使用します。 1時間に何百人ものユニットが参加しているプレイヤーが数人いる場合でも、リプレイは非常に小さいのです。ユーザーが入力できるのはユーザーの入力だけです... – TacticalCoder

+0

追加の利点として、このようなテクニックもありますあなたのプログラム/ゲームの状態を再現しやすくなり、そのようなトリックを使用していないときよりも簡単にデバッグ/トレースを行うことができます。唯一の欠点は、ロジックが変更されるとすぐに古いセーブをロードすることができなくなるため、各セーブにバージョン番号を追加する必要があるかもしれないということです。 – TacticalCoder

答えて

1

ゲームの状態を保存するのに間違っていて、整数として移動しません。しかし、私は長期的なストレージのためにjavaシリアル化を使用することをお勧めしません。 (ゲーム のクラスを更新し、保存した状態を再読み込みすることはほとんど不可能です)。長期間の永続性のために、何らかのXMLまたはJSONデータバインディング(Jackson、GSON、好きなように)を使用します。

+0

この情報はシリアル化を個人的に使う必要があります以前はXStream(http://xstream.codehaus.org/index.html)を認識していましたが、XMLとの間でオブジェクトをシリアル化する以前のプロジェクトでは非常に便利でした。 – DavidH

0

また、私はシリアル化に反対して、代わりにJSONまたはXMLを選択します。ただし、シリアライズする必要がある場合は、メンバー変数の「transient」キーワードを使用して、シリアライゼーションに含まれないようにすることができます。

private transient int x = 0; 

この特定の変数は、オブジェクトのシリアライズ時には含まれません。一般に、JSONやXMLを使用していても、これらのフィールドを一時的なものとしてマークするのは良い方法です。リフレクションを使用して、書き出すオブジェクトの内容を特定し、保存するフィールドを特定するビジネスロジックを持たずに書き出すことができます。それは節約しない。

+0

私はすでにこのように過渡フィールドを使用することを知っていましたが、リフレクションとともにそれらを使用して、クラスに依存しないシリアライズの方法を作成することは考慮しませんでした。ありがとう。 – DavidH

関連する問題