c# - 扫雷机 : Improve mine random locate algorithm?

标签 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
}

最佳答案

您的算法非常好,会随机生成地雷(假设 RNG 足够好)。

我能想到的一种改进方法是使用生命游戏算法来消除极端情况,例如杂乱无章的田地,其中一个田地被 7 或 8 个地雷包围。

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

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

您也可以将这两种想法稍微混合一下:

  • 创建一个与您的运动场一样大的 table 或棋盘,数值随机分布(truefalse)。
  • 使用生命游戏算法进行多次迭代以创建某种模式(您应该以“孤岛”或随机结构结束)。
  • 仅将地雷放置在设置为 false(或 true - 无论您选择什么)的区域内。

关于c# - 扫雷机 : Improve mine random locate algorithm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815411/

相关文章:

c# - 如何对该异步代码进行单元测试?

c# - SSH.NET - 消息类型 80 无效

添加项目后,C++ find() 函数不起作用

algorithm - 如何(准确)估计剩余下载时间?

c# - 无需屏幕截图即可获取任何窗口的图像?

c# - RibbonSplitButton 命令执行两次

algorithm - k 个元素的最大集覆盖集

Java扫雷方法在炸弹周围添加数字无法正常工作

algorithm - 扫雷求解算法

java - 如何在此函数中正确使用递归?