扫雷机:改进矿井随机定位算法?

时间:2015-01-07 08:41:41

标签: c# algorithm minesweeper

这是我创建一个随机生成地雷的网格的代码。问题是地雷是如此分散,所以当我计算非矿井单元的地雷时,它主要有值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
}

1 个答案:

答案 0 :(得分:4)

你的算法非常精细,会产生随机扩散的地雷(假设RNG足够好)。

我能想象的一种改进方法是使用生命游戏算法来消除极端情况,对于一个场地被7或8个地雷包围的杂乱场地。

迭代所有字段并计算周围的地雷(即计算字段的数字)。如果它是7或8,则删除旁边的一个随机矿。

作为替代方案,您可以使用perlin噪声来创建“云”,然后只在您已经获得至少给定“密度”的区域中随机放置地雷。通过这种方式,您可以轻松地在它们之间创建更大的区域。

你也可以稍微混合两个想法:

  • 创建一个与竞技场一样大的桌子或棋盘,其值随机分布(truefalse)。
  • 使用生命游戏算法进行多次迭代以创建一些模式(您最终应该使用“孤岛”或随机结构)。
  • 只将您的地方放置在设置为false(或true - 您选择的任何地方)的区域内。