Как реализовать функцию отмены - PullRequest
1 голос
/ 27 октября 2011

Я пишу программу под названием Flipper, которая имеет 3x3 ячейки для головоломки. Каждая ячейка (кнопка) имеет зеленый цвет в начале. При щелчке по определенной ячейке эта ячейка и соседние ячейки переворачиваются (меняют цвет). И еще одно требование - функция отмены, которая возвращается к предыдущему этапу. Я понятия не имею, как это реализовать. Это главное, что происходит в игре.

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 } };
    //button reference from form1
}
public void reset()
{
   //reset all the colors of buttons in the puzzle to lime
}

public void FlipCells(int row, int col)
{        
   //when certain button is clicked(this event is done in the form1.cs), say for (0,0) change color of cell (0,0),///(0,1) and (1,0) by calling changeColor method
}

public void changeColor(int row, int col)
{
    //test current color of the cell, and change it
}

Я прошу реализовать функцию отмены в классе с именем Undo. Любые идеи приветствуются !!!

Ответы [ 6 ]

5 голосов
/ 27 октября 2011

Отдельную отмену можно реализовать, зная, что изменилось с последней операцией.

Как выясняется, отмена переворачивания можно сделать ... перевернув его снова. Так что просто запомни свой последний ход и повтори его!

Вы можете делать это столько раз, сколько захотите, до начального состояния игры, если вы помните каждый ход. Вы можете сделать это, создавая стопку ходов, которые вы нажимаете по мере движения и выталкиваете при отмене.

В общем, чтобы отменить, вам нужно сделать 3 вещи:

  1. Для каждого действия, которое может выполнить пользователь, выполните обратное действие, которое отменит его.
  2. Каждый раз, когда пользователь совершает действие, запоминайте его, чтобы вы знали, какое обратное действие необходимо предпринять (если необходимо).
  3. Когда пользователь указывает, что хочет отменить, сопоставьте последнее, что он сделал, с его обратным действием и выполните его.

Иногда очень трудно создать обратное действие. В этих случаях становится проще просто сохранить состояние программы перед выполнением действия, а затем перезагрузить его, когда пользователь хочет отменить.

2 голосов
/ 27 октября 2011

Существует множество вариантов реализации функции отмены.

Поскольку это домашняя работа, я просто укажу на структуру данных Stack. Стек является последним, первым вышел. Думайте об этом как о пачке бумаг на столе.

Когда игрок переворачивает квадрат, вы записываете его и добавляете в стек (так называемый «толчок»). Игрок переворачивает другую клетку: вы делаете еще одну заметку и затем толкаете ее на вершину стека.

Когда запрашивается «отменить», какую операцию вы хотите отменить? Самый последний - так вы рисуете сверху стека (называется «поп»). Вызов Stack.Pop () вернет самый верхний (самый последний) элемент из стека и удалит этот элемент из стека.

Этого должно быть достаточно, чтобы начать - выясните, что вам нужно в стеке, и вы почти закончили.

Дальнейшее чтение:
Stack: http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx
Stack<T>: http://msdn.microsoft.com/en-us/library/3278tedw.aspx

1 голос
/ 27 октября 2011

Несмотря на то, что в вашей ситуации это, вероятно, излишне, шаблон проектирования Memento является стандартным способом реализации функций отмены (и повтора).

Memento сохранит текущее состояние объекта и будет иметь функцию восстановления, которая будет отменять изменения объекта, с которым он связан.

Таким образом, в вашем случае Memento сохранит состояние доски (каждый цвет для каждой ячейки) и применительно к доске установит цвета.

1 голос
/ 27 октября 2011

Реализация шаблона команд. где вы на самом деле отслеживаете свои команды в каком-то словаре, массиве или стеке, а затем отменяете

перейдите по этой ссылке http://www.codeproject.com/KB/architecture/sharped.aspx

1 голос
/ 27 октября 2011

возможно, подумайте о том, что произойдет, когда вы «отмените» ход. все те, которые вы только что перевернули, перевернуты (или снова), если у вас есть только два цвета, которые

0 голосов
/ 27 октября 2011

Если у вас есть только два цвета, то отмена не отличается от changeColor для ячейки, для которой вы ее вызвали. Поэтому все, что вам нужно сделать, это сохранить (в переменных-членах) последний столбец и строку, для которой был вызван changeColor, и в функции отмены сделать еще один вызов changeColor с сохраненными значениями.

...