扫雷器:改进地雷随机定位算法

本文关键字:随机 定位 算法 地雷 扫雷 | 更新日期: 2023-09-27 18:36:28

这是我使用随机生成的地雷创建网格的代码。问题是地雷是如此分散,所以当我计算非地雷单元的地雷时,它主要有值 1、2,几乎没有值 4、5、6、7。如何改进这个算法?

假设列数

、行数和列数是恒定的。

var r = new Random();
int columns, rows, TotalMine;
int[,] grid = new int[columns, rows];
int MineCount = 0;
int X = 0;
int Y = 0;
// Add Mines (This is so simple, it cause the problem)
while (MineCount++ < TotalMine)
{
    do
    {
        X = r.Next(columns);
        Y = r.Next(rows);
    }
    while (grid[X, Y] == -1);
    grid[X, Y] = -1; // -1 = have mine
}

扫雷器:改进地雷随机定位算法

你的算法非常好,会创建随机分布的地雷(假设 RNG 足够好)。

我可以想象的一种改进方法是使用生命游戏算法来消除极端情况,用于检查杂乱的字段,其中一个字段被 7 或 8 个地雷包围。

只需遍历所有字段并计算周围的地雷(即计算字段的数量)。如果是 7 或 8,请删除它旁边的一个随机地雷。

作为替代方案,您可以使用柏林噪声来创建"云",然后只在至少具有给定"密度"的区域随机放置地雷。通过这种方式,您可以轻松创建更大的区域,它们之间没有任何内容。

你也可以把这两个想法混合一下:

  • 创建一个与您的游戏场地一样大的桌子或棋盘,其值是随机分布的(truefalse)。
  • 使用生命游戏算法进行多次迭代以创建一些模式(您应该最终得到"孤岛"或随机结构)。
  • 仅将地雷放置在设置为false(或true - 无论您选择什么)的区域内。