2010-12-11 59 views
1

我正在开发一个tic tac toe游戏,并且想要实现撤消方法。我觉得做这件事的最好方法就是设置另一个(多个)堆栈,并复制刚刚发生的“移动”。然后,如果撤消被调用,只需弹出最后一步并重新填充游戏板。Java - 使用多个堆栈以允许“撤消”方法

所以是的,我有想法,但无法弄清楚如何实现它。

一些什么,我有:

设置:

public void set(Position p, int v, int n) throws IOException { 
    if (board[p.x][p.y][p.z]!= 0) throw new IOException("Position taken"); 

    //Restrict 222 until all other's have been used 
    if (n != 26) { 
     if (p.x == 1 && p.y == 1 && p.z ==1) { 
      throw new IOException("[2,2,2] cannot be played until all other positions have been taken"); 
     } 
    } 

    //Enforce x=1 for first 9, x=3 for next 9 
    if (n < 9) { 
     if (p.x != 0) throw new IOException("Please play on x=1 for the first 9 moves"); 
    } 

    if (n >= 9 && n < 18) { 
     if (p.x != 2) throw new IOException("Please play on x=3 for the first 9 moves"); 
    } 

    board[p.x][p.y][p.z] = v; 
} 

然后有一个板的方法,建立董事会,显示方法,当然一个的连续检查3 。

感谢您的任何意见

+0

寻找GOF中的纪念品设计图案 – pastjean 2010-12-11 02:32:52

回答

4

有撤销和重做的设计模式。 命令设计模式。它被调用

public interface ICommand{ 
    void execute(); 
    void undo(); 
    void redo(); 
} 

执行上述接口来执行你的动作,执行会封装你的动作。

class MoveCommand implements ICommand{//parameter to store current board state 
    public MoveCommand(){ 
    // new board state is validated 
    } 
    public void execute(){ 
    // change the board state 
    } 
public void undo(){ // restore 
} 
public void redo(){ // apply again if possible 
} 
} 

现在创建一个新的类,这将是CommandDispatcher

class CommandDispatcher{ 
private List<ICommand> commands = new ArrayList<ICommand>(); 
public CommandDispatcher(){ 
} 
private ICommand currentCommand = null; 
public void setCommand(ICommand cmd){ 
    currentCommand = cmd; 
    cmd.execute(); 
    commands.add(cmd); 
} 
public void undoAll(){ 
    for(ICommand cmd : commands){cmd.undo();} 
} 
public void undo(){ 
commands.remove(commands.size()-1); 
currentCommand = commands.get(commands.size()-1) 
} 
public void redo(){ 
if(null!=currentCommand) currentCommand.redo(); 
} 

}

这样你可以保留你的应用程序的状态,并防止自己从获得空指针异常。 redo()方法将调用execute()方法。我只是为了清晰起见而添加了它

+0

即使我不是在制作一个tic tac toe游戏,我从你的答案中学到了一些非常有用的东西! – 2010-12-11 03:26:28

1

我会建议你把它封装了其具有的应用“移动”(BoardState S)和它类似的方法不应用的对象。 然后你可以保留这些的堆栈/列表。 撤销成为从堆栈弹出,并不适用于当前板状态。

由于你的apply/unapply方法是可逆的,所以这可能是解决它的最简单和最有效的方法之一(如果apply方法记住它覆盖的任何状态,则适用于更复杂的问题)。

如果这不是一个可以接受的解决方案,那么我建议你更详细地解释你的代码是如何工作的 - 重新计算所有数字,以及n代表什么,cos对我来说不是那么清楚。

2

直接进入四人帮Design Patterns的书,并阅读命令模式的部分。这就是你正在努力的方向 - 并且做得很好 - 一旦你明白了这个想法,用Java实现就会很简单。