gpt4 book ai didi

c++ - 如何使用 SDL 游戏在 C++ 中获取随机值

转载 作者:太空宇宙 更新时间:2023-11-04 15:44:19 25 4
gpt4 key购买 nike

我正在编写一个游戏;我有一个可以在该区域四处移动的 NPC,但是有一个问题:由于随机值,它们都朝着同一个方向移动

这些是随机函数:

int MoveObjects::GetRandomDirectionToMove()
{
srand ( time(NULL) );
int x;
for(int i=0;i<5;i++)
x = rand() % 4 + 1;
return x;
}

int MoveObjects::GetRandomStepsToMove()
{
srand ( time(NULL) );
int x;
for(int i=0;i<5;i++)
x = rand() % 80 + 50;
return x;
}

int MoveObjects::GetRandomTimeToStand()
{
srand ( time(NULL) );
int x;
for(int i=0;i<5;i++)
x = rand() % 20 + 10;
return x;
}

这是主要的

for(int i=0;i<2;i++)
npc[i].MoveAround(area);

在这种情况下,有 2 个 NPC,但即使我尝试 50 个 NPC,都一样:方向、步骤、站立时间。

我如何获得不同的值?

我试图阅读本网站中有关随机的任何指南或任何问题,但没有任何效果。我也试过将 srand 放在不同的位置,但所有 NPC 仍然朝着相同的方向前进。也许有 SDL 函数来获取随机值?

关于 for 的另一件事:如果我删除 for i,则始终得到相同的值。这意味着,所有方向都相同 1 方向

完整的移动代码:

int frame = GetFrameCount();
frame++;
SetFrameCount(frame);

static int current_step = 0;
static int current_direction = 0;
static int current_wait = 0;

if(!current_step) {
current_step = GetRandomStepsToMove();
current_direction = GetRandomDirectionToMove();
current_wait = GetRandomTimeToStand();
}

if(!current_wait) {
if(current_direction == 1)
MoveUp(area);
else if(current_direction == 2)
MoveDown(area);
else if(current_direction == 3)
MoveRight(area);
else if(current_direction == 4)
MoveLeft(area);

current_step--;
if(current_step < 0) current_step = 0;
}

current_wait--;
if(current_wait < 0) current_wait = 0;

最佳答案

问题是您在每次调用中重新播种 RNG。

从所有方法中删除 srand ( time(NULL) ); 行,它们将按预期工作。

为了使代码更好,我建议在 main 方法(不是获取随机数的方法)的开头插入 srand(time(NULL );,完成消灭大部分错误后。

根据 c++ 标准,您实际上不需要调用 srand 来生成值;调用 rand 的行为就像您在程序开始时调用了 srand(1) 一样。


此外,您的随机代码确实比需要的复杂得多,我将解释原因:

在那个方法中

int MoveObjects::GetRandomDirectionToMove() {
int x;
for(int i=0;i<5;i++)
x = rand() % 4 + 1;
return x;
}

出于某种原因,您要抽取五个随机数,但您只使用了最后一个。这是一种浪费,您可以只使用抽取的第一个数字就可以了。将其实现为

int MoveObjects::GetRandomDirectionToMove() {
return rand() % 4 + 1;
}

返回的结果同样随机,同样不可预测,而且速度快五倍。

关于c++ - 如何使用 SDL 游戏在 C++ 中获取随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19096321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com