2010-01-26 125 views
2

我正在製作一個使用程序生成的關卡的遊戲,當我測試時,我經常想重現一個關卡。目前我還沒有任何方法來保存關卡,但我認爲更簡單的解決方案是重用Python隨機模塊使用的種子。不過,我已經嘗試使用random.seed()random.setstate(),並且都不能可靠地重現結果。奇怪的是,如果我重複使用種子,我有時會連續幾次獲得同樣的水平,但它絕對不可能完全100%可靠。我是否應該正常保存該級別(作爲包含其信息的文件)?什麼是在Python中重現隨機生成級別的最簡單方法?

編輯:

感謝大家的幫助。事實證明,我的問題來自於我從Pygame中的組中隨機選擇精靈,這是在無序的字典視圖中檢索的。我改變了我的代碼,以避免使用Pygame的精靈組,並且它現在完美運行。

回答

7

random.seed應該工作正常,但要記住,它不是線程安全的 - 如果隨機數被用於其他地方,同時你可能會運行之間不同的結果。

在這種情況下,你應該使用的random.Random()一個實例來獲得一個私人的隨機數發生器

>>> import random 
>>> seed=1234 
>>> n=10 
>>> random.Random(seed).sample(range(1000),n) 
[966, 440, 7, 910, 939, 582, 671, 83, 766, 236] 
>>> 

將始終返回相同的結果對於一個給定的種子

1

最好是創建一個levelRandom類在生成一個關卡時爲每個隨機生成的結果提供一個數據插槽。然後將隨機生成的代碼從級別構造代碼中分離出來。當你想要一個新的關卡時,首先生成一個新的關卡隨機對象,然後將該對象交給關卡生成器以產生關卡。之後,爲了再次獲得相同的級別,您可以重新使用levelRandom實例。

1

通過隨機函數生成的數字是確定性的。因此,具有已知價值的種子並保存它。從以下隨機數中創建一個關卡。要加載關卡,只需再次輸入相同的已知值並再次使用「隨機」數字,這些數字將以相同的順序重新出現。這是語言無關,但爲Python介意線程由gnibbler指出。

這個確切的技術實際上是用於創建傳奇遊戲Elite的堆積如山的世界。如果你很勇敢,只要去檢查如何Ian Bell did it。 ;)

相關問題