2015-10-02 91 views
1

好吧,我已經看過很多像我自己這樣的人,他們都是編程初學者。大多數時候,他們的問題很難回答或理解問題的真實性。我會盡我所能對我的問題儘可能具體,以免上述提及。文明1像瓷磚地圖生成

首先,我一直在關注教程http://xnagpa.net/xna4rpg.php。我的平鋪引擎基於Jamie McMahon在他的RPG教程系列中製作的引擎。只是讓你知道我的瓷磚引擎的一般結構是什麼樣子。

其次,我將嘗試解釋我在瓷磚引擎內部要做的事情。我最近發現了一篇關於原始文明如何生成地圖的文章。 http://forums.civfanatics.com/showthread.php?t=498630 而且我更喜歡這種生成「世界」風格地圖的方法。即:海洋,大陸,島嶼等。所以我決定試着去實現它並將其應用到我的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

對於這樣一個簡單的答案有如此多的文字。問題是每次都會生成一個新的Random對象,因此每次「隨機」值都是相同的。這就是隨機數生成器的工作原理,數字實際上並不是隨機數,而是「僞隨機數」,如果使用相同的隨機函數和相同的種子,則會得到相同的隨機數。

默認Random構造函數根據時間爲種子生成一些值,但是如果兩個生成器的創建時間很短,那麼該時間值將是相同的。

Random對象移到該函數的外部,以便它用於所有隨機世代,或者將內部循環(但是Random以外的循環)移動。

+0

好吧,生病嘗試一下。我很抱歉,我只是想清楚這麼多的文字。謝謝 – Spool

+0

它工作完美。非常感謝你。我會盡量保持我的問題在未來更短。對於那個很抱歉。但是,謝謝。 – Spool

+0

@Spool是的,到了一定的地步。也請務必接受答案,如果它實際上是您的問題的答案:) – Dialecticus