0

我制作了一个随机生成迷宫的游戏,迷宫存储在二维数组中。数组中的每个整数表示单元格的墙数。

它基于此处的 java 示例:http ://rosettacode.org/wiki/Maze

为了让人们共享一个独特的迷宫,我试图找到一种方法将数组转换为可由一个用户生成的字符串或整数,复制然后粘贴到另一个游戏中,然后该游戏将加载相同的迷宫。

用户可以选择最大为 25x25 的迷宫大小,因此只需打印每个值 (2|16|4|20...) 就会非常长。

如果无法将其转换为“代码”,是否有其他方法可以在不使用文件的情况下完成?

4

4 回答 4

4

存储随机数生成器的种子。种子完全决定了随机数生成器的输出。

假设您正在使用java.util.Random生成随机数,而不是使用默认构造函数new Random()使用

long seed = System.currentTimeMillis();
// store the seed somewhere
// so you can generate the same sequence of random numbers again
Random rng = new Random(seed);

要制作一个可以提供给用户进行共享的简短“代码”,您可以将数字转换为十六进制或基数 36:

String code = Long.toString(seed, 36); // codes like heeho82h
于 2013-03-17T17:34:21.523 回答
4

如果您为该数组随机创建值,则只需要生成这些值的 PRNG 的状态来重新生成它们。这同时也是所有伪随机数生成器的最大弱点和优势。

由于大多数 PRNG 不允许检索和设置状态,或者具有相当大的状态(Mersenne Twister 内部有几千字节的状态),因此您可能希望使用种子。当然,你必须创建一个新的 PRNG(或重置一个现有的)来生成关卡。

为了使数字易于阅读,您应该将其呈现在某个数字基数中。以 10 为底很明显它是一个数字,并且最容易生成和解析。以 16 为基数(十六进制)和以 64 为基数产生更短、更晦涩的“代码”。无论实际值如何,将其填充为固定长度可能是一个好主意。

于 2013-03-17T17:37:00.490 回答
1

您可以使用Serialization概念来保存状态,2-D array然后使用反序列化将其取回。这是保存2-D array状态然后读回的简单演示。我希望它会对你有所帮助:

import java.io.*;
class ArraySerialization 
{
    ByteArrayOutputStream baos;
    ByteArrayInputStream bins;
    public void saveState(Object obj)throws Exception
    {
        baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(obj);
        oos.close();
    }
    public int[][] readState()throws Exception
    {
        bins = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream oins = new ObjectInputStream(bins);
        Object obj = oins.readObject();
        oins.close();
        return (int[][])obj;
    }
    public static void main(String[] args) throws Exception
    {
        int arr[][]= {
                        {1,2,3},
                        {4,5,7}
                    };
        ArraySerialization ars = new ArraySerialization();
        System.out.println("Saving state...");
        ars.saveState(arr);
        System.out.println("State saved..");
        System.out.println("Retrieving state..");
        int j[][] = ars.readState();
        System.out.println("State retrieved..And the retrieved array is:");
        for (int i =0 ; i < j.length ; i++ )
        {
            for (int k = 0 ; k < j[i].length ; k++)
            {
                System.out.print(j[i][k]+"\t");
            }
            System.out.print("\n");
        }

    }
}
于 2013-03-17T18:03:31.673 回答
0

虽然它使用随机生成器,但它实际上是一个确定性过程。您可以通过知道随机种子来重复它。正如 Joni 所说,只需分享随机种子。无论如何,如果您想共享数据:NxN 网格具有 NxN 内壁,并且考虑到存储墙的存在/不存在需要 1 位,您将需要 NxN 位来存储迷宫。通过这种方式,您可以在 1kb 中存储一个 90x90 的迷宫。

于 2013-03-17T18:24:32.503 回答