Изменить метод с возврата на пустоту

Меня просят сделать игру-лабиринт на С ++ (используя кодовые блоки). Я понял большую часть этого, но застрял в одном методе класса Maze. У меня есть эта функция, чтобы сказать, что двигаться в любом направлении (вверх, вниз, влево, вправо), где вы не получите стену.

int Maze::mazeTraversal(int a, int b)
{
// If a,b is outside maze, return false.
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) return FALSE;

// If a,b is the goal, return true.
if ( maze[b][a] == 'G' ) return TRUE;

// If a,b is not open, return false.
if ( maze[b][a] != '0' && maze[b][a] != 'S' ) return FALSE;

// Mark a,b part of solution path.
maze[b][a] = 'x';

// If find_path North of a,b is true, return true.
if ( mazeTraversal(a, b - 1) == TRUE ) return TRUE;

// If find_path East of a,b is true, return true.
if ( mazeTraversal(a + 1, b) == TRUE ) return TRUE;

// If find_path South of a,b is true, return true.
if ( mazeTraversal(a, b + 1) == TRUE ) return TRUE;

// If find_path West of a,b is true, return true.
if ( mazeTraversal(a - 1, b) == TRUE ) return TRUE;

// Unmark a,b as part of solution path.
maze[b][a] = '0';

return FALSE;
}

Я называю эту функцию как:

Maze mo(maze,12); //creating maze game with 12/12 array
mo. mazeTraversal(0,2) // because the entry point is in 0,2 position of the game.

Я только что понял, что меня просят, чтобы этот лабиринт void, Никакого возврата. Мой разум взрывается. За исключением некоторых креативных идей, пожалуйста.

0

Решение

Использование:

void Maze::mazeTraversal(int a, int b, bool& Status)

а потом вместо return внутри функции использования: —

Status = false; // or true

или используйте элемент данных bool Status внутри класса и обновить его значение

class Maze{

public :
bool Status;
//..

void Maze::mazeTraversal(int a, int b);
//...
};
1

Другие решения

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

  • добавить по ссылке параметр (не указатель, который является громоздким и действительно не нужно)
  • добавьте внутреннее состояние, которое вы поддерживаете, и верните его в некоторую функцию «Состояние».

Это решение, которое я бы исследовал.
В любом случае вам придется адаптировать реализацию функции перемещения.
Поскольку кажется, что ваш объект «Лабиринт» является состоящим из состояния (т. Е. Действительно поддерживает некоторое внутреннее состояние относительно того, в какую позицию он попал), второй имеет больше смысла.

0

Вот еще одно решение, которое не меняет сигнатуру вашей функции, но ничего не возвращает вообще:

bool g_Status = true;
void Maze::mazeTraversal(int a, int b)
{
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) // If a,b is outside maze, return false.
g_Status=false;
else  if ( maze[b][a] == 'G' )    // If a,b is the goal, return true.
g_Status=true;
else if ( maze[b][a] != '0' && maze[b][a] != 'S' ) // If a,b is not open, return false.
g_Status=false;
else{
maze[b][a] = 'x'; // Mark a,b part of solution path.
mazeTraversal(a, b - 1);
if (!g_Status)  // If find_path North of a,b is true, return true.
mazeTraversal(a + 1, b); // If find_path East of a,b is true, return true.
if (!g_Status)
mazeTraversal(a, b + 1); // If find_path South of a,b is true, return true.
if (!g_Status)
mazeTraversal(a - 1, b); // If find_path West of a,b is true, return true.
if (!g_Status)
maze[b][a] = '0'; // Unmark a,b as part of solution path.
}
}
0

Вы можете написать свой код так:

void Maze::mazeTraversal(int a, int b,bool* retValue)
{
// If a,b is outside maze, *retValue =  false.
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) {
*retValue= FALSE;
return;
}

// If a,b is the goal, return true.
if ( maze[b][a] == 'G' ) {
*retValue= TRUE;
return;
}

// If a,b is not open, return false.
if ( maze[b][a] != '0' && maze[b][a] != 'S' ) {
*retValue= FALSE;
return;
}

// Mark a,b part of solution path.
maze[b][a] = 'x';

// If find_path North of a,b is true, return true.
bool* ret1;
mazeTraversal(a + 1, b,ret1)
if ( *ret1 == TRUE ) {
*retValue= TRUE;
return;
}

// If find_path East of a,b is true, return true.
bool* ret2;
mazeTraversal(a + 1, b,ret2);
if ( *ret2 == TRUE ) {
*retValue= TRUE;
return;
}

// If find_path South of a,b is true, return true.
bool* ret3;
mazeTraversal(a, b + 1,ret3);
if ( *ret3 == TRUE ) {
*retValue= TRUE;
return;
}

// If find_path West of a,b is true, *retValue= true.
if ( mazeTraversal(a - 1, b) == TRUE ) {
*retValue= TRUE;
return;
}

// Unmark a,b as part of solution path.
maze[b][a] = '0';

*retValue= FALSE;
}

Теперь создайте глобальную переменную:

bool* retvalue;

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

-1
По вопросам рекламы [email protected]