Saving/Loading 顺序随机生成的关卡

Saving/Loading Sequentially Randomly Generated Levels

我正在开发一款具有随机生成关卡的游戏。关卡是随机生成的 2d "terrain",它们看起来是连续的,因为每个关卡都会考虑前一个 "level." 的最后一个 "height" 值,然后一次加载 5 个关卡,其中第 2 个级别是 "current" 级别,第 1 级别是刚刚完成的级别,第 3-5 级别在那里,以防用户超过 "current" 级别。

我正在使用种子随机 (Java.Util.Random),以便随机生成的关卡始终相同。级别“1”对每个人都是一样的,因为每个人的随机对象的种子都是一样的。当我希望每个人的 500 级甚至 1000 级都相同时,我遇到的问题就出现了。当然,如果我的游戏让人上瘾,一口气玩 500 或 1000 个关卡,那当然很好,但最终用户将不得不停止,我将不得不保存他们的进程,以便他们稍后加载它。

起初我以为 "oh why not just store the level number they are on" 并且当我加载关卡时,我只是不断生成它们,直到我达到数字。在我的 phone 上测试了该理论并等待 5 分钟,同时级别不断生成直到达到 1000 级后,我意识到这样做是一种愚蠢的 "ready, fire, aim" 方法。

所以我的问题是,有没有办法存储 "where" 我在种子随机对象中,以便我可以根据随机的 "location" 重新创建确切的情况?

我认为您无法从随机对象中获取种子。

不过,我认为出于您的目的,您可以使用以下 class,它缓存种子,允许您调用 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();
}

你为什么不在游戏开始时(随机地)生成你需要的所有关卡然后保存订单?你可以在游戏开始时这样做。然后当玩家退出游戏商店当前等级顺序。当它继续加载您保存的所有已保存关卡和位置时。