首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻求对象克隆的帮助

寻求对象克隆的帮助
EN

Stack Overflow用户
提问于 2011-10-27 10:04:40
回答 3查看 100关注 0票数 0
代码语言:javascript
复制
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
    }

我要求在最多四次的情况下返回到前几个阶段的撤销功能。“要做到这一点,最简单的方法是创建一个拼图的副本,并将其存储在一个Puzzy数组中。为此,我实现了一个Clone方法。这将返回一个全新的拼图集,其设置与我调用Clone on的拼图完全相同。”这是我们的讲师所说的,但我仍然不知道如何实现它。

EN

回答 3

Stack Overflow用户

发布于 2011-10-27 10:15:40

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

有关堆栈的详细信息,请参见this article on Wikipedia;有关.NET堆栈泛型类的信息,请参阅this MSDN article

票数 2
EN

Stack Overflow用户

发布于 2011-10-27 14:02:31

下面是一个如何实现DBM提到的堆栈的小示例。与其克隆整个Puzzy类,我建议只克隆按钮数组(这应该足以满足您的撤消功能):

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

代码语言:javascript
复制
    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;
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2011-10-27 10:19:32

当你在一个方法中声明一个变量时,它将隐藏类中所有同名的变量。您应该只引用变量,而不是重新声明变量:

代码语言:javascript
复制
int myVariable = 0; // Will always be 0

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

如果你想明确一点,你可以添加'this.‘’。在变量名前面始终引用类变量:

代码语言:javascript
复制
this.myVariable = 5;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7910983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档