如何在C#中将Undo和REDO按钮添加到TableLayout面板中

问题描述 投票:0回答:1

我正在做的游戏中,您在棋盘上放置了8个皇后,因此没有一个皇后会攻击其他人。这是我的功课。enter image description here

我在每个单元格中将TableLayoutPanel 8x8与PictureBox一起使用。它们在单击时更改颜色或图片,并向用户显示哪个单元可用。但是我想实现撤消功能,因此如果用户不喜欢放置皇后的位置,可以退后一步。我在Google上搜索了很多,但是每个撤消重做解决方案都是关于整数和字符串的,而且我不知道如何在表面板中使用它。你们有什么想法吗?我尝试制作另一个复印面板并将原始复印面板复制到其中,然后再进行颜色更改;如果要撤消操作,则实际上要显示复印面板,但由于某种原因它不起作用。

如果已经在某处回答了如何对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++;                  
            }
c# undo tablelayoutpanel redo
1个回答
1
投票

欢迎使用StackOverFlow。

通常,我们会要求您提供一些代码来帮助我们解决您的问题,但我会尽力为您提供一些没有的指示。

您需要保留过去动作的历史记录,在这种情况下,这将是女王/王后开始到其结束的单元位置的历史。

[我怀疑您必须使用OnClick事件或类似方法来确定选择了哪个皇后以及将其移动到的位置-如果没有,则逻辑将仍然相同。

您想使用TableLayoutPanel控件的GetRow和GetColumn方法并将结果存储在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()

[要撤消移动,请使用存储在MoveSelectedMoveIndex值并向后播放,例如endRowendColumn成为起始值,然后减小SelectedMoveIndex的值。重做将使用存储在SelectedMoveIndex处的值,然后再递增SelectedMoveIndex

如果您进行的新动作尚未存储,则需要在SelectedMoveIndex之后删除元素,然后再添加新的动作。

© www.soinside.com 2019 - 2024. All rights reserved.