使用java Deque来跟踪国际象棋状态

时间:2014-01-12 02:47:56

标签: java android

我正在为国际象棋应用实施撤消重做方法。

到目前为止,我只通过创建一个 Deque 的电路板状态来实现撤消方法,每次我采取行动时,我都说

boardStatesStack.addFirst()

然后当我想撤消一个动作时,我说

boardStatesStack.removeFirst()

这可以作为"后进先出"数据结构是撤消移动所需要的,因为您添加到双端队列的最后一个板状态是撤消时检索到的状态。

但是,我想使用相同的堆栈实现重做方法。我怎么能这样做?问题是,当我撤消时,我调用removeFirst,这会删除董事会状态,所以我不能重做,因为它不在那里。我知道我可以跟踪已删除的状态,但我希望只需使用一个双端队列即可实现此撤消和重做方法。

2 个答案:

答案 0 :(得分:1)

如果你使用Stack,有一个pop()方法实际上删除并返回第一个元素,你可以简单地将该元素存储在某个地方(另一个列表)并在需要时再次访问它。

或者在Stack实现中创建此方法:

public Object pop() throws StackException{
    if (!isEmpty()) {
        Node temp = top;
        top = top.getNext();
        return temp.getItem();
    } else {
        throw new StackException("StackException on " + "pop: stack empty");
    }
}

注意:上述方法是基于堆栈是动态实现的,因此已经存在Node类。如果您的实现不同,您可能需要更改它,但这并不困难。

答案 1 :(得分:0)

使用列表并将自己的偏移量保留在列表中,而不是使用队列。撤消时,向下移动偏移量,然后重做时向上移动偏移量。当然,如果用户在撤消后进行新的移动,则需要丢弃重做方面的任何移动。