【问题标题】:C# XNA - Random Room GenerationC# XNA - 随机房间生成
【发布时间】:2014-10-11 01:14:17
【问题描述】:
SetType(type);

        for (int x = (Globals.tileSize + (int)position.X); x < ((int)position.X + (Globals.screenWidth - Globals.tileSize)); x += Globals.tileSize)
        {

            for (int y = (Globals.tileSize + (int)position.Y); y < ((int)position.Y + (Globals.screenHeight - Globals.tileSize)); y += Globals.tileSize)
            {
                tileType = tileFillTypes[random.Next(1, tileFillTypes.Count())];
                Tile tile = new Tile(new Vector2(x, y), tileType, false);
                tiles.Add(tile);
            }
        }

地图生成调用这个类在一个盒子里随机绘制图块。调用 SetType(type) 执行此操作:

void SetType(int type)
    {
        if (type == 1) //ROOM TYPE 
        {
            tileWallTypesBottom = new string[] { "", "stonewallBottom1", "stonewallBottom2", "stonewallBottom3" };

            tileFillTypes = new String[] { "" };
        }
        else if (type == 2)
        {
            tileWallTypesBottom = new string[] { "", "stonewallBottom1", "stonewallBottom2", "stonewallBottom3" };
            tileWallTypesLeft = new string[] { "", "stonewallLeft1", "stonewallLeft2", "stonewallLeft3" };
            tileWallTypesRight = new string[] { "", "stonewallRight1", "stonewallRight2", "stonewallRight3" };
            tileWallTypesTop = new string[] { "", "stonewallTop1", "stonewallTop2", "stonewallTop3" };
            tileFillTypes = new String[] { "", "dirt1", "dirt1", "dirt1", "dirt1", "dirt1", "dirt1", "dirt1", "dirt1", "dirt1", "dirt2", "dirtGrassPatch", "dirt4", "dirt4", "dirt4", };
            tileWallCornerType = new string[] { "", "stonewallTopLeft", "stonewallTopRight", "stonewallBottomRight", "stonewallBottomLeft" };

        }

    }

这设置了我的数组,我可以从中随机选择哪些图块。 我的问题是,当我在每个房间实例中使用此代码生成多个房间时,房间不会彼此随机出现。我试过设置 random = new Random();在每种情况下,它们始终具有相同的图块输出。

【问题讨论】:

标签: c# random xna


【解决方案1】:

此资源应该解释您的问题的原因和常见的解决方案:

http://csharpindepth.com/Articles/Chapter12/Random.aspx

相关sn-p:

Random 类不是真正的随机数生成器。它是 伪随机数发生器。 Random 的任何实例都有一定的 状态量,以及何时调用 Next(或 NextDouble 或 NextBytes) 它将使用该状态向您返回一些似乎是的数据 随机,相应地改变其内部状态,以便在下一个 打电话给你会得到另一个明显随机的号码。

所有这些都是确定性的。如果你开始一个 Random 的实例 具有相同的初始状态(可以通过种子提供)和 对它进行相同的方法调用序列,你会得到相同的 结果。

那么我们的示例代码出了什么问题?我们正在使用一个新的实例 循环的每次迭代都是随机的。无参数构造函数 for Random 将当前日期和时间作为种子 - 你可以 通常在内部定时器之前执行相当多的代码 计算出当前日期和时间已更改。因此我们在 重复使用相同的种子 - 并获得相同的结果 反复。

一个示例解决方案:

// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
    // Assume there'd be more logic here really
    return rng.Next(10);
}

【讨论】:

  • 我不确定我是否遵循您的解释。我的代码有什么问题?它会随机生成房间,但是所有房间最终都与生成的第一个房间完全相同。我将如何“刷新”随机值?
  • 简短的回答是避免每次都创建一个新的 Random ,因为这会重置它。长答案是 Random 不是最好的随机化提供者,你最好创建或使用更复杂的随机数生成过程,这需要一些努力和学习。
  • @SilasReinagel 关于 Random 的一个很好的描述,但考虑在 OP 的上下文中稍微编辑它
  • 没有在我的代码中重用 Random 的位置。我在初始化它一次但不在循环中调用它。我瞎了吗?我还应该用什么来随机?
  • 如果您只是担心每次都没有得到相同的集合,请确保在实例化 RNG 时新鲜播种它,如下所示: Random rng = new Random(Guid.NewGuid().GetHashCode ());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多