在数组上嵌套for循环

时间:2017-01-13 12:59:31

标签: arrays swift sprite-kit

我正在使用SpriteKitSwift 3创建一个简单的游戏。 我有一系列戒指/圈子:

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

数组中的每个对象都有不同的颜色,在游戏中的某些点我想改变每个环的颜色,但我有两个条件: 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))
    }
}

并且它正在工作,但是,我无法找到回答第二个条件的方法。 在Java我可能会做这样的事情:

    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.
        }
    }
 }

但我没有尝试过任何工作。 希望你们能帮助我,提前致谢!

btw,mColors是一个由5种不同颜色组成的数组,从那里我选择颜色。

3 个答案:

答案 0 :(得分: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()在第一个for循环的每次迭代中为您提供当前环和索引。然后,我们将数组从当前索引切片到末尾(remainingRings),并循环遍历这些。

答案 1 :(得分:0)

可以用这种方式重写Java代码:

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

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

    }
}

答案 2 :(得分: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)。由于每个戒指都会按顺序将其颜色传递给不同的戒指,因此您可以确保没有颜色保持不变。