Почему мой цикл for не выдает правильную ошибку?

#c #arrays #2d

#c #массивы #2d

Вопрос:

У меня есть сетка и функция-член с именем Move (int s), которая должна перемещать значок перемещения в любом направлении, в котором он находится в данный момент, на указанное количество пробелов. Если где-либо перед элементом перемещения, куда он хочет переместиться, есть символ блока (‘#’), предполагается, что функция завершится сбоем и курсор останется в правильном месте. Кажется, что оператор bool всегда равен true, но, похоже, я не могу найти, где в моем коде.

В моем примере вывода функция перемещения никогда не дает сбоев, кажется, что движок всегда проходит сквозь стены или заменяет стены.

Я не буду публиковать все 4 направления, но я опубликую север и Запад:

 bool Grid::Move(int s) {
bool canMove = true;  //initialize the bool variable
if (direction == NORTH) {
    if ((mRow - s) >= 0) {
        for (int i = mRow; i >= (mRow - s); i--) {
            if (matrix[i][mCol] == '#') {
                canMove = false;
            } else if (matrix[i][mCol] != '#') {
                canMove = true;
            }
        }
        if (canMove == true) {
            matrix[mRow][mCol] = '.';
            mRow = (mRow - s);
            matrix[mRow][mCol] = '^';
            return true;
        }else{
            matrix[mRow][mCol] = '^';
        }
    } else
        return false;
} else if (direction == WEST) {
    if ((mCol - s) >= 0) {
        for (int i = mCol; i >= (mCol - s); i--){
            if (matrix[mRow][i] == '#'){
                canMove = false;
            } else if (matrix[mRow][i] != '#')
                canMove = true;
        }
        if (canMove == true) {
            matrix[mRow][mCol] = '.';
            mCol = (mCol - s);
            matrix[mRow][mCol] = '<';
            return true;
        }else
            matrix[mRow][mCol] = '<';
    }else
        return false;
} 
  

Комментарии:

1. 1. Я не думаю, что у вас здесь достаточно кода. 2. Вам действительно нужно использовать отладчик, чтобы выполнить один шаг по этому коду, просматривая поток и ваши переменные.

Ответ №1:

Вы устанавливаете canMove на каждой итерации вашего цикла. Какое бы значение он ни получил в последний раз, это значение, которое он будет иметь.

Поскольку цель состоит в том, чтобы проверить, является ли перемещение действительным в течение всего срока действия, вам не нужно устанавливать canMove значение true , потому что, как только оно становится false, оно должно оставаться таким. (И вы можете break выйти из своего цикла, когда это произойдет.)