文明1喜欢瓦片地图生成

Civilization 1 like tilemap generation

好的,我看了很多像我这样的编程初学者提出的问题。大多数时候,他们的问题很难回答或理解问题的真正含义。我会尽最大努力尽可能具体地说明我的问题,以免发生上述情况。

首先,我一直在关注 http://xnagpa.net/xna4rpg.php 上的教程。我的图块引擎基于 Jamie McMahon 在他的 rpg 教程系列中制作的引擎。只是想让你知道我的瓦片引擎的一般结构是什么样的。

其次,我将尝试解释我在 tile 引擎中尝试做的事情。我最近发现了一篇关于原始文明如何生成地图的文章。 http://forums.civfanatics.com/showthread.php?t=498630 如果您愿意,我更喜欢这种生成 "world" 样式地图的方法。即:海洋,大陆,岛屿等。所以我决定尝试将其应用到我的 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);
        }

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

看来这应该行得通。它确实如此,但就像我只针对第一个所说的那样。它不显示其他 4 个陆地。

我的问题: 您在这里看到我为了完成我想做的事情而做错了什么吗?

如果您需要更多的代码来了解发生了什么,请告诉我 post 您需要什么。就像我说的,除了我 posted 之外的所有内容都与 Jamie McMahon 的 tile 引擎完全相同。

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

如此简单的答案需要这么多文字。问题是每次都会生成一个新的 Random 对象,所以每次 "random" 的值都是一样的。这就是随机数生成器的工作原理,这些数字实际上并不是随机的,而是 "pseudorandom",如果您使用相同的随机函数和相同的种子,您将获得看似随机数的相同级数。

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

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