Как я могу сохранить состояние своей программы и загрузить ее?
Я пытаюсь сохранить и перезагрузить состояние моей программы Swing, которая в данном случае является игрой сапер. Мой код для платы ниже.
package mines; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; public class Board extends JPanel { public static void main (String[] args) {} private final int NUM_IMAGES = 13; private final int CELL_SIZE = 15; private final int COVER_FOR_CELL = 10; private final int MARK_FOR_CELL = 10; private final int EMPTY_CELL = 0; private final int MINE_CELL = 9; private final int COVERED_MINE_CELL = MINE_CELL + COVER_FOR_CELL; private final int MARKED_MINE_CELL = COVERED_MINE_CELL + MARK_FOR_CELL; private final int DRAW_MINE = 9; private final int DRAW_COVER = 10; private final int DRAW_MARK = 11; private final int DRAW_WRONG_MARK = 12; private int[] field; private boolean inGame; private int mines_left; private Image[] img; private int mines = 40; private int rows = 16; private int cols = 16; private int all_cells; private JLabel statusbar; public Board(JLabel statusbar) { this.statusbar = statusbar; img = new Image[NUM_IMAGES]; for (int i = 0; i < NUM_IMAGES; i++) { img[i] = (new ImageIcon(this.getClass().getResource((i) + ".png"))).getImage(); } setDoubleBuffered(true); addMouseListener(new MinesAdapter()); newGame(); } public void newGame() { Random random; int current_col; int i = 0; int position = 0; int cell = 0; random = new Random(); inGame = true; mines_left = mines; all_cells = rows * cols; field = new int[all_cells]; for (i = 0; i < all_cells; i++) field[i] = COVER_FOR_CELL; statusbar.setText(Integer.toString(mines_left)); i = 0; while (i < mines) { position = (int) (all_cells * random.nextDouble()); if ((position 0) { cell = position - 1 - cols; if (cell >= 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position - 1; if (cell >= 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols - 1; if (cell = 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols; if (cell < all_cells) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; if (current_col = 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols + 1; if (cell < all_cells) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + 1; if (cell 0) { cell = j - cols - 1; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j - 1; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols - 1; if (cell MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } } cell = j - cols; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols; if (cell MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } if (current_col = 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols + 1; if (cell MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + 1; if (cell MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } } } public void paint(Graphics g) { int cell = 0; int uncover = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j COVERED_MINE_CELL) { cell = DRAW_WRONG_MARK; } else if (cell > MINE_CELL) { cell = DRAW_COVER; } } else { if (cell > COVERED_MINE_CELL) cell = DRAW_MARK; else if (cell > MINE_CELL) { cell = DRAW_COVER; uncover++; } } g.drawImage(img[cell], (j * CELL_SIZE), (i * CELL_SIZE), this); } } if (uncover == 0 && inGame) { inGame = false; statusbar.setText("Game won"); } else if (!inGame) statusbar.setText("Game lost"); } class MinesAdapter extends MouseAdapter { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); int cCol = x / CELL_SIZE; int cRow = y / CELL_SIZE; boolean rep = false; if (!inGame) { newGame(); repaint(); } if ((x < cols * CELL_SIZE) && (y MINE_CELL) { rep = true; if (field[(cRow * cols) + cCol] 0) { field[(cRow * cols) + cCol] += MARK_FOR_CELL; mines_left--; statusbar.setText(Integer.toString(mines_left)); } else statusbar.setText("No marks left"); } else { field[(cRow * cols) + cCol] -= MARK_FOR_CELL; mines_left++; statusbar.setText(Integer.toString(mines_left)); } } } else { if (field[(cRow * cols) + cCol] > COVERED_MINE_CELL) { return; } if ((field[(cRow * cols) + cCol] > MINE_CELL) && (field[(cRow * cols) + cCol] < MARKED_MINE_CELL)) { field[(cRow * cols) + cCol] -= COVER_FOR_CELL; rep = true; if (field[(cRow * cols) + cCol] == MINE_CELL) inGame = false; if (field[(cRow * cols) + cCol] == EMPTY_CELL) find_empty_cells((cRow * cols) + cCol); } } if (rep) repaint(); } } } }
- Сериализация объекта в строку
- Сериализация XML и унаследованные типы
- DataContract Сериализация XML и атрибуты XML
- $ (this) .serialize () - Как добавить значение?
- Преобразование данных формы в объект JavaScript с помощью jQuery
- Имеет ли значение то, что я выбираю для serialVersionUID при расширении classов Serializable в Java?
- JSON.NET как сериализатор OAP для WebAPI 2 и ODataMediaTypeFormatter
- Как сериализовать словарь через WCF?
- Как заставить $ .serialize () учитывать отключенных: элементы ввода?
- Исключение MaxJsonLength в ASP.NET MVC во время JavaScriptSerializer
- Как я могу сериализовать внутренние classы с помощью XmlSerializer?
- FileMode.Open и FileMode.OpenOrCreate разница, когда файл существует? c # ошибка?
- Проверка того, является ли объект числом в C #
Есть несколько возможных вариантов …
Ты мог
Используйте API Properties
, который обеспечивает сохранение и загрузку.
API работает как Map
, позволяя вам хранить пары ключ / значение, которые вы можете сохранить и загрузить по мере необходимости.
API позволяет хранить только значения String
, поэтому вам нужно будет преобразовать значения, отличные от String, вручную.
Просто не забудьте сохранить их, поскольку API не автоматически сохраняет изменения
Посмотрите на свойства для более подробной информации.
Ты мог
Создайте собственный XML-файл или используйте что-то вроде JAXB, которое позволяет связывать свойства объекта и экспортировать / импортировать их в / из XML
Этот подход был бы более гибким, чем использование Properties
, но вводит уровень сложности
Ты мог
Используйте API Preferences
, который позволяет хранить значения String
и примитивов, без необходимости выполнять любой тип конверсии.
API Preferences
также автоматически загружает и сохраняет его содержимое, но он будет делать это там, где он хочет, поэтому вы теряете контроль над тем, где хранится контент.
Ты мог
Например, используйте автономную / однопользовательскую базу данных, например, H2 или HSQLDB . Это немного сложнее, но позаботится об основных требованиях к хранению.
Это также потребует дополнительного времени для обновления, если вы измените свои требования, что-то вроде использования « Properties
или « Preferences
и может быть немного переборщиком, если все, что вы храните, – это данные ячейки … IMHO
Ты мог
Попробуйте использовать сериализацию объектов, но API никогда не предназначался для долговременного хранения состояний объектов, а carrie – это проблема с задачами, и я бы лично избегал этого, но это я.
В Java-приложении существует множество способов для сериализации приложения. данные.
- Для апплетов есть куки.
- Для приложений. запущен с использованием JWS,
PersistenceService
- Любое приложение. может использовать API
Preferences
.
Все эти формы сериализации предназначены для материалов, которые могут быть закодированы в имя и значение на основе String.
- Файл
Properties
также хорош для информации типа name / value. - Для более сложных данных я бы создал компонент и использовал
XMLEncoder
/XMLDecoder
. - Zip-файл хорош для сериализации данных, которые могут быть во многих разных формах (например, часть XML, часть свойств, некоторые снимки экрана).
Если вы используете свойства, XML или Zip-архив, это хорошее место для сохранения информации. является подкаталогом user.home
. Он воспроизводимый и приложение. должны иметь права на чтение / запись.