我有一个2D阵列设置,用于将棋子存储在棋盘中,并且我创建了一些方法,这些方法可以让我检查选定位置的棋子是否可以跳跃。每种方法都可以单独使用,但是当我尝试一起使用它们时(特别是检查西南方向的一种方法),出现Access violation reading location错误。我还没有弄清楚如何检查自己是否超出范围,但是我认为这不是问题所在。 rowcol是数组的heightwidth,而rc是用户输入的坐标。

if (jumpPosRightToLeft(board, 'X', 'O', row, col, r,c) ||
    jumpPosRightToLeft(board, 'O', 'X', row, col, r,c)) {
    cout << "can make move";
}

if (jumpPosLeftToRight(board, 'X', 'O', row, col, r, c) ||
    jumpPosLeftToRight(board, 'X', 'O', row, col, r, c)) {
    cout << "can make move";
}


这是方法的实现方式:

bool jumpPosRightToLeft(char **board, char x, char y, int row, int col) {
    if (board[row][col] == x &&
        board[row - 1][col + 1] == y &&
        board[row - 2][col + 2] == ' ') {

        return true;
    }
    return false;
 }

bool jumpPosLeftToRight(char **board, char x, char y, int row, int col) {
    if (board[row][col] == x &&
        board[row + 1][col - 1] == y &&
        board[row + 2][col - 2] == ' ') {
        return true;
    }
    return false;
}

最佳答案

确实,您超出了范围。

您应该做的是这样的:

#define BOARDSIZE 8 // Define whatever board size (square) you want here

bool jumpPosLeftToRight(char **board, char tokenA, char tokenB, int r, int c, int row, int col) {
    if (row + 1 >= BOARDSIZE || row + 2 >= BOARDSIZE || col - 1 < 0 || col - 2 < 0) return false;

    if (board[row][col] == tokenA &&
        board[row + 1][col - 1] == tokenB &&
        board[row + 2][col - 2] == ' ') {
        return true;
    }
    return false;
}


我敢肯定,您可以轻松地将其外推到其他功能。当使用数组之类的东西时,应始终在进行操作之前进行边界检查。

关于c++ - 检查2D阵列中的相邻对角线位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39261340/

10-11 03:35
查看更多