2015-01-14 34 views
1

我正在開發一個隨機生成水平的遊戲過程。這些級別是隨機生成的二維「地形」,它們看起來是連續的,每一個都考慮到前一個「級別」的最後一個「高度」值。然後一次加載5個級別,其中第二級別是「當前」級別,第一級別是剛剛完成的級別,並且如果用戶超過「當前」級別,則第三級別在那裏。保存/加載連續隨機生成的水平

我正在使用種子隨機(Java.Util.Random),以便隨機生成的級別始終如一。級別「1」對每個人都是一樣的,因爲每個人的Random對象都是相同的。當我想要每個人的等級500或甚至1000是相同的時候,我遇到的問題就會出現。當然,我的遊戲會令人上癮,讓人們一次玩上500或1000個關卡,但最終用戶將不得不停下來,我將不得不保存他們的進程,以便稍後加載它。

起初我以爲「哦,爲什麼不只是存儲他們所在的關卡號碼」,而且當我加載關卡時,我只是繼續生成這些關卡,直到達到這個數字。在我的手機上測試了這個理論並等待5分鐘,等級達到1000的時候,我意識到這是一個愚蠢的,「準備好的,火的目標」的方法。

所以我的問題是,有沒有辦法將「我在哪裏」存儲在種子隨機對象中,這樣我就可以根據Random的「位置」重新創建確切的情況。

回答

0

我不認爲你可以從Random對象中獲得種子。

但是,我認爲,你的目的,你可以使用下面的類,它緩存的種子,讓你打電話getSeed()

public class SeedGettableRandom { 
    long seed; 
    public SeedGettableRandom(long initialSeed) { 
     this.seed = initialSeed; 
    } 
    public void nextBytes(byte[] bytes) { 
     Random rand = new Random(seed); 
     rand.nextBytes(bytes); 
     seed = rand.nextLong(); 
    } 
    // analogous methods for the rest of Random's methods. 
    public long getSeed() { 
     return seed; 
    } 
} 

和當然,如果性能是一個問題,你可以把你的整個事情放到它自己的方法中。例如:

public byte[][] nextGameTerrainData() { 
    Random rand = new Random(seed); 
    // Do whatever you were doing with you Random object 
    seed = rand.nextLong(); 
} 
+0

謝謝你這是非常有用的,我目前正在實施一個解決方案根據你的答案,並希望得到它啓動和運行。不幸的是,由於這是一個新帳戶,我不能爲您「投票」,但是一旦我確定我可以正確加載/保存,我就會檢查您。 –

+0

不太有效,也許我做錯了什麼?我傳遞給生成器Long.parseLong(「11223344」)。然後我設置一個私有變量Long seed =傳入的long。然後當生成器調用「generateMap」時,我首先調用rand = new Random(seed);並在完成後我打電話給seed = rand.nextLong();這些是得到所產生的種子(...的節省空間): Seed0:11223344 - SEED1:-139199 ... - seed2中:800030 ... - 不幸的是,當我嘗試通過 - 139199 ...發電機我得到這個,這不是從種子1下面!=種子2以上的延續: 種子0:-139199 ... - 種子1:4722603 ... –

+0

你可以發佈種子之間發生了什麼0和種子1和種子2? –

0

爲什麼不在遊戲開始時隨機生成所有關卡?然後保存訂單?你可以在遊戲開始時做到這一點。然後當玩家退出遊戲商店當前等級的順序。當它繼續加載所有保存的級別和您保存的位置。

+0

理論上這個遊戲可以永遠持續下去,所以我需要有無數的關卡。 K_G想出了一個我現在正在使用的算法。 –

+0

這就是理論。不要以爲任何人都會玩超過10 000個關卡。 :) – MilanG