Как добавить кнопки UNDO и REDO на панель TableLayout в C# - PullRequest
0 голосов
/ 05 апреля 2020

Я создаю игру, в которой вы кладете 8 ферзей на шахматную доску, чтобы никакие ферзя не атаковали других. Это для моей домашней работы. enter image description here

Я использовал TableLayoutPanel 8x8 с PictureBox в каждой ячейке. Они меняют цвет или изображение при нажатии и показывают пользователю, какая ячейка доступна. Но я хотел реализовать Undo, поэтому пользователь может go отступить, если ему не нравится, где он разместил свою королеву. Я много гуглил, но каждое отдельное решение об отмене повторения касается целых чисел и строк, и я не представляю, как использовать его для моей панели таблицы. Ребята, вы знаете, как это сделать? Я попытался создать еще одну панель копирования и скопировать в нее оригинальную копию, прежде чем произойдет изменение цвета, и, если я захочу отменить, на самом деле отобразить панель копирования, но по какой-то причине она не работает.

Если это где-то уже ответили, как сделать отмену для TableLayoutPanel Можете ли вы привести меня к этому руководству?

  private void pictureBox1_Click(object sender, EventArgs e)
    {
        PictureBox picture =  (PictureBox)sender;
        //checking if cell is empty 
        if(picture.BackColor==Color.White)
        { 
            picture.Image = Properties.Resources.kraljica;

            int column = tableLayoutPanel1.GetCellPosition(picture).Column;
            int row = tableLayoutPanel1.GetCellPosition(picture).Row;

            int j = column;
            int i = row;
            //changing color of down right diagonal according to current position of queen
            while (i <= 7 && j <= 7)
            {
                tableLayoutPanel1.GetControlFromPosition(j, i).BackColor = Color.DarkRed;
                i++;
                j++;                  
            }

1 Ответ

1 голос
/ 06 апреля 2020

Добро пожаловать в StackOverFlow.

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

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

Я подозреваю, что вы должны использовать событие OnClick или что-то похожее, чтобы определить, какая королева выбрана и куда она перемещена - если нет, то logi c все равно будет таким же.

Вы хотите использовать методы GetRow и GetColumn элемента управления TableLayoutPanel и сохранить результат в элементе управления List, например

public class Move
    {
      int startRow;
      int startColumn;
      int endRow;
      int endColumn;
    }

, затем в вашем коде есть свойства

public List<Move> ListOfMoves = new List<Move>();
public SelectedMoveIndex {get;set;}

Каждый раз, когда выполняется новый ход, добавляйте новый экземпляр Move с заполненными значениями в список

например,

ListOfMoves.Add(new Move(){startRow = x1, startColumn=y1, endRow=x2, endColumn=y2};
SelectedMoveIndex = ListOfMoves.Count -1;

, где x1, y1, x2, y2 имеют значения, взятые из GetRow() & GetColumn() при начале и конце хода.

Отмена переместить использовать значение Move хранятся в SelectedMoveIndex и воспроизводятся в обратном направлении, например, endRow и endColumn становятся начальными значениями, а затем уменьшаются до значения SelectedMoveIndex. Redo будет использовать значения, хранящиеся в SelectedMoveIndex, а затем увеличивать SelectedMoveIndex.

Если вы делаете новый ход, который не сохраняется, вам нужно будет удалить элементы после SelectedMoveIndex перед добавлением новый.

...