2017-01-13 11 views
0

私はSpriteKitSwift 3を使って簡単なゲームを作成しています。 私は指輪/円の配列を持っている:配列のネストされたfor-loops

mRings = [mRingOne, mRingTwo, mRingThree, mRingFour, mRingFive] 

配列内の各オブジェクトは、私は各リングの色を変更したいゲームの中でいくつかの点で異なる色を持っていますが、私はこのための2条件を持っています起こること: 1.リングは前に1回反復した色を持つべきではありません。 2.各リングは他のリングとは異なる色にする必要があります。私はこれをした最初の条件のため

func changeRingsColor(){ 
    var previousColor: UIColor? 
    for ring in mRings { 
     previousColor = ring.fillColor 
     repeat{ 
      ring.fillColor = hexStringToUIColor(hex: mColors[Int(arc4random_uniform(UInt32(5)))]) 
     }while(ring.fillColor.isEqual(previousColor)) 
    } 
} 

、それが働いているが、しかし、私は第二の条件に答えるための方法を考え出すことができませんでした。

for (int i=0; i<mRings.length; i++){ 
     for(int j=1; j<mRings.length; j++){ 
     if (ring[i].fillColor == ring[j].fillColor){ 
      generate another color for 'j' ring. 
     } 
    } 
} 

を私が試したものは何も働いていない: Javaでは私はおそらくこのような何かをするだろう。 あなたが私を助けることを願っています、ありがとうございます!

btw、mColorsは5色の配列で、そこから色を選びます。

+0

あなたが探しているのは、「ランダムな逸脱」、つまりすべての要素を変更するランダムな並べ替えです。 –

+0

最も単純なアルゴリズムは、要素のランダムな順序を生成し、その順序で次の要素に色を渡すことです。 – Sulthan

答えて

1

私は実装の詳細の一部を無視している問題の核心に集中するつもりです:

  • ループ配列
  • を通じて各ループ内では、時に新しいループを開始現在のインデックスを配列の最後に追加します。

私は上記を誤解しているかどうかを教えてください。しかし、私はこのようにそれを行うだろう:

for (index, ring) in mRings.enumerated() { 
    let remainingRings = mRings[index+1..<mRings.count] 
    for otherRing in remainingRings { 
     print("Now comparing \(ring) to \(otherRing)") 
    } 
} 

を第一に、enumerated()は、ループの最初の各反復で、あなたの現在のリング、およびインデックスの両方を提供します。次に、現在のインデックスから最後(remainingRings)まで配列をスライスし、それらをループします。

+0

それは 'let remainingRings = mRings [index + 1 .. nayem

+0

よろしくお願いします。 – Connor

+0

ありがとうございます。 – swiftnewbie

0

それは、このようにJavaコードを書き換えることが可能である。このような

let mRings = ["mRingOne", "mRingTwo", "mRingThree", "mRingFour", "mRingFive"] 

for (index, item) in mRings.enumerated() { 
    for item in index + 1..<mRings.count { 

    } 
} 
+0

ありがとうございます、すでに回答があります。 – swiftnewbie

0

何かが動作します:

func changeRingsColor(){ 
    // extract the previous colors 
    let colors = rings.map { $0.fillColor } 
    // the order in which the rings will pass color to each other 
    let passOrder = mRings.indices.shuffled() 

    for i in mRings.indices { 
     let previous = i == 0 ? mRings.count - 1 : i - 1   
     mRings[passOrder[i]].fillColor = colors[passOrder[previous]] 
    } 
} 

どのようにそれが動作しないshuffled

this実装を使用していますか?

ランダムに各リングの色を選択する代わりに、リングが色を交換する順序をランダムに生成しています(passOrder)。すべてのリングがその色をその順序で別のリングに渡すので、同じ色を保つことはできません。

+0

ありがとうございます、すでに回答があります。 – swiftnewbie

+0

これは、ランダムな "逸脱"(固定点を持たない順列)を得る興味深いアプローチです。しかし、それはすべての可能な*狂乱を生み出すことはありません。たとえば、ABCDは決してBADCに置換されません。 –

+0

@MartinR非常に真実で、4つのアイテムのために、ちょうど1つの置換が見落とされています:)アルゴリズムごとに別々に行うべきではない点を説明したかったのです。 – Sulthan

関連する問題