繁体   English   中英

我每次都尝试创建随机地图,但我没有得到想要的结果,我该如何在每个地图中创建随机路径?

[英]I'm trying to create random map each time but i'm not getting the result i wanted how can i make a random path in each map?

这是创建0和1的映射变量数组的代码。

public static int[,] CreateArray(int numberOfRows, int numberOfCols)
        {
            int[,] map = new int[numberOfRows, numberOfCols];
            for (int i = 0; i < numberOfRows; ++i)
            {
                Random rnd = new Random();
                for (int j = 0; j < numberOfCols; ++j)
                {
                    map[i, j] = rnd.Next(0, 2);
                }
            }

            return map;
        }

这就是我使用它的方法:

int[,] map = CreateArray(8, 8);

但是每次我运行游戏时,都会得到一张不同的地图,如下所示:这是两张随机地图的图像,我将它们合并为一张图像:

地图

但是我想获得随机路径蓝色,如果我没记错的话,它是数组中的数字1,我​​想用它创建像randon路径。 例如,如果我手动设置0和1的数组,则这是一张地图:

int[,] map = new int[,] 
{
    {0,0,1,0,0,0,0,0,},
    {0,0,1,1,0,0,0,0,},
    {0,0,0,1,1,0,0,0,},
    {0,0,0,0,1,0,0,0,},
    {0,0,0,1,1,0,0,0,},
    {0,0,1,1,0,0,0,0,},
    {0,0,1,0,0,0,0,0,},
    {0,0,1,1,1,1,1,1,},
};

结果是:

路径映射

我使用带有两个图像的xna绘制绿色和蓝色。 但是问题是每次使用随机路径创建随机图,而不仅仅是蓝色和绿色。

您在这里有2个问题。 第一个将修复您看到的条带,并且非常容易修复。 对于每一行,您都在制作一个新的伪随机数生成器。 由于通常使用当前时间作为种子,因此在足够小的地图上,您将为每一行获得相同的种子,从而获得相同的“随机”输出。 将初始化移到外部循环之外,因此您将获得以下结果:

        Random rnd = new Random();
        for (int i = 0; i < numberOfRows; ++i)
        {
            for (int j = 0; j < numberOfCols; ++j)
            {
                map[i, j] = rnd.Next(0, 2);
            }
        }

您现在遇到的第二个问题是不能保证矩阵中的“ 1”将被连接。 要解决这个问题要困难一些,并且要取决于最终的目标。

如果您试图在地图上绘制随机河流,则可以采取其他方法。 以随机EDGE坐标(例如(0,4))从河流开始。 然后执行一次do / while循环,查看相邻的拼贴为绿色。 使用Random.Next()选择一个相邻的图块。

例如

currentRiverTile = GetRandomEdgeTile();
do
{
  map[currentRiverTile.X, currentRiverTile.Y] = 1;

  var adjacentTiles = GetAdjacentTiles(currentRiverTile);
  var rnd = new Random();

  currentRiverTile = adjacentTiles(rnd.GetNext(0,adjacentTiles.Length));

} while (!IsEdgeTile(currentRiverTile));

这将在您的地图上创建一条随机河。 填写代码以检查图块是否为边(检查X = 0 || x == 8 || y == 0 || y == 8)。

问题是您在循环中每次迭代都在创建一个新的Random对象。 由于随机数是按时间播种的,因此会引起问题。 如果您在很短的时间内创建了许多种子,那么它将使用相同的种子,因此具有相同的随机性。

正如AlexD所说,将您的随机代码拖出循环。 这样,它将仅创建一次。 这个问题导致我最终的结果。 尝试在整个程序中仅使用1个Random对象。 这样可以消除使用多个随机对象时可能发生的重复。

因此,您的代码应如下所示:

public static int[,] CreateArray(int numberOfRows, int numberOfCols)
    {
        int[,] map = new int[numberOfRows, numberOfCols];
        Random rnd = new Random();

        for (int i = 0; i < numberOfRows; ++i)
        {
            for (int j = 0; j < numberOfCols; ++j)
            {
                map[i, j] = rnd.Next(0, 2);
            }
        }

        return map;
    }

看一下描述类似问题的StackOverflow 另外,有关随机的更多信息,请参见DotNetPerls.comMSDN 我认为MDSN特别是一种资源,我认为每个程序员都应该学习爱,因为通过浏览它可以解决许多问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM