C++ 检查移动是否有效的简单游戏算法

C++ 检查移动是否有效的简单游戏算法,c++,algorithm,multidimensional-array,dijkstra,C++,Algorithm,Multidimensional Array,Dijkstra,我正在编写我的第一个游戏,我还有最后一个问题要解决。我需要一个算法来检查我是否可以将一个选定的球移动到一个选定的位置 请看这张图片: 规则是,如果我捡起白色背景上的蓝色球(在中间),我可以把它移到所有的绿色空间,但我不能把它移到紫色的空间,因为它们被其他球围起来了。我自然不能把它移到其他球的位置。球只能上下左右移动 现在我意识到已有两种算法:A*和Dijkstra的算法可能会有所帮助,但它们对于我所需要的东西来说似乎太复杂了(都是使用向量或我还没有学过的东西,我对编程很陌生,这是我的学期专题)

我正在编写我的第一个游戏,我还有最后一个问题要解决。我需要一个算法来检查我是否可以将一个选定的球移动到一个选定的位置

请看这张图片:

规则是,如果我捡起白色背景上的蓝色球(在中间),我可以把它移到所有的绿色空间,但我不能把它移到紫色的空间,因为它们被其他球围起来了。我自然不能把它移到其他球的位置。球只能上下左右移动

现在我意识到已有两种算法:A*和Dijkstra的算法可能会有所帮助,但它们对于我所需要的东西来说似乎太复杂了(都是使用向量或我还没有学过的东西,我对编程很陌生,这是我的学期专题)。我不需要找到最短的路,我只需要知道选择的目的地是否被其他球围起来

我在游戏中的棋盘是9x9数组,如果它是一个空的位置,则简单地填充“/”,如果它被占据,则填充7个字母中的一个

有没有一种方法可以简单地编写算法?



[我选择了洪水填充,效果很好,谢谢你的帮助,如果有人有类似的问题-我建议使用洪水填充,它非常简单和快速]

你可以使用该算法非常简单地完成这项工作

为此,您需要研究数据结构。一旦您理解了它,它就很容易实现

关键理念

您的单元将充当顶点,而边将告诉您是否能够从一个单元移动到另一个单元

一旦您使用邻接列表或邻接矩阵表示实现了图形,您就可以使用BFS算法来完成您要做的事情。

我建议使用算法:

泛洪填充,也称为种子填充,是一种确定 连接到多维数组中给定节点的区域。它是 在油漆程序的“桶”填充工具中用于填充连接的, 颜色相似的区域具有不同的颜色,在游戏中,例如 去和扫雷艇确定哪些碎片被清除。什么时候 应用于图像以用颜色填充特定的边界区域,它 也称为边界填充

就复杂度时间而言,该算法将等于递归算法:
O(N×M)
,其中N和M是输入矩阵的维数。关键思想是,在这两种算法中,每个节点最多处理一次

在本文中,您可以找到算法实现的指南

更具体地说,正如Martin Bonner所建议的,实施中有一些关键概念:

  • 将所有空单元格标记为未知(无法访问所有满单元格)
  • 将源单元格添加到一组可路由单元格中
  • 当集合不为空时:
    • 从集合中弹出一个元素
    • 将所有相邻的未知单元格标记为“可访问”,并将它们添加到集合中
  • 所有剩余的未知单元格都无法访问


  • PS:你可能想阅读。

    深度优先搜索或广度优先搜索都可以。你基本上是在寻找洪水填充算法,谷歌搜索。即使是最简单的算法实现对于9x9网格来说也足够好了。因为你说你没有被告知向量是什么,这是最基本的东西。如果你真的,真的很匆忙,跳过它,但否则你真正应该做的是阅读一些基本的教程。没有矢量(或其他STL容器)字段如何存储?在原始数组中?这些很容易在将来给你带来麻烦。@Aziuth一个正方形的游戏板是少数几个让
    std::vector
    分心于
    std::array
    的地方之一。我建议在本例中使用
    std::array
    char[9][9]
    很容易被字符串混淆。@dtech:一个有相关图片的问题,之前对算法进行的研究确实在技术上是正确的,但对于有限的输入大小来说过于复杂?有很多非初学者仍然在问更糟糕的问题。我发现你对非初学者使用
    代码格式设置
    会让人感到困惑code@gsamaras我希望我没有抱怨太多,只是想提出建议。无论如何,
    O(NxN)
    显然不是代码,但是
    顶点
    看起来像是指某个特定的类型或变量名,当我理解它是指不需要特殊的顶点和边的抽象概念时formatting@gsamaras是的,两个答案我都喜欢,我也喜欢这个问题。我觉得这很有趣,因为我从来没有机会尝试BFS或洪水填充。我很想尝试一下,你的两个答案将是一个很好的起点。不幸的是,这不是我在工作时间可以做的;)Hi Sumeet在英语中,当你强调某事或定义一个新术语时,惯例是使用粗体或斜体。(例如:“狗是四条腿的狼一样的动物。”)对非代码的东西使用代码格式是不正确的。我已经为你修复了你的帖子。Downvoter,请解释一下你为什么不喜欢这个答案。@Caleth,什么是“细胞集合”?在你的伪代码“集合”中<代码>集合
    列表
    向量
    数组
    都是“集合…”的类模板,具有不同的特性我不是下选者。直到你添加伪代码,我才投票。@Caleth:我说的“set”是指最多只能包含一个元素的数学对象。最明显的实现是
    std::unordered\u set
    。如果这是一个性能瓶颈(可能是在一个更大、更空的电路板上),你可以看看位图和类似于“弹出式前端”的聪明技巧。