【发布时间】:2015-12-19 08:18:11
【问题描述】:
我正在尝试创建一个由 PRNG 程序生成的 1 和 0 的无限地图,但只存储一个可见的 7x7 网格。例如在屏幕上,您将看到一个 7x7 的网格,其中显示了 1 和 0 的部分地图,当您向右推动时,它会移动 1 和 0,并将下一行放置到位。
如果您随后向左移动,因为它是伪随机生成的,它会重新生成并显示原始图像。您将能够无限地上下移动。
我遇到的问题是初始地图看起来不是那么随机,并且当您向右或向左滚动时模式会重复,我认为这与我生成数字的方式有关。例如您可以从查看 x=5000 和 y= 10000 开始,因此它需要从这两个值生成一个唯一的种子。
(复杂度是视口大小的变量)
void CreateMap(){
if(complexity%2==0) {
complexity--;
}
if (randomseed) {
levelseed=Time.time.ToString();
}
psuedoRandom = new System.Random(levelseed.GetHashCode());
offsetx=psuedoRandom.Next();
offsety=psuedoRandom.Next();
levellocation=psuedoRandom.Next();
level = new int[complexity,complexity];
middle=complexity/2;
for (int x=0;x<complexity;x++){
for (int y=0;y<complexity;y++){
int hashme=levellocation+offsetx+x*offsety+y;
psuedoRandom = new System.Random(hashme.GetHashCode());
level[x,y]=psuedoRandom.Next(0,2);
}
}
}
这是我用来左右移动的,
void MoveRight(){
offsetx++;
for (int x=0;x<complexity-1;x++){
for (int y=0;y<complexity;y++){
level[x,y]=level[x+1,y];
}
}
for (int y=0;y<complexity;y++){
psuedoRandom = new System.Random(levellocation+offsetx*y);
level[complexity-1,y]=psuedoRandom.Next(0,2);
}
}
void MoveLeft(){
offsetx--;
for (int x=complexity-1;x>0;x--){
for (int y=0;y<complexity;y++){
level[x,y]=level[x-1,y];
}
}
for (int y=0;y<complexity;y++){
psuedoRandom = new System.Random(levellocation+offsetx*y);
level[0,y]=psuedoRandom.Next(0,2);
}
}
要提取它,我需要能够设置
Level[x,y]=Returnrandom(offsetx,offsety)
int RandomReturn(int x, int y){
psuedoRandom = new System.Random(Whatseedshouldiuse);
return (psuedoRandom.Next (0,2));
}
【问题讨论】:
-
是否存在所需地图的最大尺寸,例如 1024 x 1024 条目?
-
不,我试图让它看起来无限。例如您可以从查看坐标 10000、445554 开始,这也是完全随机生成的。
-
太简单了,假设世界是 100 x 100,视口在位置 60,60。因此,您可以在 x 中看到 60-66 的网格,在 y 中看到 60-66 的网格。 x(60),y(60) 应该填充随机的 1 或 0,并且 x(61),y(60) 也应该填充随机的 1 或 0。因此我需要有一个唯一的值来播种我认为基于 2 个坐标?
-
是 if (randomseed) true or false... if false 什么是 levelseed?
-
@Munkybunky 我认为您的问题是您正在循环中创建一个“新”随机...不要像您一样在循环内部重新声明...而是在类级别声明它,然后简单地使用 psuedoRandom.Next
标签: c# seeding procedural-generation