如何在 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()
的值。
要撤消移动,请使用存储在 SelectedMoveIndex
的 Move
值并向后播放,例如 endRow
和 endColumn
成为起始值,然后递减 SelectedMoveIndex
。重做将使用存储在 SelectedMoveIndex
的值,然后在 SelectedMoveIndex
之后递增。
如果您进行了未存储的新移动,那么您需要先删除 SelectedMoveIndex
之后的元素,然后再添加新的。
我正在制作一个游戏,您可以在棋盘上放置 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()
的值。
要撤消移动,请使用存储在 SelectedMoveIndex
的 Move
值并向后播放,例如 endRow
和 endColumn
成为起始值,然后递减 SelectedMoveIndex
。重做将使用存储在 SelectedMoveIndex
的值,然后在 SelectedMoveIndex
之后递增。
如果您进行了未存储的新移动,那么您需要先删除 SelectedMoveIndex
之后的元素,然后再添加新的。