Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 扫雷艇解算算法_Algorithm_Minesweeper - Fatal编程技术网

Algorithm 扫雷艇解算算法

Algorithm 扫雷艇解算算法,algorithm,minesweeper,Algorithm,Minesweeper,我相信你们大多数人都知道扫雷游戏。我想(用C#)编写我自己的扫雷游戏,并寻找一些关于该游戏的好算法的输入。我已经在网上浏览了很长一段时间,但没有找到一个好的解决方案。有人能帮我吗?你看到了吗?源代码可以下载,对象模型也可以解释。注释是,构建游戏不需要算法。我相信你指的是一种算法,在解决问题的意义上,每个人可能都是这样理解的 然而,问题的任何解决方案都可以被视为一种算法 像大多数数学问题一样,你可以把整个算法分解成更小、更不复杂的算法,直到你找到足够小的问题来解决。这将为您提供第一个正确的解决方案

我相信你们大多数人都知道扫雷游戏。我想(用C#)编写我自己的扫雷游戏,并寻找一些关于该游戏的好算法的输入。我已经在网上浏览了很长一段时间,但没有找到一个好的解决方案。有人能帮我吗?

你看到了吗?源代码可以下载,对象模型也可以解释。

注释是,构建游戏不需要算法。我相信你指的是一种算法,在解决问题的意义上,每个人可能都是这样理解的

然而,问题的任何解决方案都可以被视为一种算法

像大多数数学问题一样,你可以把整个算法分解成更小、更不复杂的算法,直到你找到足够小的问题来解决。这将为您提供第一个正确的解决方案。稍后,您可以在整个算法的上下文中优化较小的算法

游戏板可以看作是一个二维阵列。您将拥有与每个操作关联的算法。第一个操作可能是随机生成一组具有x、y坐标的地雷位置,带有地雷数量和板尺寸的参数。你可以使用另一种算法来显示一个正方形,该算法获取棋盘和一个位置,并确定与之相邻的地雷数量。最后的算法是拿着棋盘,检查是否还有没有地雷的方块留下来显示


现在,您可以使用这些算法中的每一种,并尝试优化每一种算法以获得更好的性能“考虑到使用x,y坐标的二维阵列,计算当前正方形附近有地雷的正方形的最佳方法是什么。

我肯定不是扫雷专家,但以下是我尝试解决该问题时使用的算法:

检查显示区域边界的所有正方形。对于这些方块中的每一个,计算你在其旁边发现的地雷的数量。减去写在正方形中的数字(周围地雷的真实数量)。这就是这个广场周围未开采的地雷的数量。除以当前方格周围未暴露的方格数。这是包含地雷的每个相邻正方形的概率。如果任何一个正方形的概率为1,则将其标记为地雷。如果任何正方形的概率为0,则将其标记为安全。然后更新相关的数字


如果没有概率为0或1的正方形,你会怎么做?优化算法将考虑来自多个正方形的约束。但正如我在开头所写的,我不是扫雷专家,所以我从概率最接近0或1的其他方块中随机选择。生成网格很简单。在执行玩家的移动时,你需要几个简单的算法来确定哪些方块需要打开,以及它们是输了还是赢了

生成网格 最简单的算法是随机放置所有地雷。(确保不要重叠它们!)

问题:玩家的第一次点击可能是地雷

改进:延迟网格的生成,直到用户点击第一个方格,并且不要在该方格中放置任何地雷

问题:玩家的第一次点击可能会显示一个非零数字,他们将被迫随机点击,直到有东西打开

改进:也不要在第一次点击周围的(最多)八个方格中产生任何地雷

问题:玩家可能会被迫在某个点进行猜测,这使得这成为逻辑难题的可悲借口

改进:在生成器旁边,确保具有独特的解决方案。这需要一些技巧,在大多数变体中都没有做到

另一种不太常见的解决歧义的方法是检测玩家何时知道他们在同样可能的可能性之间进行选择,并将波形“折叠”到他们决定的位置。我从来没有见过这样的行动,但这将是一种乐趣

玩游戏 除了标记旗帜外,玩家还可以进行两种移动来尝试揭开方块:

  • 单次猜测:玩家点击一个状态未知且没有旗帜的方块。展示正方形,看看玩家是否死亡,并在其中输入一个数字。如果正方形包含0,则对周围的所有正方形递归重复此操作。这应该在一个专用函数中,以将其与GUI的事件处理程序分离,使递归变得容易,并且因为它在multiguess中被重用

  • 多重猜测:玩家点击一个没有遮盖且安全的正方形。如果周围的标志数量等于此正方形中的数量,我们将使用与上面相同的步骤打开未标记的正方形

赢得比赛 如果被覆盖的方格数与地雷数相同,则该玩家获胜,即使他们没有在每个方格上放置旗帜


当玩家输了,通常会标记他们做出的任何错误猜测、剩余的地雷以及他们踩到的地雷。

如果你试图编写一个解算器,我只想添加以下内容-。这意味着,除非有人证明,在某些情况下,你可能做不到比执行蛮力搜索更好的事情(但在小范围内,这可能不是NP完全的游戏)

检查以下内容:

在棋盘上,任何不能用猴子推理直观地解决的位置都是一个矩阵,它可以解决一些单独(或整个位置)的平方,从而提高解决率。简单的随机猜测并没有产生好的结果。 通过添加一个方法,将该方法应用于C++中的求解算法中。