我是计算机科学专业的学生。这个学期,我必须做一个项目(一个数独)。该项目的一个特点是建立历史。所以我开始实现这个功能。 “撤消”似乎有效,但我对重做有点问题。我想我明白了bug的来源,但我不知道如何修复它。
当我更改“案例”的值时,我将旧的“案例”添加到我的历史记录中。这允许我通过撤消来恢复它们。但是,当我“重做”时,第一个动作什么都不做,如果我可以做所有“重做”,那就错过了一个动作。我认为这是因为我只有旧的价值而不是新闻。但是,如果我添加新闻,问题就会逆转(撤消bug,redo有效吗?)。
如果您有想法或曲目,我很感兴趣!提前谢谢你!
以下是我在历史记录中添加项目时的代码:
// IN MY HISTORY CLASS
public E getCurrentElement() {
return leftQ.getLast();
}
public void add(E e) {
leftQ.addLast(e);
rightQ.clear();
currentPosition = currentPosition + 1;
endPosition = currentPosition;
}
// IN MY add actionPerformed
history.add(Case.duplicate(c)); // Add oldCase
c.addPossibleValue(++addedValues); // change old case
refresh();
当我“撤消”(工作)时代码:
// IN MY HISTORY CLASS
public void goBackward() {
currentPosition = currentPosition - 1;
rightQ.add(leftQ.removeLast());
}
// In my undo actionPerformed
c = history.getCurrentElement();
history.goBackward();
refresh();
代码,当我“重做”(不工作):
// IN MY HISTORY CLASS
public void goForward() {
currentPosition = currentPosition + 1;
leftQ.addLast(rightQ.poll());
}
// In my redo actionPerformed
history.goForward();
c = history.getCurrentElement();
refresh();
这是我调试时的执行跟踪: 首先,我在我的历史中添加2个元素。所以我的标签上有“1 2”。 在第一次撤消结束时:
LEFT : [Case : Candidates :[]
] --> FIRST Element on history, empty
RIGHT : [Case : Candidates :[1] // Second one, contains "1"
]
第二次撤消:
LEFT : []
RIGHT : [Case : Candidates :[]
, Case : Candidates :[1]
]
然后2重做:
LEFT : [Case : Candidates :[]
]
RIGHT : [Case : Candidates :[1]
]
LEFT : [Case : Candidates :[]
, Case : Candidates :[1]
]
RIGHT : []
我的标签只包含“1”。我认为它来自于我总是添加旧值的事实,因此我的历史记录在第一次撤消之前不包含对象的状态......但我不知道我该怎么办。
答案 0 :(得分:0)
使用链接列表可能是缩短撤消/重做实现的好方法。将您的转弯存储为列表中的节点,这样无论何时转弯,您都会在列表末尾生成一个新节点。在每个节点内部,保存电路板布局的int [3] [3]。调用undo时,通过在前一个列表节点上加载板来退回板。当调用redo时,该节点仍在那里,你可以向前迈进一步。通过执行此操作,您可以一直撤消到1,然后一直重做以转向x。由于这只是数独,使用链表不需要太多内存。对于更复杂的要求,此解决方案不是最佳选择。