点完悔棋按钮后全部的棋子都不见了 但是除了悔棋的棋子之外之前下的棋子的位置再下棋子显示的是已经被占用 我是用一个列表来存储每次下棋的位置的
要在OnPaint里面绘制棋盘面
仔细看刷新的代码,到底执行了什么了,你把重绘写哪了
悔棋后再根据列表来绘制一次就行
可能是因为悔棋操作存在问题,没有正确地从存储棋子的列表中移除被悔棋的位置,并重新在窗口中显示出来。
根据你提供的代码,我注意到在悔棋操作中确实存在这样的问题。在你的代码中,只是移除了悔棋列表中最后加入的元素,但没有更新存储棋子位置的数组,所以悔棋后所有棋子都从窗口中消失了。
你需要在悔棋操作中,除了移除悔棋列表中的元素之外,还要在存储棋子位置的数组中标记这个位置上的棋子不存在。因此,需要修改以下代码:
在执行悔棋操作之前,需要先判断悔棋列表是否为空,如果为空,则不执行任何操作。你已经在代码中加入了这个判断,这是正确的。
根据你提供的代码,可以看出 boardArry
数组用来存储棋子的位置信息。因此,在悔棋操作中需要将悔棋的位置在 boardArry
中标记为空,即赋值为 0,否则被悔棋的位置在窗口中仍然会显示有棋子存在,造成混乱。
修改后的代码如下:
private void button1_Click(object sender, EventArgs e)
{
int index = RetractList.Count - 1;//获取最后一步存储的位置信息
if (index == -1)
{
MessageBox.Show("无法继续悔棋!", "提示");
return;
}
Retract retract = RetractList[index];
if (MessageBox.Show("确认要撤回坐标(" + retract.X + ", " + retract.Y + ")的棋子吗?", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
RetractList.RemoveAt(index);//移除最后一步棋子的位置信息
boardArry[retract.X, retract.Y] = 0;//将最后一步棋子在数组中的位置标记为空
isWhite = !isWhite;//将当前棋子设置为另一个颜色
Refresh();
}
else
{
return;
}
}
以上修改后的代码应该可以正常执行悔棋操作,恢复被悔棋的位置并更新存储棋子的数组和窗口中的显示。
根据提供的信息,棋盘上的棋子在点击悔棋按钮后都不见了,但之前下的棋子的位置在下棋时显示为已经被占用。您使用了一个列表来存储每次下棋的位置。
可能的原因是在悔棋操作时没有正确处理棋子的位置信息。悔棋操作应该恢复到上一步的状态,包括棋子的位置信息。以下是可能导致问题的一些原因和解决方法:
综上所述,请检查您的代码逻辑,确保在悔棋操作中正确处理棋子的位置信息,并在绘制棋盘时正确显示已下的棋子。