0

我被要求用 C++ 制作迷宫游戏(使用代码块)。我想出了大部分,但停留在迷宫类的一种方法中。我有这个功能可以说在你没有得到墙壁的任何方向(上、下、左、右)上行驶。

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.

我刚刚意识到我被要求将这个 mazeTraversal 设置为void. 没有任何回报。我的心在爆炸。请排除一些创造性的想法。

4

4 回答 4

1

利用:

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);
   //...
};
于 2013-09-09T16:45:20.473 回答
0

如果您的请求声明不能修改函数的签名,则签名不包含返回类型,因此您可以更改返回类型。如果分配没有说明签名的任何信息,则上游已经发布了解决方案:

  • 添加一个引用参数(不是指针,这很麻烦而且真的不需要)
  • 添加您维护并在某些“状态”函数中返回的内部状态。

这些是我要调查的解决方案。无论哪种方式,您都必须调整 traverse 函数的实现。看起来您的 Maze 对象是有状态的(即:确实保持一些内部状态,关于它到达的位置),第二个更有意义。

于 2013-09-09T17:18:00.457 回答
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.
    }
}
于 2013-09-09T18:19:25.190 回答
-1

你可以这样写你的代码:

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;

该变量将始终保存返回值,您不需要从函数返回

于 2013-09-09T16:45:03.167 回答