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

How to add UNDO and REDO buttons to TableLayout panel in C#

我正在制作一个游戏,您可以在棋盘上放置 8 个皇后,这样任何皇后都不会攻击其他皇后。这是我的作业。

我在每个单元格中使用 TableLayoutPanel 8x8 和 PictureBox。它们会在单击时更改颜色或图片,并向用户显示可用的单元格。 但是我想实现撤消,这样如果用户不喜欢他放置女王的位置,他可以退后一步。我在谷歌上搜索了很多,但每一个撤销-重做解决方案都是关于整数和字符串的,我不知道如何将它用于我的 table 面板。 你们知道怎么做吗?我尝试制作另一个复制面板并将原始复制面板复制到其中,然后再更改颜色,如果我想撤消,以实际显示复制面板,但由于某种原因它不起作用。

如果已经在某处回答了如何撤消 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++;                  
            }

欢迎来到 Whosebug。

通常情况下,我们会要求您提供一些代码来帮助我们解决您的问题,但我会尝试在不提供代码的情况下为您提供一些指导。

您需要保留过去移动的历史记录,在这种情况下,这将是关于女王从哪里开始到结束的单元格位置的历史记录。

我怀疑您一定是在使用 OnClick 事件或类似事件来确定选择了哪个皇后以及将其移动到何处 - 如果不是,则逻辑仍然相同。

您想使用 TableLayoutPanel 控件的 GetRow 和 GetColumn 方法并将结果存储在列表控件中,例如

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() 的值。

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

如果您进行了未存储的新移动,那么您需要先删除 SelectedMoveIndex 之后的元素,然后再添加新的。