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