2011-10-27 2 views
1
class Puzzle 
{ 
    public int PUZZLESIZE = 3; 
    public int numSteps = 0; 
    public Button[,] buttons; 

    public Puzzle(Form1 form1) 
    { 
     buttons = new Button[3, 3] { { form1.button1, form1.button2, form1.button3 }, 
            { form1.button4, form1.button5, form1.button6 }, 
            { form1.button7, form1.button8, form1.button9 } }; 
    } 

    public Puzzle Clone() 
    { 
     return (Puzzle)this.MemberwiseClone();   
    } 

    public void reset() 
    { 
     //reset all 9 buttons color 
    } 

    public void flipcells() 
    { 
     //flip cells in the puzzle with color change 
    } 

class Undo 
{ 
    Puzzle newPuzzle; //null value here. Why??? 

    public Undo(Puzzle oldPuzzle) 
    { 
     Puzzle newPuzzle = oldPuzzle.Clone(); 
    }    

    public void undo() 
    { 
     //back to previous step, ie the color of the buttons go back to previous color 
    } 

이전 단계의 실행 취소 기능을 최대 4 회 실행하도록 요청하고 있습니다. "가장 쉬운 방법은 퍼즐의 복사본을 만들어 퍼즐 배열에 저장하는 것입니다.이를 위해 퍼즐을위한 Clone 메서드를 구현했습니다. 이렇게하면 완전히 새로운 퍼즐 세트가 퍼즐과 똑같은 설정으로 반환됩니다. 클론을 불렀다. " 이것은 강사가하는 말입니다. 그러나 저는 이것을 구현하는 방법을 아직 모릅니다.Object Clone에 대한 지원을 찾는

+0

그런데 답변을 수락하는 것을 잊지 마십시오. –

답변

2

"실행 취소"기능을 구현하는 가장 쉬운 방법은 스택을 사용하는 것입니다. 퍼즐에 대한 각각의 동작에 대해 스택에 인스턴스를 푸시합니다. 사용자가 이동 취소를 선택하면 스택에서 인스턴스를 팝합니다.

스택에 대한 자세한 내용은 this article on Wikipedia을 참조하고 .NET 스택 일반 클래스에는 this MSDN article을 참조하십시오.

+0

스택을 실행 취소 클래스로 선언합니까 ??? –

+0

스택을 실행 취소 클래스라고 생각하십시오. 그 일은 퍼즐의 이전 상태를 유지하는 것입니다. –

0

메소드 내에서 변수를 선언하면 동일한 이름을 가진 클래스의 변수를 숨 깁니다. 변수를 다시 선언하는 대신 다음을 참조해야합니다.

int myVariable = 0; // Will always be 0 

public void SetMyVariable() 
{ 
    int myVariable = 5; // Isn't the same as above 
} 

명시 적으로 나타내려면 'this'를 추가하면됩니다. 변수 이름 앞에 항상 항상 변수를 참조하십시오.

this.myVariable = 5; 
1

다음은 DBM에서 언급 한 스택을 구현하는 방법에 대한 간단한 예입니다. 전체 Puzzle 클래스를 복제하는 대신 Button 배열을 복제하는 것이 좋습니다 (실행 취소 기능으로 충분해야 함).

편집 : 버튼 대신에 버튼의 현재 색상 배열을 스택에 넣을 수 있습니다.

Stack<Button[,]> stack = new Stack<Button[,]>(); 

    private void button4_Click(object sender, EventArgs e) 
    { 
     Button[,] buttons = new Button[2, 2] { { button1, button2 }, { button3, button4 } }; 
     stack.Push((Button[,])buttons.Clone()); 
     buttons[0, 0] = button2; 
     buttons[0, 1] = button1; 
     stack.Push((Button[,])buttons.Clone()); 
     buttons[1, 0] = button4; 
     buttons[1, 1] = button3; 
     stack.Push((Button[,])buttons.Clone()); 
     timer1.Enabled = true; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (stack.Count > 0) 
     { 
      Button[,] buttons = stack.Pop(); 
      txtButtonOrder.Text = buttons[0, 0].Text + buttons[0, 1].Text + buttons[1, 0].Text + buttons[1, 1].Text; 
     } 
     else 
     { 
      timer1.Enabled = false; 
     } 
    } 
관련 문제