如何防止随机游走算法被“卡住”?

时间:2011-10-31 05:54:48

标签: c algorithm

我正在制作一个类似流氓的游戏,我正在网格中随机游走以形成一个“洞穴”系统。然而,我想出的随机游走卡住了 - 特别是当助行器靠近网格的边缘并被“洞”包围时。

这不是我在项目中使用的确切代码,我无法从工作中访问我的代码。但是,我重新编写了一个我在家中使用的相同算法的样本。

基本上,我采用了一个20x20的整数网格,并用1填充。当我走路的时候,我在每一步都打了一个0。

void walk(int grid[][20]){
  int x = rand() % 10 + 9;
  int y = rand() % 10 + 9;

  int walk_count;

  for(walk_count = rand() % 1000 + 500; walk_count >= 0; walk_count--){
    switch(rand() % 4){
      case 0: if(grid[x][y - 1] == 1 && y - 1 >= 1){ y--; grid[x][y] = 0;} break;
      case 1: if(grid[x][y + 1] == 1 && y + 1 < 20){ y++; grid[x][y] = 0;} break;
      case 2: if(grid[x - 1][y] == 1 && x - 1 >= 1){ x--; grid[x][y] = 0;} break;
      case 3: if(grid[x + 1][y] == 1 && x + 1 < 20){ x++; grid[x][y] = 0;} break;
      default: break;
    }
  }
}

2 个答案:

答案 0 :(得分:3)

首先,解释代码中的不对称性。在案例1中,您有&& y + 1 < 20。在案例3中,您有&& x + 1 >= 1,我希望&& x + 1 < 20

我打算将其作为转录错误/拼写错误,而不是问题的根源。据我了解,你的问题是你有一个随机的助行器,他在地板上画画并将自己画成一个角落。这种行为是预期的,不是吗?

问题是你只是在做一个随机游走并期待一种比随机更聪明的行为。如果你想避免把自己画成一个角落,那就把它放到你的算法中。假设这些随机助行器希望能够到达玩家,只需检查每个方向(如果已填充)仍然有一条通向玩家的路径。然后从适用的方向中随机选择。

答案 1 :(得分:1)

我有一个解决方案:

首先使用图表:每个单元格都是顶点,如果两个单元格相邻,并且两个单元格都是1,则图形中的顶点之间会有一条边。

现在当走到一个新的单元格并在其中放置0时,你会破坏所有边缘,并将它们连接到它的顶点。

我们在这里看到现在您可以查看图中的连通组件并判断两个单元之间是否存在路径(如果它们位于相同的连接组件中,则存在路径),因为您可能有一些从洞穴出口,所以它将是特殊的细胞,现在你可以建立一个规则天气,只有当它与特殊细胞在同一个连通组件中时,细胞才是“好的”。

最后:你的行走条件只有在相邻的单元格“好”(从之前)才会出现这种情况,你永远不会走到尽头:)因为你总是会有退出的路径(可能多一个:)没有问题)

希望您喜欢此解决方案,请在此处查看有关图表的更多信息

http://en.wikipedia.org/wiki/Graph_theory

http://en.wikipedia.org/wiki/Connected_component_%28graph_theory%29