我正在Swing中构建一个基于Java的游戏,它本质上是一个Jbuttons网格
我有一个名为Cell的Object,它是一个自定义JButton,带有用于存储对象的附加参数。游戏网格由Cell[][]
我有一个Cell[][]
类型的arraylist,允许我在每次移动后存储gamegrid的状态。如果我要撤消移动,我需要将ArrayList的最后一个元素复制到游戏网格,以允许它显示在UI上。
我的游戏网格是panelHolder
,我的arraylist是moveHolder
。
到目前为止,我已经尝试Collections.copy(panelHolder, moveHolder.get(moveHolder.size()));
由于“参数不适用于类型Cell[][]
”而无法编译
我也尝试了System.arraycopy(moveHolder.get(moveHolder.size()-1), 0, panelHolder, 0, panelHolder.length);
,它抛出并超出界限异常。最初我认为这是由于moveHolder.size()-1
,但即使只是moveHolder.size()
它也有同样的问题。
我在StackOverflow和其他人身上发现了很多问题,他们都展示了这两种方法,但我似乎无法让它发挥作用。有什么比我更缺的了吗?全类方法如下:
public class UndoClass implements MoveCommand{
public ArrayList<Cell[][]> moveHolder = new ArrayList<Cell[][]>();
public Cell[][] execute(Cell[][] panelHolder) {
if (moveHolder.size() > 0){
Collections.copy(panelHolder, moveHolder.get(moveHolder.size()));
if (moveHolder.size() > 0){
moveHolder.remove(moveHolder.size());
}
}
System.out.println("Move Undone. Undos available:" + moveHolder.size());
return panelHolder;
}
public void addMove(Cell[][] panelHolder){
moveHolder.add(panelHolder);
}
public ArrayList<Cell[][]> getMoves(){
return moveHolder;
}
}
细胞分类
public class Cell extends JButton {
int co_x = 0;
int co_y = 0;
ArrayList<Players> current = new ArrayList <Players>();
}
答案 0 :(得分:1)
只是想指出我们的execute(...)方法接受Cell [] []作为参数和返回参数。这种方法将强制所有命令继续将输入参数数组复制到return语句数组。请注意,如果您不需要保持两者同步,并且只使用返回arg,则根本不必担心复制:
Cell[][] lastState = moveHolder.get(moveHolder.size()-1);
moveHolder.remove(moveHolder.size()-1);
return lastState; // Not updating the panelHolder array, just returning
但是当然现在输入parm和return不同步。相反,您可能希望将该状态封装到单个对象中,以使您的生活更轻松。这样的事情(请注意,execute现在返回一个void):
public ArrayList<GameState> previousStates = new ArrayList<GameState>();
public void execute(GameState currentState) {
if (previousStates .size() > 0) {
GameState lastState = previousStates.get(previousStates.size()-1);
currentState.restoreFrom(lastState);
previousStates .remove(moveHolder.size()-1);
}
}
祝你好运!
答案 1 :(得分:0)
if (moveHolder.size() > 0) {
for (int i = 0; i < panelHolder.length; i++) {
panelHolder[i] = moveHolder.get(moveHolder.size()-1)[i].clone();
}
moveHolder.remove(moveHolder.size()-1);
}
试试这个。复制2D数组时,需要复制每个内部数组。
答案 2 :(得分:0)
尝试链接列表
LinkedList<Cell[][]> ll = new LinkedList();
ll.removeLast();
panelHolder = ll.clone();