文明1就像瓦片地图生成

时间:2015-10-02 21:56:19

标签: c# xna

好的,我已经看过像我这样的人,他们是编程初学者的很多问题。大多数时候,他们的问题难以回答或理解问题究竟是什么。我将尽我所能尽可能具体地解决我的问题,因此上述情况不会发生。

首先,我一直关注http://xnagpa.net/xna4rpg.php的教程。而我的磁贴引擎是基于杰米麦克马洪在他的RPG教程系列中制作的。只是让你知道我的磁贴引擎的一般结构是什么样的。

其次,我将尝试解释我在tile引擎中尝试做的事情。我最近发现了一篇关于原始文明如何生成他们的地图的文章。 http://forums.civfanatics.com/showthread.php?t=498630 如果愿意的话,我更喜欢这种生成“世界”风格地图的方法。即:海洋,大陆,岛屿等。所以我决定尝试将其应用到我的tile引擎中。它在很大程度上起作用。我添加到tile引擎的部分应该在指定的地图图层(y,x)中随机选择一个位置,然后从该位置生成一块土地(或图块),然后用地图图层中的图块替换在大块土地上创造的瓷砖。 (在一分钟内显示代码),然后对所需数量的任意数量的陆地(块)进行此操作,或继续创建大块土地,直到地块数量等于所需的地块数量。

我的问题: 我的程序做了它应该做的事情(如上所述),除了它只制造一块陆地。(地块块)它做其他一切都很好但是由于某种原因它不会超过一个陆地。现在我怀疑它实际上正在制造其他陆地,但不知何故,瓷砖引擎设置为显示地图图层的方式正在导致陆地被水覆盖。也许它是一个分层问题。但这不应该是因为陆地都是同一层的一部分。所以我完全不知道为什么这样做。

   public void GenerateLandChunks(MapLayer layer)
    {
        Tile tile = new Tile(0, 3);

            Random random = new Random();

            int x = random.Next(8, layer.Width - 10);

            int y = random.Next(10, layer.Height - 20);

            int length = random.Next(10, 70);
            for (int i = 0; i < length; i++)
            {
                if (length != 0 && x > 8 || x < layer.Width - 10 && y > 10 || y < layer.Height - 20)
                {
                    layer.SetTile(y, x, tile);
                    layer.SetTile(y, x + 1, tile);
                    layer.SetTile(y + 1, x, tile);

                }

                x = random.Next(x - 1, x + 2);
                y = random.Next(y - 1, y + 2);
            }


    }

这是我生成实际块的方法,它可以实现我想要的。 (上图)

            MapLayer randomLayer = new MapLayer(100, 100);

        for (int y = 0; y < randomLayer.Height; y++)
        {
            for (int x = 0; x < randomLayer.Width; x++)
            {
                Tile tile = new Tile(1, 3);
                randomLayer.SetTile(x, y, tile);
            }
        }

        int landMasses = 5;
        for (int i = 0; i < landMasses; i++)
        {
            randomLayer.GenerateLandChunks(randomLayer);
        }

这是我创建地图图层的地方。我最初将整个地图设置为水砖(瓷砖(1,3))然后我告诉它生成5个陆地。

看起来这应该有效。它确实如此,但我只说第一个。它不显示其他4个陆块。

我的问题: 你能在这里看到我做错了什么才能完成我想做的事情吗?

如果您需要更多代码来了解最新情况,请告诉我并告知您需要的内容。就像我说的那样,我发布的内容与Jamie McMahon的瓷砖引擎完全相同。

如果我不清楚或者我的问题很难回答,我很抱歉。我试图让它尽可能地直截了当。感谢您的时间。

1 个答案:

答案 0 :(得分:1)

这么简单的答案的文字太多了。问题是每次都会生成一个新的Random对象,因此每次“随机”值都是相同的。这就是随机数生成器的工作原理,数字实际上并不是随机的,而是“伪随机”,如果你使用相同的随机函数和相同的种子,你将获得看似随机数的相同进展。

默认Random构造函数根据时间为生成器设置一些值,但如果两个生成器的创建时间非常短,则该时间值将相同。

Random对象移到函数外部,以便它用于所有随机生成,或将循环移动到内部(但Random在循环外部。)