Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当玩家在无限地图中移动时,如何在没有重叠的情况下随机放置对象?_C#_Mobile_Random_Procedural Generation - Fatal编程技术网

C# 当玩家在无限地图中移动时,如何在没有重叠的情况下随机放置对象?

C# 当玩家在无限地图中移动时,如何在没有重叠的情况下随机放置对象?,c#,mobile,random,procedural-generation,C#,Mobile,Random,Procedural Generation,我试图制作一个游戏,玩家只能在无限地图上向前移动,路径(就像点一样,路径只是视觉上的)是按程序生成的。我希望这些路径具有不同的长度(,但只生成所选路径的分支) 这就是我如何生成没有重叠的分支: List<Vector3> everyPos; //predetermined position public void Spawn(int amount) { List<Vector3> possiblePos = new List<Vector3>(ev

我试图制作一个游戏,玩家只能在无限地图上向前移动,路径(就像点一样,路径只是视觉上的)是按程序生成的。我希望这些路径具有不同的长度(,但只生成所选路径的分支)


这就是我如何生成没有重叠的分支:

List<Vector3> everyPos; //predetermined position

public void Spawn(int amount)
{
    List<Vector3> possiblePos = new List<Vector3>(everyPos);

    for (int i = 0; i < amount; i++)
    {
        int index = Random(0, possiblePos.Count);          //Find a random position
        SpawnObjectAt(currentPosition+possiblePos[index]));//Create a point there
        possiblePos.RemoveAt(index);                       //Remove that position from the list
    }
}
列出每个人//预定位置
公共无效生成(整数金额)
{
List possiblePos=新列表(everyPos);
对于(int i=0;i

问题是:

红色是玩家开始的位置,绿色是第一步中可能产生的位置

如果在1和2处产生了2个点,玩家选择
point1
,那么第二次可能的位置将是黑色区域中的一个点,其中包括point2,因此如果我继续,最终将重叠


我怎样才能避免这种情况?我正在制作一个手机游戏,所以我不想缓存每一个点。任何帮助都将不胜感激!谢谢


这是一个小型网络游戏,其机制与我试图实现的有些相似:newgrounds.com/portal/view/592325/

这是一个尝试,但老实说,您需要提供更多信息

根据您所使用的语言,您可以以不同的方式处理此问题。您可能需要动态分配,但现在让我们假设,由于您的想法非常小,您可以在编译时之前只执行一个预定义的大型数组

我假设您知道如何创建一个数组,所以创建一个长度为500的数组。如果你想像游戏中那样“生成”一个链接,你只需要一个随机函数(我认为几乎每种语言都有一个内置的库),你需要做一些数学运算

无论您使用哪种语言,都肯定会有一个内置的图形库,或者您可以使用一个流行且易于使用的图形库。我要画一幅画来说明这一点

如图所示,有许多方法可以从数学上实现这一点,例如使用角度。然而,最简单的方法就是遵循方框

如果您以前使用过图形,您就知道向量是什么,如果不知道,您将需要学习。此图像中显示的9个向量(0,1)(1,0)(1,1)等可以创建为向量对象,甚至可以存储为单个整数

要使节点“移动”到另一条路径中,只需执行rand 1-9,然后将结果关联到9个可能向量中的一个,然后将它们添加到位置向量中。在数组中执行此操作最简单,只需使用rand int作为索引。在大多数c派生语言中,您可以这样做:

positionVector += changeVectorArray[rand(1,9)];
然后将位置向量增加9个向量中的一个,如上图所示

创建“路径”的最简单方法是在添加更改向量之前复制位置,然后将所有更改顺序存储在另一个“路径”数组中

要在屏幕上显示路径,只需在路径数组的第一个和第二个、第二个和第三个、第三个和第四个元素之间画一条线。如果我没弄错的话,这个(连接线的)公式是离散数学,如果你愿意,你可以做更复杂的路径形状,但你得到了要点

那至少应该让你开始。没有更多的信息,我真的帮不了你

我可以用一个切线来描述一系列不同的方法,你可以用不同的方式来实现这一点,但如果你只是问一些细节,可能会更容易

编辑>>>

继续这个答案,是的,现在来看,节点肯定可以重叠。要解决此问题,您可以使用碰撞检测,每次生成新的“位置”时,在添加它并绘制线之前,您必须像这样在数组中循环:

boolean copy = true;
for(int i = 0; i < getLength(pathArray); i++){

     if( newVector == pathArray[i]){
        copy=false;
     }
}
boolean copy=true;
for(int i=0;i
当然,如果copy仍然为true,则将新位置复制到pathArray中。注意:整个解决方案非常草率,随着数组变大,程序在该循环中的搜索时间将越来越长。这可能也不能保证路径是朝一个方向走的,但很有可能。请注意,即使位置向量不能相互重叠,这些线仍然可以相互重叠

考虑到所有这些,我认为它会起作用,优化取决于您。我认为,使用离散公式可能会有更有效的解决方案。您还可以使用这样的公式使路径朝特定方向移动,并执行其他更复杂的操作

如果要使路径沿特定方向移动,也可以很容易地对随机滚动应用约束。但是有很多方法我无法解释。你可以用谷歌搜索路径查找算法


祝你好运。

你用的是什么语言?你能提供一些代码或图片来解释你的意思吗?我用的是C语言,但任何语言都可以,实际上我不需要任何代码,只需要一个方向。关于图片,我在上面附上了一张图片,还有一个不超过一分钟的简单游戏。我玩了这个游戏,但我不明白你所说的路径重叠是什么意思,但是如果你想生成一条“像”这样的路径,应该不会太难。谢谢你的回答,我更新了我的问题。关于碰撞检测,我认为这不是一个好主意,它就像用蛮力破解密码一样。我相信一定有更好的方法,没问题。您可以接受an