2010-12-11 6 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; 
} 

그리고 거기 보드, 표시 방법을 구축 할 수있는 보드 방법이며, 물론 하나의 연속 3 확인은 . 어떤 조언

+0

GOF의 Memento 디자인 패턴 검색 – pastjean

답변

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 
} 
} 

지금

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

}

이 방법을 사용하면 응용 프로그램의 상태를 유지하고 nullpointer 예외를 받고에서 자신을 방지 할 수 있습니다 CommandDispatcher 수있는 ​​새로운 클래스를 만들 수 있습니다. redo() 메서드는 execute() 메서드를 호출합니다. 방금 설명을 추가했습니다.

+0

tic tac 발가락 게임을하고 있지는 않지만 답에서 매우 유용한 것을 배웠습니다! –

1

나는 당신이 적용되어있는 "이동"(BoardState들)과의 유사한 적용 취소 방법을 캡슐화하는 객체를 가지고 제안에 대한

감사합니다. 그런 다음 스택/목록을 유지할 수 있습니다. 실행 취소는 스택에서 팝이되어 현재 보드 상태를 적용 취소합니다.

적용/적용 취소 메소드가 되돌릴 수 있기 때문에 이것은 가장 간단하고 효율적인 해결 방법 중 하나 일 것입니다. 적용 메소드가 재정의하는 상태를 기억하면 더 복잡한 문제에 대해 작동합니다.

이것이 받아 들일 수있는 해결책이 아니라면 코드가 어떻게 작동하는지 더 자세히 설명 할 것을 제안합니다. 모든 숫자와 n이 나타내는 의미는 나에게 분명하지 않습니다.

2

Gang of Four Design Patterns 도서로 직접 이동하여 명령 패턴 섹션을 읽으십시오. 이것이 바로 당신이 일하는 것입니다. 그리고 그 일을 잘 수행 할 수 있습니다. 그리고 아이디어를 얻은 후에는 Java로 구현할 수 있습니다.

관련 문제