Member 13620781 Ответов: 1

Как сохранить текущее состояние шахматной партии в файл на java?


Я хочу сохранить текущее положение фигур на доске после того, как пользователь нажмет на кнопку Сохранить. Я реализовал "сериализуемый" в классе Board, но когда я нажимаю на кнопку save, возникают некоторые ошибки во время выполнения. Можете ли вы помочь мне решить эту проблему? Я новичок в этом графическом интерфейсе java. Заранее спасибо.

Что я уже пробовал:

public class Board extends JPanel implements ActionListener, Serializable
{
	JPanel cardss;
	JButton[] square = new JButton[42];
	JButton save = new JButton("Save");
	JButton quit = new JButton("Quit");
	MenuPage menupage;
	Tile tile = Tile.getInstance();
	boolean firstClick = true;
	int count = 0;
	int player = 1;
	JLabel player_label;
	JLabel player_status;
	JFrame frame = new JFrame();
	JFrame f;
	private Board()
	{
		// super("Chess Board");
		
		// setJMenuBar(MyChessBar);
		Dimension boardSize = new Dimension(600, 650); //(width, height)
		Dimension player_panel = new Dimension(180, 650); //(width, height)

		JPanel topPanel = new JPanel(new FlowLayout());
		JPanel boardPanel = new JPanel(new GridLayout(0,7));
		JPanel player_turn = new JPanel(new FlowLayout());
		player_turn.setBackground(Color.yellow);
		
		player_label = new JLabel("Moved : " + count);
		player_status = new JLabel("TURN : PLAYER " + player);
		// JTextField text = new JTextField(15);
		// text.setText( "Player :" + count + " turn ");
		player_turn.add(player_label);
		player_turn.add(player_status);
		save.addActionListener(this);
		quit.addActionListener(this);		
		
		topPanel.add(save);
		topPanel.add(quit);
		// setPreferredSize(boardSize);
		
		for(int i=0; i<42; i++)
		{
			square[i] = new JButton();
			if(i%2==0)
			{
				square[i].setBackground(Color.black);
				tile.setTileFalse(i);
				square[i].addActionListener(this);
			}
			else
			{
				square[i].setBackground(Color.white);
				tile.setTileFalse(i);
				square[i].addActionListener(this);
			}
			boardPanel.add(square[i]);
			tile.setTileLoc(i);

		} // close for loop
		
		boardPanel.setPreferredSize( boardSize );
		player_turn.setPreferredSize( player_panel);
		setLayout(new BorderLayout(2,2));
		add(topPanel, BorderLayout.NORTH);
		add(boardPanel, BorderLayout.WEST);
		add(player_turn, BorderLayout.EAST);
		
		// cardss = new JPanel(new CardLayout());
		// menupage = new MenuPage();
		// cardss.add(menupage, "Menu");
		// add(cardss);
		
		setSize(800,800);
		setVisible(true);

	} //close for board
	
	private static class SingletonHolder {
        private static final Board INSTANCE = new Board();
    }
	
	public static Board getInstance() {
        return SingletonHolder.INSTANCE;
    }

	public void actionPerformed(ActionEvent e)
	{
		String choice_in_game = e.getActionCommand();
		
		if(choice_in_game.equals("Save"))
		{
			
			// save game
			// saveGameDataToFile(chess);
			try
			{
                           FileOutputStream file = new FileOutputStream("chess.txt");
				ObjectOutputStream object = new ObjectOutputStream(file);
				object.writeObject(new Board());
				object.close();

			 // create a dialog Box 
            JDialog d = new JDialog(f, "Chess Game"); 
  
            // create a label 
            JLabel l = new JLabel("Game is successfully saved!"); 
  
            d.add(l); 
  
            // setsize of dialog 
            d.setSize(200,100); 
			d.setLocationRelativeTo(null);
  
            // set visibility of dialog 
            d.setVisible(true); 

			}
			catch(Exception ex)
			{
				ex.printStackTrace();
			}
		}
}

	public void setPiecePic(int i, String name){
		square[i].setIcon(loadImage(name));
		tile.setTileTrue(i);
	}
	
	public void setPieceNull(int i){
		square[i].setIcon(null);
		tile.setTileFalse(i);
	}

	private ImageIcon loadImage(String path){
        Image image = new ImageIcon(this.getClass().getResource(path)).getImage();
        Image scaledImage = image.getScaledInstance(82, 82,  java.awt.Image.SCALE_SMOOTH);
        return new ImageIcon(scaledImage);
    }
	
	public void setEveryPiece(){
		
		setPiecePic(0,"PlusB.png");
		setPiecePic(1,"TriangleB.png");
		setPiecePic(2,"ChevronB.png");
		setPiecePic(3,"SunB.png");
		setPiecePic(4,"ChevronB.png");
		setPiecePic(5,"TriangleB.png");
		setPiecePic(6,"PlusB.png");
		
		setPiecePic(35,"PlusR.png");
		setPiecePic(36,"TriangleR.png");
		setPiecePic(37,"ChevronR.png");
		setPiecePic(38,"SunR.png");
		setPiecePic(39,"ChevronR.png");
		setPiecePic(40,"TriangleR.png");
		setPiecePic(41,"PlusR.png");
		
		tile.setAllPiece();
	}

	public JButton getButton(int x){
		return square[x];
	}
	
	public JButton[] getSquare(){
		return square;
	}
	
	public void getStatus(int count, int player) {
		player_label.setText("Moved: " + count);
		player_status.setText("TURN : PLAYER " + player);	
	}
}

Patrice T

А вы планируете сообщать сообщения об ошибках и позиции ?

1 Ответов

Рейтинг:
0

Richard MacCutchan

object.writeObject(new Board());

Почему вы пытаетесь сохранить новый объект платы, а не тот, который существует в приложении?

Вам также нужно точно объяснить, какие ошибки во время выполнения вы получаете, мы не можем догадаться.


Member 13620781

извините, что не сообщаю подробностей ошибок, но я изменил код и у меня возникли некоторые проблемы с загрузкой данных из файла. Я представлю вопрос и предоставлю ошибки. Вы не могли бы мне помочь? Спасибо.

Richard MacCutchan

Отметьте этот вопрос как решенный и откройте новый.