索引在while循环中超出数组范围

时间:2018-12-19 17:55:01

标签: c#

我对我正在编写的这段代码有疑问。该代码的用途应类似于Reversi或Othello游戏。因此,您有了一个游戏板,每次单击时,您都可以新建一个圆圈。如果一个玩家在另一个玩家的两个圆圈之间有一个圆圈,则圆圈会更改颜色。这就是你的观点。例如:red = r和blue = b,empty =0。棋盘如下:r b0。现在,是红色转弯,红色是r b r。这使蓝色圆圈将颜色更改为红色。因此董事会现在说r r r,给红色加分,而蓝色则输掉一个。
  它应该检查整个行,但是不这样做。我收到一条错误消息,说索引超出了数组范围。 如果您需要更多代码,我们很乐意为您提供。   谢谢。

public void makeMoveArray(int x, int y, int a, int b, int color)
    {
        boardArray[x, y] = color;
        while (boardArray[x + a, y + b] != turn)
        {
            boardArray[x + a, y + b] = color;
            x += a;
            y += b;
        }
    }

    public void makeMove(int x, int y, int a)
    {
        if (lockedIn(x, y, 0, 1)) { this.makeMoveArray(x, y, 0, 1, a); }
        if (lockedIn(x, y, 1, 0)) { this.makeMoveArray(x, y, 1, 0, a); }
        if (lockedIn(x, y, 1, 1)) { this.makeMoveArray(x, y, 1, 1, a); }
        if (lockedIn(x, y, -1, 0)) { this.makeMoveArray(x, y, -1, 0, a); }
        if (lockedIn(x, y, 0, -1)) { this.makeMoveArray(x, y, 0, -1, a); }
        if (lockedIn(x, y, -1, -1)) { this.makeMoveArray(x, y, -1, -1, a); }
        if (lockedIn(x, y, 1, -1)) { this.makeMoveArray(x, y, 1, -1, a); }
        if (lockedIn(x, y, -1, 1)) { this.makeMoveArray(x, y, -1, 1, a); }

        panel1.Refresh();
    }

1 个答案:

答案 0 :(得分:0)

您在不检查数组边界的情况下不断增加索引。您应该将此条件添加到您的while循环中:

while (x + a >= 0 &&
       x + a < boardArray.GetLength(0) &&
       y + b >= 0 &&
       y + b < boardArray.GetLength(1) &&
       boardArray[x + a, y + b] != turn)

{
    boardArray[x + a, y + b] = color;
    x += a;
    y += b;
}