表示二维数组的唯一“代码”

时间:2013-03-17 17:24:44

标签: java

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

它基于这里的java示例:http://rosettacode.org/wiki/Maze

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

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

如果您随机创建该数组的值,则只需要生成这些值的PRNG的状态重新生成它们。这是所有伪随机数发生器的最大弱点和强度。

由于大多数PRNG不允许检索和设置状态,或者具有相当大的状态(Mersenne Twister在内部有几千字节的状态),您可能想要使用种子。当然,您必须创建一个新的PRNG(或重置现有的PRNG)以进行级别生成。

要使数字具有人类可读性,您应该在某个数字基础上进行渲染。 Base 10显然它是一个数字,并且最容易生成和解析。基数16(十六进制)和基数64产生更短,更模糊的“代码”。无论实际值如何,将其填充为固定长度可能是一个好主意。

答案 2 :(得分: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");
        }

    }
}

答案 3 :(得分:0)

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