Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ - Fatal编程技术网

C++怪物漫游功能

C++怪物漫游功能,c++,C++,我有一个工作的怪物系统,通过向玩家的2D X,Y位置移动一定距离来跟踪玩家 然而,我现在想让这些怪物以随机的时间间隔游荡一小段距离。假设我们有一个怪物可以以每秒200-300厘米的速度移动到任何地方 我需要知道如何准确地确定怪物的目标位置X,Y。目前我只需选择一个200-300之间的随机数,然后将这些值添加到怪物当前的X&Y值。尽管这样做有时会超过预期的行驶距离 我的问题是,如何在X,Y网格上选择一个距离当前位置一定距离的位置 这是我现在拥有的移动代码 // Determines

我有一个工作的怪物系统,通过向玩家的2D X,Y位置移动一定距离来跟踪玩家

然而,我现在想让这些怪物以随机的时间间隔游荡一小段距离。假设我们有一个怪物可以以每秒200-300厘米的速度移动到任何地方

我需要知道如何准确地确定怪物的目标位置X,Y。目前我只需选择一个200-300之间的随机数,然后将这些值添加到怪物当前的X&Y值。尽管这样做有时会超过预期的行驶距离

我的问题是,如何在X,Y网格上选择一个距离当前位置一定距离的位置

这是我现在拥有的移动代码

        // Determines if position is changed via addition or subtraction.
        const int positive_or_negative = RandomValueInRange_New(0, 1);

        // Determines how much to move in each direction
        const int x = RandomValueInRange(200, 300);
        const int y = RandomValueInRange(200, 300);
        if (positive_or_negative == 1)
        {
           location.Move(x, y);
        }
        else
        {
           location.Move(-x, -y);
        }

这听起来像极坐标的工作。您想在给定的随机点的圆上拾取一个随机点,在一个范围半径内,然后将该点添加到怪物的当前位置:

// pick a random angle, in radians, between 0 and 2*pi
const double angle = ((double) RandomValueInRange(0, 628318)) / 100000.0;

// pick a random distance between min and max distance
const double radius = RandomValueInRange(200, 300);

// Convert polar co-ordinates to rectilinear co-ordinate deltas
const double dX = cos(angle)*radius;
const double dY = sin(angle)*radius;

// Add the rectilinear co-ordinates to your monster's position
location.Move(dX, dY);

这听起来像极坐标的工作。您想在给定的随机点的圆上拾取一个随机点,在一个范围半径内,然后将该点添加到怪物的当前位置:

// pick a random angle, in radians, between 0 and 2*pi
const double angle = ((double) RandomValueInRange(0, 628318)) / 100000.0;

// pick a random distance between min and max distance
const double radius = RandomValueInRange(200, 300);

// Convert polar co-ordinates to rectilinear co-ordinate deltas
const double dX = cos(angle)*radius;
const double dY = sin(angle)*radius;

// Add the rectilinear co-ordinates to your monster's position
location.Move(dX, dY);

您至少可以使用两种方法。您使用的方法将影响目标坐标的分布

第一,正如杰里米所说,是使用极坐标。r=200,300;ang=0,360。这导致r=200处的坐标密度高于r=300处的坐标密度,因为最大半径处的“环”比最小半径处的环具有50%以上的面积,这是由于其较大的环境

第二种方法是生成两个随机值x=random-300300;y=random-300300重复,直到随机对通过200和300之间距离的约束

int dX, dY, d2;
do {
    dX = RandomValueInRange(-300, 300);
    dY = RandomValueInRange(-300, 300);
    d2 = dX*dX + dY*dY;
} while ( d2 < 200*200  ||  d2 > 300*300);
location.Move(dX, dY);
这会在空间中产生均匀分布,但代价是重复生成随机数。只有43.6%的随机对会落在所需区域中,因此在生成可接受的对之前,循环通常会执行2到3次

虽然这种分布在x-y空间中是均匀的,但在距离上却不均匀。一个怪物平均移动超过250厘米,因为在250厘米到300厘米之间的环比在200厘米到250厘米之间的环有更多的面积

更现实的移动分布将根据上一个移动偏移下一个移动。例如,做一个鬼脸可能是一个低概率事件。除非怪物主动守卫一个给定的位置,在这种情况下,它可能是最有可能的行动


没有更多关于怪物行为的细节,如果你不太关心分布情况,最简单的生成就是极坐标路径,它给出了两个随机数生成的合法位置,没有循环

您至少可以使用两种方法。您使用的方法将影响目标坐标的分布

第一,正如杰里米所说,是使用极坐标。r=200,300;ang=0,360。这导致r=200处的坐标密度高于r=300处的坐标密度,因为最大半径处的“环”比最小半径处的环具有50%以上的面积,这是由于其较大的环境

第二种方法是生成两个随机值x=random-300300;y=random-300300重复,直到随机对通过200和300之间距离的约束

int dX, dY, d2;
do {
    dX = RandomValueInRange(-300, 300);
    dY = RandomValueInRange(-300, 300);
    d2 = dX*dX + dY*dY;
} while ( d2 < 200*200  ||  d2 > 300*300);
location.Move(dX, dY);
这会在空间中产生均匀分布,但代价是重复生成随机数。只有43.6%的随机对会落在所需区域中,因此在生成可接受的对之前,循环通常会执行2到3次

虽然这种分布在x-y空间中是均匀的,但在距离上却不均匀。一个怪物平均移动超过250厘米,因为在250厘米到300厘米之间的环比在200厘米到250厘米之间的环有更多的面积

更现实的移动分布将根据上一个移动偏移下一个移动。例如,做一个鬼脸可能是一个低概率事件。除非怪物主动守卫一个给定的位置,在这种情况下,它可能是最有可能的行动


没有更多关于怪物行为的细节,如果你不太关心分布情况,最简单的生成就是极坐标路径,它给出了两个随机数生成的合法位置,没有循环

这似乎更像是一个问题,而不是代码审查。您是否考虑过随机选取角度和距离,然后转换为X,Y?为什么您现在所做的不起作用?有什么问题吗?现在还不清楚你的目标与你现在的目标有什么不同。你不知道如何确定距离吗?毕达哥拉斯公式会有所帮助
在这种情况下,这似乎更像是一个所谓的问题,而不是代码审查。您是否考虑过随机选取角度和距离,然后转换为X,Y?为什么您现在所做的不起作用?有什么问题吗?现在还不清楚你的目标与你现在的目标有什么不同。你不知道如何确定距离吗?毕达哥拉斯公式在这种情况下会很有帮助。这正是我所需要的!非常感谢。正是我需要的!非常感谢。