私は uni の割り当てを完了しています。マインスイーパ ゲームのソース コードが与えられました。実装する必要がある特定の要件があります。これらの 1 つは、ユーザーがログインした後にすべてのゲームがディスクから読み取られ、ユーザーはいつでもゲームの進行状況を保存できることです。ゲームの進行状況を保存/ロードするためにシリアル化を読み込んでいますが、概念を理解するのが少し難しいと感じています。このためのコードをどこから書き始めればよいか、正確にはわかりません。このゲームは、他の多くのマインスイーパ ゲームのように 2D 配列を使用しません。誰かが理解しやすい優れたドキュメントを教えてくれませんか? Web ページが少し技術的になりすぎて、道に迷ってしまいます! または、掃海艇ゲームの進行状況を保存するより良い方法を知っている人はいますか? 私の質問が広範である場合は申し訳ありませんが、これについて学ぶために何を読むべきかについて100%確信が持てません。
2 に答える
ゲームが含まれている に関連するすべての情報を保存しますSTATE
。これは、ゲーム ボード (2D グリッドまたは保存方法)、プレイヤー名、スコアなどを意味します。
オブジェクトをシリアル化する方法に関する技術的な部分は比較的簡単です... http://www.javapractices.com/topic/TopicAction.do?Id=57を参照してください。ただし、静的変数や一時変数などには注意し、これらがシリアル化にどのように影響するかを知っておく必要があります (たとえば、静的クラス オブジェクトはシリアル化されずに失われます)。
何を保存する必要があるかを決定したら、ラッパーのように、すべての重要なオブジェクトへの変数/参照を含むクラスを作成できます。これは、多くの異なるファイルを保存することを避けたい場合です。また、シリアル化されるオブジェクトのすべてのクラス定義に追加する必要があります。implements Serialiable
したがって、以下の例ではSavedState
ラッパー オブジェクトを記述しますが、これには が含まれているため、シリアル化も可能Board
である必要があります。Board
保存する各オブジェクトを個別のファイルに書き込むこともできますが、重要な情報をすべて 1 つのオブジェクト/ファイルに保持するオブジェクトの方がクリーンであることがわかるため、1 つのオブジェクト/ファイルを使用することをお勧めします。
次に、割り当てを行い、オブジェクトを記述します。
例:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class Game {
Board board;
String name;
public static void main(String[] args) {
Game game = new Game();
game.InitBoard();
//Now save the board
game.SaveBoard();
System.out.println("Player Name is:"+game.name);
System.out.println("Saved Board, changing in memory playername to 'test'.");
game.name = "test";
game.LoadBoard();
System.out.println("Loaded Board, Player Name is:"+game.name);
}
public void InitBoard()
{
board = new Board();
name = "player...";
}
public void SaveBoard()
{
try {
SavedState state = new SavedState(board, name);
OutputStream file = new FileOutputStream("game.mine");
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
output.writeObject(state);
output.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void LoadBoard()
{
SavedState state;
InputStream file;
try {
file = new FileInputStream("game.mine");
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
state = (SavedState)input.readObject();
this.board = state.board;
this.name = state.playerName;
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Board implements Serializable {
ArrayList<Integer> boardElements = new ArrayList<Integer>(); // or however
// else you
// store
// your
// values
// etc...
public Board() {
boardElements.add(1); // etc...
}
}
class SavedState implements Serializable {
Board board;
String playerName;
public SavedState(Board board, String playerName) {
this.board = board;
this.playerName = playerName;
}
}
基本的に、シリアライゼーションを実装すると、保持するすべてのオブジェクトをシリアル化プロセスに変換して、メモリに保存できるようになります。
エンティティでのみ使用される場合、シリアル化は正しく実装されます
class MinesweeperState implements Serializable {
private Board board;
}
class Board implements Serializable {
private int[][] mineTable;
}
そして、設定と取得、テーブルの初期化内のロジック、地雷の充填、およびプロキシまたはアダプターに設定したいその周囲の地雷カウンターの設定だけです。
保存自体については、このコードで Manager を使用するだけです
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream(YOUR_FILENAME_CONSTANT,false);
out = new ObjectOutputStream(fos);
out.writeObject(minesweeperState);
out.close();
System.out.println("Minesweeper state persisted");
} catch (IOException ex) {
LOGGER.err(ex);
}