寻求Object Clone的帮助

时间:2011-10-27 02:04:40

标签: c#

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
    }

我要求执行撤消功能,以便最多返回前几个阶段四次。 “最简单的方法是创建一个拼图的副本,并将其存储在一个拼图数组中。为此,我实现了拼图的克隆方法。这将一个全新的拼图设置为与拼图完全相同的设置我打电话给克隆。“这是我们的教师所说的,但我仍然不知道如何实现这一点。

3 个答案:

答案 0 :(得分:2)

实现“撤消”功能的最简单方法可能是使用堆栈。对于您在拼图上执行的每个操作,将实例推送到堆栈。当用户选择撤消移动时,将实例从堆栈中弹出。

有关堆栈的更多信息,请参阅this article on Wikipedia,以及.NET Stack泛型类的this MSDN article

答案 1 :(得分:1)

这是一个如何实现DBM提到的堆栈的小例子。我不建议克隆整个Puzzle类,而是建议克隆按钮数组(这对于你的Undo函数应该足够了):

编辑:如果您需要跟踪按钮的颜色而不是按钮的位置,您可能只需将按钮当前颜色的数组放在堆栈上

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

答案 2 :(得分:0)

在方法中声明变量时,它将隐藏类中具有相同名称的所有变量。您不应该重新声明变量,而应该引用它:

int myVariable = 0; // Will always be 0

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

如果您想要明确,可以添加'this'。在变量名前面总是引用类变量:

this.myVariable = 5;