#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
выйти из своего цикла, когда это произойдет.)