数组检出界限

时间:2014-12-29 06:50:16

标签: c++ arrays algorithm

我正在制作宝石迷阵风格游戏。 我使用8x8 2D数组来存储每个“Gem”的坐标(X / Y轴)。我试图使用另一个填充0的水平和垂直2D数组连续检测并删除三个宝石,并在每次检测到相邻宝石时添加1:

例如。 C F F E E E D将为0 1 1 1 2 1 0 0

然而,我得到一些“越界”结果,其中每个水平/垂直检查都在该行或列之外。 我如何为支票实施某些界限?

    void CheckGemLine(int board[MAX_ROWS][MAX_COLUMNS])
{
    int HorizontalBoard[MAX_ROWS][MAX_COLUMNS];
    int VerticalBoard[MAX_ROWS][MAX_COLUMNS];

    for( int row = 0; row < MAX_ROWS ; row++)
    {
        for(int column = 0; column < MAX_COLUMNS; column++)
        {
            HorizontalBoard[row][column] = 0;
            VerticalBoard[row][column] = 0;

            if (board[row][column] == board[row][column + 1] || board[row][column] == board[row][column - 1] )
            {
                HorizontalBoard[row][column]++;
                if (board[row][column] == board[row][column + 1] && board[row][column] == board[row][column - 1])
                {
                    HorizontalBoard[row][column]++;
                }
            }
            printf("%d ",HorizontalBoard[row][column]);
        }
        printf("\n");
    }
    for( int i = 0; i < MAX_ROWS ; i++) //Loop for replacing Gems with 'X'
    {
        for(int j = 0; j < MAX_COLUMNS; j++)
        {
            if(HorizontalBoard[i][j] == 2)
            {
                board[i][j] = 'X';
                board[i][j+1]= 'X';
                board[i][j-1]= 'X';
            }

        }
    }
}

3 个答案:

答案 0 :(得分:1)

将这些行放在条件下:

board[i][j+1]= 'X';
board[i][j-1]= 'X';

像这样:

board[i][j] = 'X';
if(j+1 < MAX_COLUMNS)
    board[i][j+1]= 'X';
if(j-1 >= 0)
    board[i][j-1]= 'X';

同样应该在您正在进行column + 1column - 1的其他地方。这就是您的数组board的样子:

assuming j ---goes this way--> 
00    01    02    03    04    05    
10    11    12    13    14    15    
20    21    22    23    24    25    
30    31    32    33    34    35    
40    41    42    43    44    45    
50    51    52    53    54    55    

因此,当j-1i两者都j时,请查看0所做的事情 - 它会让您访问board[0][0-1] = board[0][-1] - &gt ;在您的数组中不存在。现在假设ij都是MAX_COLUMNS-1MAX_ROWS-1

答案 1 :(得分:1)

我认为当你想使用一个变量作为数组的索引时,你应该检查一下。

if (board[row][column] == board[row][column + 1] || board[row][column] == board[row][column - 1] )

应该是这样的:

if ((column + 1 < MAX_COLUMNS && board[row][column] == board[row][column + 1]) || ( column - 1 >= 0)  && board[row][column] == board[row][column - 1]) )

您在以下代码中遇到了同样的问题,例如@ al-Acme提到的。

答案 2 :(得分:0)

避免边界检查的经典方法是使用空案例扩大每个方向的矩阵。

在你的情况下,你可以在横向检查时从1迭代到Column - 1,对于垂直情况也是如此:

void CheckGemLine(int board[MAX_ROWS][MAX_COLUMNS])
{
    // Horizontal check

    // ={} to initialize array with value 0
    int HorizontalBoard[MAX_ROWS][MAX_COLUMNS] = {}; 

    for(int row = 0; row < MAX_ROWS ; row++) {
        for(int column = 1; column < MAX_COLUMNS - 1; column++) {
            if (board[row][column] == board[row][column - 1]) {
                HorizontalBoard[row][column]++;
            }
            if (board[row][column] == board[row][column + 1]) {
                HorizontalBoard[row][column]++;
            }
        }
    }
    // Vertical check now
    int VerticalBoard[MAX_ROWS][MAX_COLUMNS] = {};

    for(int row = 0; row < MAX_ROWS - 1 ; row++) {
        for(int column = 0; column < MAX_COLUMNS; column++) {
            if (board[row][column] == board[row + 1][column]) {
                VerticalBoard[row][column]++;
                VerticalBoard[row + 1][column]++;
            }
        }
    }
    // Replace with 'X' now
    // By construction of HorizontalBoard&VerticalBoard,
    // there is no out of bound accesses.
    for(int i = 0; i < MAX_ROWS; i++) {
        for(int j = 0; j < MAX_COLUMNS; j++) {
        {
            if (HorizontalBoard[i][j] == 2)
            {
                // HorizontalBoard[i][0] cannot be 2
                // HorizontalBoard[i][MAX_COLUMNS - 1] cannot be 2
                board[i][j-1]= 'X';
                board[i][j] = 'X';
                board[i][j+1]= 'X';
            }
            if (VerticalBoard[i][j] == 2)
            {
                // HorizontalBoard[0][j] cannot be 2
                // HorizontalBoard[MAX_ROWS - 1][j] cannot be 2
                board[i - 1][j]= 'X';
                board[i][j] = 'X';
                board[i + 1][j]= 'X';
            }
        }
    }
}