2013-10-03 4 views
1

uni에 대한 과제를 완료했습니다. 우리는 지뢰 찾기 게임의 소스 코드를 받았으며 구현할 특정 요구 사항이 있습니다. 이 중 하나는 사용자가 로그인 한 후에 모든 게임을 디스크에서 읽으며 사용자는 언제든지 게임 진행 상황을 저장할 수 있다는 것입니다. 게임 진행 상황을 저장 /로드하기 위해 직렬화를 읽었지만 컨셉을 파악하기가 다소 어려웠습니다. 나는 이것을위한 코드를 작성하는 곳을 정확히 알지 못한다. 이 게임은 다른 지뢰 찾기 게임처럼 2D 배열을 사용하지 않습니다. 누군가가 쉽게 이해할 수있는 좋은 문서를 가르쳐 줄 수 있습니까? 나는 약간의 웹 페이지가 너무 기술적이되어서 길을 잃어 버렸습니다. 또는 누군가가 지뢰 찾기 게임의 진행 상황을 저장하는 더 좋은 방법을 알고 있다면? 미안 내 질문이 광범위하다면, 나는 이것에 대해 배워야하는 것에 대해 100 % 확신 할 수는 없다. 그래서 나는 올바른 방향을 가리키며 도움을 청한다.직렬화를 사용하여 게임 (지뢰 찾기) 진행 진행

+0

와 관리자를 사용합니다. ObjectOutputStream과 ObectInputStream을 살펴볼 것을 권한다. – Nodebody

답변

0

당신은 게임에있는 STATE 관련된 모든 정보를 저장합니다. 이 게임 보드 (2D 그리드 또는 그러나 당신이 저장), 선수 이름, 점수 등

기술적를 의미 객체를 직렬화하는 방법에 관한 부분은 비교적 쉽습니다 ... http://www.javapractices.com/topic/TopicAction.do?Id=57을 참조하십시오. 그러나 정적 또는 일시 변수와 같은 항목에주의하고 이러한 변수가 직렬화에 미치는 영향을 알아야합니다 (예 : 정적 클래스 개체는 직렬화되지 않고 손실됩니다).

저장할 내용을 결정한 후에는 래퍼와 같이 모든 중요한 개체에 대한 변수/참조를 포함하는 클래스를 만들 수 있습니다. 많은 다른 파일을 저장하지 않으려는 경우입니다. 도 직렬화 될 객체의 모든 클래스 정의에 implements Serialiable을 추가해야합니다.

그래서 아래 예제에서는 SavedState 래퍼 객체를 작성하지만 여기에는 Board이 포함되어 있으므로 Board도 직렬화 할 수 있어야합니다. 저장할 각 개체를 별도의 파일에 쓸 수도 있지만 클리너가있어서이므로 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; 
    } 

} 
+0

철저히 설명해 주셔서 감사합니다. 침몰하기 시작했습니다.현재 클래스 보드 (새 게임의 모든 코드를 보유하고 있음)에 저장하거나, 저장하고 싶은 데이터를 저장하기 위해 만든 새로운 클래스에만 'Serializable 구현'을 추가합니까? 또한 확장판 .mine을 사용하여 보드를 저장했습니다. 내 꾸러미는 내 것이고 그래서 내가 그걸 저장하는거야? 아니면 어떤 확장 프로그램을 사용해야합니까? 나는 개념을 얻고있는 것 같지만 그것이 어떻게 저장되어 파일 선택 자에게 보내 졌는가, 그래서 사용자는 저장된 게임 목록에서 선택할 수있다. 죄송합니다. 아마도 완전히 새로운 질문 일 것입니다 :-) –

+0

원하는 파일 이름 + 확장자를 사용할 수 있습니다. 저장되는 모든 객체/데이터는 직렬화 가능해야하며 직렬화 가능 인터페이스를 구현해야합니다. 그것을 구현하는 것을 잊어 버리면 어떤 클래스에 implements 메소드가 누락되어 있는지 알려주는 Exception을 얻을 것이다. 또한 많은 자바 클래스 (예 : String 및 Hashmap)의 정의를 확인하면 직렬화를 지원합니다. 예 : 모든 구현 된 인터페이스 (http : //docs.oracle.com/javase/7/docs/api/java/lang/String.html)를 참조하십시오. 그렇지 않은 경우 해당 인스턴스를 직렬화 할 수 없습니다. –

1

은 기본적으로 당신은 당신이 메모리에 저장 될 수 있도록이 직렬화 프로세스에 개최 모든 개체를 변환하는 어떤 힘 직렬화를 구현합니다. 엔티티

class MinesweeperState implements Serializable { 
    private Board board; 
} 

class Board implements Serializable { 
    private int[][] mineTable; 
} 

에서만 사용되지 그리고 더 이상 세트보다하고, 테이블을 initializating 광산을 채우고 그 주변 광산 카운터를 설정 내에서 논리를 얻는 경우에

직렬화가 올바르게 I가 설정하려는 구현 프록시 또는 어댑터. 자신을 절약하기위한

, 그냥이 코드를 저장하고 스트림에 직렬화 가능 인터페이스를 구현하고, 따라서 파일에 자바 객체를로드 할 수 있습니다

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); 
}