我正在制作宝石迷阵风格游戏。 我使用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';
}
}
}
}
答案 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 + 1
或column - 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-1
和i
两者都j
时,请查看0
所做的事情 - 它会让您访问board[0][0-1]
= board[0][-1]
- &gt ;在您的数组中不存在。现在假设i
和j
都是MAX_COLUMNS-1
或MAX_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';
}
}
}
}