我正在做的游戏中,您在棋盘上放置了8个皇后,因此没有一个皇后会攻击其他人。这是我的功课。
我在每个单元格中将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++;
}
欢迎使用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()
。
[要撤消移动,请使用存储在Move
的SelectedMoveIndex
值并向后播放,例如endRow
和endColumn
成为起始值,然后减小SelectedMoveIndex
的值。重做将使用存储在SelectedMoveIndex
处的值,然后再递增SelectedMoveIndex
。
如果您进行的新动作尚未存储,则需要在SelectedMoveIndex
之后删除元素,然后再添加新的动作。