2010-12-11 8 views
1

私はチックタックのつま先のゲームに取り組んでおり、元に戻す方法を実装したいと考えています。私が感じることは、これを行うための最良の方法は、別の(複数の)スタックをセットアップして、ちょうど起こった '動き'のコピーを作ることです。その後、取り消しが呼び出された場合は、最後の移動をポップし、ゲームボードを再投入します。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; 
} 

はその後ボード、表示方法を構築するためのボードの方法があり、そしてもちろん1行に3をチェックします。何かアドバイス

+0

GOFのメンデントデザインパターンを検索 – pastjean

答えて

4

アンドゥとやり直しを行うデザインパターンがあります。 コマンドデザインパターン。それはあなたの移動を実行する上記のインターフェイスを実装し、実行はあなたのアクションをカプセル化します

を実装します。

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(); 
} 

}

、あなたのアプリケーションの状態を保存し、nullポインタ例外を得ることから自分を防ぐことができますこの方法になります新しいクラスを作成します。 redo()メソッドはexecute()メソッドを呼び出します。私は分かりやすくするために追加しました。

+0

私はチックタックのつま先のゲームに取り組んでいませんが、私はあなたの答えから非常に有用なものを学びました! –

1

私はあなたが適用されている「移動」(BoardState S)およびそれに類似の適用を解除する方法をカプセル化するオブジェクトを持っていることを示唆しているため

感謝。 次に、これらのスタック/リストを保持することができます。 元に戻すとスタックからポップになり、現在のボード状態に適用されなくなります。

適用/適用解除メソッドは元に戻すことができるので、これはおそらく最も簡単で効率的な解決方法の1つです(適用メソッドがオーバーライドした状態を覚えている場合は、

これが許容できる解決策でない場合は、コードがどのように働くかを説明することをお勧めします。すべての数値とnの略語は、わかりません。

2

「Gang of Four Design Patterns」の書籍に直接アクセスし、「コマンド」パターンのセクションを読んでください。それはあなたが取り組んでいることです。それをうまくやっています。そして、一度アイデアを得たら、Javaで実装するのは簡単です。

関連する問題