2016-04-04 1 views
0

私はランダムにSKColorを出力する関数を持っています。以前とは異なる出力を返すまで関数を呼び出す方法は?

func getRandomColor() -> SKColor{ 
    let randomaval = arc4random_uniform(4) 
    var color = SKColor() 
    switch(randomaval) 
    { 
    case 0: 
     color = redColor 
    case 1: 
     color = greenColor 
    case 2: 
     color = blueColor 
    case 3: 
     color = yellowColor 
    default:() 
    } 
    return color 
} 

2体は私が何をしたいのか色

aball.color = getRandomColor() 

    if aball.color == redColor && getRandomColor() == redColor { 
     aball.color = getRandomColor() //to set the color to something other than red 
     aball.colorBlendFactor = 1.0 
    } 

を変更するには、この関数を呼び出して衝突し、私はaball.color = getRandomColor()を言うときgetRandomColor()が再びredColorであれば、それはifを実行する必要がある、ということです関数がredColor以外の何かを返すまで、再び文を返します。ほとんどの場合、私のifの条件が真であるとき、それはredColorをもう一度呼びます、そして、私はそれを避ける方法を理解できません。基本的には、毎回getRandomColorが呼び出されるたびに異なる色を返すようにしています。私はそれをどのように達成するのですか?

+0

衝突が発生するたびに** ** 1対の色**(各オブジェクトに1つ)を返すのはどうですか?そうすれば、あなたは彼らが異なっていることを確認することができます。 –

+0

私の答えはここで見ることができます:http://stackoverflow.com/a/36255680/887210 – ColGraff

+0

@KennethBruno私はそれを見て、ちょうどコーディングを学ぶようになった初心者として、私はどのように理解するのに苦労していますそれは私の状況に当てはまるでしょう。 – Sharukh

答えて

0

あなたのgetRandomColor()関数がボールの現在の色以外のものになるまで繰り返し呼び出すのはいかがですか? :

repeat { 
    let newColor = getRandomColor() 
} while newcolor != aball.color 
aball.color = newColor 

また、あなたはそれが戻らないはずの色のパラメータを受け入れるようにgetRandomColorを再書き込みができ、その後、aball.colorであなたの改正関数を呼び出す:ときに、次に

func getRandomNumber(notColor: SKColor) -> SKColor{ 
    repeat { 
     let randomaval = arc4random_uniform(4) 
     var color = SKColor() 
     switch(randomaval) 
     { 
     case 0: 
      color = redColor 
     case 1: 
      color = greenColor 
     case 2: 
      color = blueColor 
     case 3: 
      color = yellowColor 
     default:() 
     } 
     let newColor = getRandomColor() 
    } while color != notColor 
    return color 
} 

aball.color = getRandomColor(notColor: aball.color) 

もう1つの方法は、getRandomColorに独自の最終結果を追跡させることです。あなたの初期化decalreで:その後、

var lastrandomcolor: SKColor 

func getRandomNumber() -> SKColor{ 
    repeat { 
     let randomaval = arc4random_uniform(4) 
     var color = SKColor() 
     switch(randomaval) 
     { 
     case 0: 
      color = redColor 
     case 1: 
      color = greenColor 
     case 2: 
      color = blueColor 
     case 3: 
      color = yellowColor 
     default:() 
     } 
     let newColor = getRandomColor() 
    } while color != lastRandomColor 
    lastRandomcolor = color 
    return color 
} 

は、単に使用します。

aball.color = getRandomColor() 

私のように、どこにあなたが返されたくない色を渡す第二のアプローチを好みます特定の時間にボールを他の色にするのではなく、自分の色にすることができます。例えば空であれば青色ではない。返されるべきではない色の配列を渡すことさえできます。

+0

私はあなたの2番目のアプローチをしようとしていますが、 '未解決の識別子の使用"という色があります。また、ここで自分のコードを書き留めて間違いを犯したことに気付きました。 'func getRandomNumer() - > SKColor'は' func getRandomColor - > SKColor'を意味します。それがエラーの原因であるかどうかは分かりません。私もあなたの質問を更新しました – Sharukh

+1

これはあなたの問題を解決するための良い方法ではありません、最悪の場合のシナリオはあなたが無限ループにこだわっていることを意味します。同じ色が選択されないようにするには、実際に評価プロセスから色をすべて削除して100%の成功を保証する必要があります。 – Knight0fDragon

+0

無限ループに陥る唯一の方法は、新しい色を選択するアルゴリズムが、常に望ましくない色と同じ結果を返す場合です。その場合、問題は除外プロセスではなく、最初のカラーピッカーです。しかし、あなたは、get-out節があることを確認するために、ループに注意する必要があるという点では正しいです。 –