路径生成器视频游戏算法

时间:2014-10-29 12:34:32

标签: algorithm game-engine graph-algorithm path-finding

我正在为iOs开发一款游戏,但我却陷入困境。

这个想法很简单:我有一个必须前进的球员才能赢得积分(并避免使用黄砖)。 这是(绿色)理想的路径,以便在矩形内部(从底部到上部)前进。

我每次都会添加一个新行,所以每个新行必须让玩家向前移动(它可以向左,向右和向前移动,没有对角线)。

这个想法是让一些“寄生虫”空白点,所以用户必须考虑他的下一步行动。

所以,我的问题是:如何生成这样的内容(适用于任意数量的列)enter image description here

感谢。

C.C。

3 个答案:

答案 0 :(得分:1)

就个人而言,我会向后解决这个问题:

生成“正确”路径,然后使用一些启发式方法随机化剩余的单元格,以防止它生成“错误”路径。

启发式可能与此类似:

  

让第1行为最近的行,第10行为最远的行。

     

让路径成为一系列连续的0。

     

如果第1行只包含“正确”路径,并且从2到9的所有行都包含至少一个“错误”路径,则第10行只包含“正确”路径。

这种启发式方法可能并不完美,这只是我头脑中的一个想法。

答案 1 :(得分:0)

您可以考虑关于directed graph的董事会。如果您想检查“是否可以到达最后一行?”,您可以使用众所周知的算法DFSBFS

确定。有用。但它的潜力很慢。因此,在生成整个板之后,不应使用任何算法。在任何生成的行之后使用它!如果新生的每个节点都无法获得,那么重新生成原始。

如果你不想要像“生成和检查”这样的算法,你可以添加空原始数据,检查有多少节点可用,并减少其数量,允许前进的数量。然后随机获取它们的子集。

你也可以编写一个简单的随机生成器,从[0,n)返回i。如果最后一个区域位于左侧,则向左,如果右侧 - 右侧,如果相同 - 向下。这很好,因为如果你接近结束,你可能会回到另一边。所以它会有很好的形状。但对于广泛的地图,它将失去利益。

更好,但同样的想法是在随机生成器中智能地使用数字分布。 (例如,查看Cpp随机库或其他语言生成器)。

基于这个想法的代码(但非常非常简单)

constexpr size_t width = 8, height = 15;
std::vector<std::vector<bool>> board;
board.emplace_back(width, false);
board.front().front() = true;
size_t position = 0;
std::random_device gen;
while(board.size() < height) {
  std::poisson_distribution<> d(position+(position < width/2 ? 1 : -1));
  const size_t random = d(gen);
  if(random == position) {
    board.emplace_back(width, false);
    board.back()[position] = true;
    continue;
   }
  if(random < position && board.back()[position-1] == false)
   board.back()[--position] = true;
  else
   if(position + 1 < width)
    board.back()[++position] = true;
 }

输出示例:

- # # # # # # # 
- - - - - - - - 
# # # # # # # - 
# # # - - - - - 
# # # - # # # # 
# # # - - - # # 
# # # # # - - # 
# # # # # - - # 
# # # # # - - - 
# # # - - - - - 
# # # - - # # # 
# # # - - # # # 
# # # - - # # # 
# - - - - # # # 
# - # # # # # #

答案 2 :(得分:0)

你可以维护一个诱饵路径列表,每个路径都有一个位置(X)和一个倒计时(C),它以一个小于可见行数的随机数开始。

在每一步中,您都会标记好路径和每个诱饵路径的单元格。您递减每个诱饵路径计数器并删除任何零。如果诱饵路径的数量低于某个阈值,则添加一个新的诱饵路径,该路径具有随机C和与良好路径相邻的位置,或者如果您还需要非连接的诱饵路径,则在其他地方随机添加。

在每一步,好路径和诱饵路径都可以增加,减少或保持它们的X位置。如果两条路径接触它们合并。当它们合并时,保持最低的C值,以确保您在分支上的分支超出了可见行的数量。

这种方法不需要任何提前规划或创建图表。