2017-12-25 18 views
1

私は4色あります。プレイヤーが同じ色に2回連続していられないようにしたい。プレイヤーがオブジェクトに衝突すると、RandomColor()が呼び出されます。そのため、この関数はゲーム中に何度も呼び出され、プレーヤーが色を変更しないことがあります。毎回乱数を生成し、最後の数字を含まない

using UnityEngine; 

public class ColorManager : MonoBehaviour { 

    public SpriteRenderer player; 
    public string playerColor; 

    public Color[] colors = new Color[4]; 


    private void Awake() 
    { 
     RandomColor();   
    } 

    public void RandomColor() 
    { 
     int index = Random.Range(0, 4); 

     switch (index) 
     { 
      case 0: 
       player.color = colors[0]; //colors[0] is orange 
       playerColor = "orange"; 
       break; 

      case 1: 
       player.color = colors[1]; //colors[1] is pink 
       playerColor = "pink"; 
       break; 

      case 2: 
       player.color = colors[2]; //colors[2] is blue 
       playerColor = "blue"; 
       break; 

      case 3: 
       player.color = colors[3]; //colors[3] is purple 
       playerColor = "purple"; 
       break; 
      }  
    }  
} 

はdo-while文、whileループ使用してみましたが、私は時々2回連続で同じ色を受けるので、私は明らかに、それは間違ってやっています。もし誰かがそれを見つけ出し、それがどのように働いているのかを説明するのはすばらしいことです。なぜなら私はこの問題について大きな時間を費やしていて、とても興味があります。

+0

youzには4色あり、新しい色を選択すると、プレーヤーの色が現在の色と異なるまでランダムに再調整されます。 –

+0

より良いテクニック:現在有効な色のみを含むコレクションを作成し、そのコレクションからランダムな要素を選択します。不変なコレクションを使用すると役に立ちます。 –

答えて

3

まず、除外を伴う乱数を生成できる関数が必要です。あなたは再びそれを呼び出すexclusionパラメータ次回にそれを渡すように

int RandomWithExclusion(int min, int max, int exclusion) 
{ 
    int result = UnityEngine.Random.Range(min, max - 1); 
    return (result < exclusion) ? result : result + 1; 
} 

あなたはそれを呼び出すたびに、あなたはグローバル変数に結果を格納する必要があります。以下は、私がそのために使用するものです。

私は関数が呼び出されるたびにそれを行う必要がないように変更しました。新しいRandomWithExclusion関数がそれを行います。

int excludeLastRandNum; 
bool firstRun = true; 

int RandomWithExclusion(int min, int max) 
{ 
    int result; 
    //Don't exclude if this is first run. 
    if (firstRun) 
    { 
     //Generate normal random number 
     result = UnityEngine.Random.Range(min, max); 
     excludeLastRandNum = result; 
     firstRun = false; 
     return result; 
    } 

    //Not first run, exclude last random number with -1 on the max 
    result = UnityEngine.Random.Range(min, max - 1); 
    //Apply +1 to the result to cancel out that -1 depending on the if statement 
    result = (result < excludeLastRandNum) ? result : result + 1; 
    excludeLastRandNum = result; 
    return result; 
} 

テスト

void Update() 
{ 
    Debug.Log(RandomWithExclusion(0, 4)); 
} 

最後の数字は、次の関数呼び出しには表示されません。

あなたの具体的な解決のために

、単に置き換える

int index = RandomWithExclusion(0, 4); 
+0

あなたはなぜ(最小、最大-1)なぜ "-1"があるのか​​説明しますか?それは私が3番を決して得られないことを意味しますか?数字は0,1,2,3です。そして、3でランデムになると、3 - 1になり、結果は2になります。つまり、3は決してオプションになりませんか? –

+1

いいえ、 'Random.Range'のmaxから1を減算し、' if'文の結果に応じて1を結果に戻します。これは除外したい番号を削除するために使用する手法です。あなたは数字3を得るでしょう。私の答えの中のテストコードを 'Update'関数でテストしてみましょう。簡単な問題を解決するための答えを修正し、それに多くのコメントを追加しました。 – Programmer

+0

-1で何が起こっているのかかなりわかりました。最後の質問(私は心から願っています)、なぜこれが最初の実行かどうかを知る必要がありますか? –

0

何をする必要がRandomColorは前のものと同じ色を返す場合、もう一度それを呼び出す、判決を追加であると

int index = Random.Range(0, 4); 

、簡単?

+0

[削除](https:// stackoverflow)のようなフリーズ/ロックの問題が発生します。com/a/47968494/3785314)が回答しました。あなたはコルーチンでそれを呼び出すと、フレームを待って修正することができますが、それはゲームを遅くなります。 – Programmer

関連する問題