使用备忘录模式来模拟围棋的和悔棋,使用java实现
时间: 2023-12-15 10:16:13 浏览: 91
好的,下面是使用备忘录模式来模拟围棋的和悔棋的示例代码(使用 Java 实现):
```java
// 备忘录类,用于保存围棋棋盘状态
public class ChessboardMemento {
private int[][] board;
public ChessboardMemento(int[][] board) {
this.board = board;
}
public int[][] getBoard() {
return board;
}
}
// 负责管理备忘录对象的存储和恢复
public class MementoCaretaker {
private List<ChessboardMemento> mementos = new ArrayList<>();
public void saveMemento(ChessboardMemento memento) {
mementos.add(memento);
}
public ChessboardMemento getMemento(int index) {
return mementos.get(index);
}
}
// 围棋游戏类
public class GoGame {
private int[][] board = new int[19][19]; // 初始化棋盘
private MementoCaretaker caretaker = new MementoCaretaker();
public void play(int x, int y, int player) {
// 下棋操作,改变棋盘状态
board[x][y] = player;
// 保存当前状态到备忘录对象中
ChessboardMemento memento = new ChessboardMemento(copyOf(board));
caretaker.saveMemento(memento);
}
public void undo() {
// 回退操作,将棋盘状态恢复到上一次保存的状态
ChessboardMemento memento = caretaker.getMemento(caretaker.size() - 1);
board = memento.getBoard();
caretaker.getMementos().remove(memento);
}
public void printBoard() {
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
private static int[][] copyOf(int[][] original) {
int[][] copy = new int[original.length][original[0].length];
for (int i = 0; i < original.length; i++) {
System.arraycopy(original[i], 0, copy[i], 0, original[i].length);
}
return copy;
}
}
// 测试代码
public class Main {
public static void main(String[] args) {
GoGame game = new GoGame();
game.play(1, 1, 1); // 黑方下在 (1, 1) 处
game.play(2, 2, 2); // 白方下在 (2, 2) 处
game.printBoard(); // 打印当前棋盘状态
game.play(3, 3, 1); // 黑方下在 (3, 3) 处
game.undo(); // 回退到上一步棋
game.printBoard(); // 打印回退后的棋盘状态
}
}
```
在上面的示例代码中,`ChessboardMemento` 类表示备忘录对象,保存了当前围棋棋盘的状态。`MementoCaretaker` 类负责管理备忘录对象的存储和恢复。`GoGame` 类实现了围棋游戏的逻辑,包括下棋和回退操作。在下棋时,将当前状态保存到备忘录对象中,并存储到 `MementoCaretaker` 对象中。在回退时,从 `MementoCaretaker` 对象中获取相应的备忘录对象,并将当前状态恢复为备忘录对象中保存的状态。在 Java 中,需要使用 `copyOf` 方法来复制二维数组,以避免对象引用的问题。
阅读全文