我正在Swing中构建一个基于Java的游戏,它实质上是Jbuttons的网格

我有一个称为Cell的对象,它是一个自定义JButton,带有用于存储对象的其他参数。游戏网格由Cell[][]表示

我有一个Cell[][]类型的arraylist,允许我在每次移动后存储gamegrid的状态。如果要撤消移动,则需要将ArrayList的最后一个元素复制到游戏网格中,以使其可以在UI上显示。

我的游戏网格为panelHolder,而数组列表为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>();

}

最佳答案

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阵列时,需要制作每个内部阵列的副本。

10-06 09:03