私は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か何かと呼ばれる新しい直列化可能クラスへの参照にタイル参照を変更しようとしますボードはタイルを見つけることができます。
あなたは常に同じPRNGを使用し、種を保存する限り、ランダム性があることに注意してください。ユーザーの入力とシードを保存するだけで非常に良い方法です(私は自分のプラットフォームゲーム(まだどこかのゲームを持っています)... 1993年;)Warcraft III、StarCraft 2、ゲームを保存してリプレイを保存するために、そのテクニックを正確に使用します。 1時間に何百人ものユニットが参加しているプレイヤーが数人いる場合でも、リプレイは非常に小さいのです。ユーザーが入力できるのはユーザーの入力だけです... – TacticalCoder
追加の利点として、このようなテクニックもありますあなたのプログラム/ゲームの状態を再現しやすくなり、そのようなトリックを使用していないときよりも簡単にデバッグ/トレースを行うことができます。唯一の欠点は、ロジックが変更されるとすぐに古いセーブをロードすることができなくなるため、各セーブにバージョン番号を追加する必要があるかもしれないということです。 – TacticalCoder