[英]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.com和MSDN 。 我认为MDSN特别是一种资源,我认为每个程序员都应该学习爱,因为通过浏览它可以解决许多问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.