我有一个2D数组设置来将游戏块存储在棋盘中,我创建了一些方法,可以让我检查所选位置的棋子是否可以跳跃。每种方法都可以单独使用,但是当我尝试将它们一起使用时 - 特别是检查西南方向的方法 - 我得到Access violation reading location
错误。我还没弄明白如何检查我是否出界,但我不认为这是问题所在。 row
和col
是数组的height
和width
,r
和c
是用户输入的坐标。
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;
}
答案 0 :(得分:1)
你确实超出了界限。
你应该做的是这样的事情:
#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;
}
我确信你可以很容易地将它推断到你的其他功能。使用数组之类的东西时,在尝试对它们进行操作之前,你应该 始终 边界检查。