0

私はゲームをプログラミングしています。エリア内を移動できる 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);

この場合、NPC は 2 人ですが、50 人の NPC を試しても、方向、歩数、立つ時間はすべて同じになります。

どうすれば異なる値を取得できますか?

このウェブサイトでランダムに関するガイドや質問を読もうとしましたが、何も機能しません。スランドを別の場所に置いてみましたが、それでもすべての NPC は同じ方向に進みます。おそらく、ランダムな値を取得するSDL関数がありますか?

for についてもう 1 つ: を削除する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;
4

3 に答える 3

3

問題は、各呼び出しで RNG を再シードしていることです。

srand ( time(NULL) );すべてのメソッドから行を削除すると、期待どおりに機能します。

コードを改善するために、ほとんどのバグの駆除が完了したら、メインsrand(time(NULL );メソッド (ランダムを取得するメソッドではない)の先頭に挿入することをお勧めします。

srandC++ 標準によると、値を生成するために実際に呼び出す必要はありません。への呼び出しは、プログラムの開始時に呼び出したrandかのように動作します。srand(1)


さらに、ランダム化コードは必要以上に複雑です。その理由を説明します。

行っている方法では

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

何らかの理由で 5 つの乱数を描画していますが、最後の 1 つだけを使用しています。これはもったいないので、最初に引いた数字だけで十分です。として実装する

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

ランダムで予測不可能な結果を​​ 5 倍速く返します。

于 2013-09-30T14:09:56.270 に答える
2

呼び出すsrand ( time(NULL) );たびに、同じ値をシードしています。

srand ( time(NULL) );アプリケーションの最初に一度呼び出すと、問題が解決するはずです。

于 2013-09-30T14:10:46.750 に答える