gpt4 book ai didi

java - 如何保存我的程序状态然后加载它?

转载 作者:行者123 更新时间:2023-11-29 06:36:37 25 4
gpt4 key购买 nike

我正在尝试保存并重新加载我的 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 < all_cells) &&
(field[position] != COVERED_MINE_CELL)) {


current_col = position % cols;
field[position] = COVERED_MINE_CELL;
i++;

if (current_col > 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 < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
}

cell = position - cols;
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 < (cols - 1)) {
cell = position - cols + 1;
if (cell >= 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 < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
}
}
}
}


public void find_empty_cells(int j) {

int current_col = j % cols;
int cell;

if (current_col > 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 < all_cells)
if (field[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 < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

if (current_col < (cols - 1)) {
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 + cols + 1;
if (cell < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j + 1;
if (cell < all_cells)
if (field[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 < cols; j++) {

cell = field[(i * cols) + j];

if (inGame && cell == MINE_CELL)
inGame = false;

if (!inGame) {
if (cell == COVERED_MINE_CELL) {
cell = DRAW_MINE;
} else if (cell == MARKED_MINE_CELL) {
cell = DRAW_MARK;
} else if (cell > 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 < rows * CELL_SIZE)) {

if (e.getButton() == MouseEvent.BUTTON3) {

if (field[(cRow * cols) + cCol] > MINE_CELL) {
rep = true;

if (field[(cRow * cols) + cCol] <= COVERED_MINE_CELL) {
if (mines_left > 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();

}
}
}
}

最佳答案

有很多可能的选择...

你可以

使用 Properties API,它提供保存和加载功能。

API 的工作方式类似于 Map,允许您存储键/值对,您可以根据需要保存和加载它们。

API 只允许您存储 String 值,因此您需要手动转换非字符串值。

请记住保存它们,因为 API 不会自动保留更改

看看Properties了解更多详情。

你可以

滚动您自己的 XML 文件或使用类似 JAXB 的文件它允许您绑定(bind)对象的属性并将它们导出/导入 XML

这种方法比使用 Properties 更灵活,但引入了一定程度的复杂性

你可以

使用 Preferences API,它允许您存储 String 和原始值,而无需执行任何类型的转换。

Preferences API 也会自动加载和存储其内容,但它会在需要的地方加载和存储,因此您无法控制内容的存储位置。

你可以

使用独立/单用户数据库,如 H2HSQLDB例如。它有点复杂,但确实满足了基本的存储要求。

如果您更改要求,例如使用 PropertiesPreferences,还需要额外的时间来更新,如果您存储的只是细胞数据...恕我直言

你可以

尝试使用对象序列化,但 API 从来都不是用于对象状态的长期存储,而且它有很多问题,我个人会避免它,但就是我。

关于java - 如何保存我的程序状态然后加载它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com