1

私がやろうとしているのは、私が作成しているゲームが 5 秒ごとにランダムにキャラクターを変更するようにすることです。タイマーを介してこれを機能させました。唯一の問題は、それらを繰り返したくないことです。現在、ダミーコードに取り組んでいるため、画面の色を変更するだけですが、繰り返さないようにするにはどうすればよいですか?それが今呼んだ番号?

if (timer <= 0)
{
    num = rand.Next(2);
    timer = 5.0f;   
}

それが現在のコードであり、ドローで文字通り「num が特定の数に等しい場合は背景色を変更する」ことを行いました。

prev_num チェッカーを追加しようとしましたが、正しく動作しません (ここにあります)

if (timer <= 0)
{
    prev_number = num;
    num = rand.Next(2);
    if (prev_number == num)
    {
        num = rand.Next(2);
    }
    else
    {
        timer = 5.0f;
    }
}
4

3 に答える 3

1

(たとえば) 1 ~ 5 の乱数rand.Next(5)を選択する場合、考えられる結果は 5 つあるため、ゼロベースの「序数」または結果のインデックスを選択し、それを範囲に変換することを検討してください。実際に必要です (この場合は、1 つ追加します)。

先ほど選んだ数字を除いて、0 ~ 4 の乱数が必要な場合、考えられる結果は 5 つではなく 4 つだけです。前の数字が 3 だった場合、考えられる結果は 0、1、2、または 4 です。次に、これら 4 つの結果 ( rand.Next(4)) のいずれかを選択し、その序数を目的の範囲にマッピングすることで、アルゴリズムを簡素化できます。簡単なマッピングは、新しい乱数が前の数よりも小さい場合はそのまま返し、そうでない場合 (等しいか大きい場合) に 1 を追加します。

int new_num = rand.Next(4);
if(new_num >= prev_num)
{
    new_num++;
}

新しい数値は、以前の数値と同じ範囲にあることが保証されますが、同じではありません。

于 2013-03-12T12:13:01.560 に答える
0

連番の配列を作成し、アプリケーションの開始時にそれらを(トランプのように)シャッフルします。

int[] numbers = new int[100];
for(int i = 0; i < numbers.Length; i++)
    numbers[i] = i;
Shuffle(numbers);

関数を使用してリストをシャッフルします。

public static void Shuffle<T>(IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

その後、リストから順番にそれらにアクセスできます。リストがシャッフルされたため、ランダムになりますが、各番号はリストに1回しか存在しないため、繰り返しはありません。

if (timer <= 0)
{
    num = numbers[index];
    index++;
    timer = 5.0f;   
}
于 2013-03-12T13:16:12.237 に答える
0

たぶん、単一のチェックではなく、ループに入れるだけですか?また、タイマーが内部にあったため、常に正しく更新されていなかっ
たと思います。else

if (timer <= 0)
{
    tempNum = rand.Next(2);

    do
    {
        tempNum = rand.Next(2);
    }
    while (tempNum == num)

    num = tempNum;
    timer = 5.0f;
}
于 2013-03-12T12:04:32.987 に答える