c#五子棋为什么悔棋后全部的棋子都没了 但是数组中的棋子还在只是悔棋后剩余的棋子在窗口没显示

点完悔棋按钮后全部的棋子都不见了 但是除了悔棋的棋子之外之前下的棋子的位置再下棋子显示的是已经被占用 我是用一个列表来存储每次下棋的位置的

img

img

要在OnPaint里面绘制棋盘面

仔细看刷新的代码,到底执行了什么了,你把重绘写哪了

img

img

img

img

img

img

悔棋后再根据列表来绘制一次就行

可能是因为悔棋操作存在问题,没有正确地从存储棋子的列表中移除被悔棋的位置,并重新在窗口中显示出来。

根据你提供的代码,我注意到在悔棋操作中确实存在这样的问题。在你的代码中,只是移除了悔棋列表中最后加入的元素,但没有更新存储棋子位置的数组,所以悔棋后所有棋子都从窗口中消失了。

你需要在悔棋操作中,除了移除悔棋列表中的元素之外,还要在存储棋子位置的数组中标记这个位置上的棋子不存在。因此,需要修改以下代码:

  1. 在执行悔棋操作之前,需要先判断悔棋列表是否为空,如果为空,则不执行任何操作。你已经在代码中加入了这个判断,这是正确的。

  2. 根据你提供的代码,可以看出 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;
    }
}

以上修改后的代码应该可以正常执行悔棋操作,恢复被悔棋的位置并更新存储棋子的数组和窗口中的显示。

根据提供的信息,棋盘上的棋子在点击悔棋按钮后都不见了,但之前下的棋子的位置在下棋时显示为已经被占用。您使用了一个列表来存储每次下棋的位置。

可能的原因是在悔棋操作时没有正确处理棋子的位置信息。悔棋操作应该恢复到上一步的状态,包括棋子的位置信息。以下是可能导致问题的一些原因和解决方法:

  1. 列表中存储的棋子位置信息没有正确更新:在悔棋操作后,需要确保列表中存储的棋子位置信息与实际棋盘状态一致。当悔棋按钮被点击时,应该从列表中删除最后一次下棋的位置,以恢复到上一步的状态。
  2. 棋子的显示问题:如果棋子的位置已经被正确地从列表中删除,但仍然显示为已经被占用,可能是由于在绘制棋盘时没有正确处理已经下过的棋子。确保在绘制棋盘时,检查每个位置是否在列表中,并相应地绘制已经下过的棋子。
  3. 其他可能的问题:除了上述原因外,还可能存在其他导致问题的因素。例如,可能存在其他与悔棋操作相关的逻辑错误或UI交互问题。检查您的代码以确保没有其他悔棋操作相关的错误。

综上所述,请检查您的代码逻辑,确保在悔棋操作中正确处理棋子的位置信息,并在绘制棋盘时正确显示已下的棋子。