我相信大多数人都知道扫雷游戏。我想用C#编写自己的扫雷游戏,但不确定应该使用什么算法?我已经在网上浏览了很长时间,但没有找到一个好的解决方案。
我相信大多数人都知道扫雷游戏。我想用C#编写自己的扫雷游戏,但不确定应该使用什么算法?我已经在网上浏览了很长时间,但没有找到一个好的解决方案。
除了标记旗帜外,玩家可以进行两种移动来尝试揭开方块:
单次猜测:玩家点击一个未知状态且没有旗帜的方块。揭示该方块,查看玩家是否死亡,并在其中放置一个数字。如果方块包含0,则递归地对所有周围的方块重复此过程。这应该在专用函数中完成,以将其与GUI的事件处理程序分离,使递归易于进行,并因为它在多次猜测中被重复使用。
多次猜测:玩家点击一个已揭开且已知安全的方块。如果周围旗帜的数量等于该方块中的数字,则使用与上述相同的过程打开未标记的方块。
如果被覆盖的方块数与地雷数相同,则玩家获胜,即使他们没有在每个方块上放置旗帜。
当玩家失败时,通常会标记任何不正确的猜测、剩余的地雷和他们踩到的地雷。
N+1
个地雷开始游戏板,并确保每个对角线附近都有1个地雷。如果第一次点击不在地雷上,则消除距离其最远的角落里的地雷。 - Kevin Fegan你可以在这里查看全部内容:https://massaioli.wordpress.com/2013/01/12/solving-minesweeper-with-matricies/
我建议你通读一遍,然后好好思考一下。扫雷中的概率部分也可以使用统计学来解决,但我还没有一个好的计划。不过,其他人也已经研究过了。
虽然我不是扫雷游戏的专家,但这里是我尝试解决它时使用的算法:
遍历所有已揭示区域的边缘方块。 对于这些方块中的每一个,计算旁边已揭示的地雷数量,然后减去写在该方块中的数字(周围实际地雷的数量)。 这就是这个方块周围剩余未揭示地雷的数量。 将其除以当前方块周围未揭示方块的数量。 这就是相邻的方块包含地雷的概率。 如果任何方块的概率为1,则将其标记为地雷。 如果任何方块的概率为0,则将其标记为安全。 然后更新相关数字。
如果没有方块的概率为0或1怎么办? 一个最优化的算法会考虑来自多个方块的限制。 但正如我在开头写的那样,我不是扫雷游戏的专家,所以我从其他方块中随机选择概率最接近0或1的方块。
这是我的扫雷求解器:
这是一个实际的实现,注意它使用了更难以解释的子集规则: https://github.com/SHiNKiROU/Minesweeper/blob/master/src/org/shinkirou/minesweeper/MinesweeperSolver.java#L27
当然,我的算法有时会失败。我计划实现一个类似 Prolog 的回溯求解器。
请查看:http://quantum-p.livejournal.com/19616.html
在扫雷游戏中,任何无法通过猴子推理直观解决的位置都是一个矩阵,该矩阵可能能够解决一些单个(或整个)方块,从而提高解决率。简单的随机猜测并没有产生好的结果。我使用C ++将这种方法实现到我的解决算法中,通过添加线性方程组求解器进行优化。我正在通过运行数万次游戏,并进行统计来研究扫雷游戏的难度。
我的算法可以解决多达85%的(9,9,10)简单级别的扫雷游戏。我还没有对其他难度级别进行完整测试,但较小的测试表明,中等级别(16,16,40)的解决率为55-60%,而困难级别(30,16,99)则低至5-10%。我将添加一些新功能,使其更加优化。