我做了一个随机生成迷宫的游戏,迷宫存储在一个二维数组中。 数组中的每个整数表示单元格所具有的墙数。
它基于这里的java示例:http://rosettacode.org/wiki/Maze
为了让人们分享一个独特的迷宫,我试图找到一种方法将数组转换为一个字符串或整数,可以由一个用户生成,复制然后粘贴到另一个游戏中然后加载它迷宫。
用户可以选择最大25x25的迷宫大小,因此只需打印每个值(2 | 16 | 4 | 20 ...)就会非常长。
如果无法将其转换为“代码”,是否可以在不使用文件的情况下完成任何其他方式?
答案 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的迷宫。