【问题标题】:How to add UNDO and REDO buttons to TableLayout panel in C#如何在 C# 中将 UNDO 和 REDO 按钮添加到 TableLayout 面板
【发布时间】:2020-07-17 19:17:26
【问题描述】:

我正在制作一个游戏,你将 8 个皇后放在棋盘上,这样皇后就不会攻击任何其他皇后。这是为了我的家庭作业。

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

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

【问题讨论】:

  • 您是否需要立即撤消表格?我认为在你的情况下,你需要使用任务模式让你自己撤消,因为你撤消的不仅仅是 ui - 它的撤消游戏动作

标签: c# undo tablelayoutpanel redo


【解决方案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;}

每次进行新的移动时,都会将具有填充值的新移动实例添加到列表中

例如

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

其中 x1、y1、x2、y2 的值​​取自移动开始和移动结束时的 GetRow()GetColumn()

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

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

【讨论】:

  • 您好,感谢您的回复。我编辑并添加了部分代码。我有 'onclick' 'picturebox' 和 6 个循环来改变不可用单元格的颜色。我是否必须添加您在每个循环中解释的这个列表动作?但是,我想当我按下撤消时,它只会撤消一种单元格颜色,而不是整个表格设置。
  • 你只想保留一个列表,假设这适用于屏幕上的皇后,否则每个皇后一个。所以它不会存储在您的 OnClick 事件中,而是存储在我认为是他 OnClick 事件处理程序所属的 Form 类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2014-06-28
相关资源
最近更新 更多