Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何继续调用函数,直到返回与以前不同的输出?_Xcode_Swift_Sprite Kit - Fatal编程技术网

Xcode 如何继续调用函数,直到返回与以前不同的输出?

Xcode 如何继续调用函数,直到返回与以前不同的输出?,xcode,swift,sprite-kit,Xcode,Swift,Sprite Kit,我有一个函数,将随机输出一个颜色 func getRandomColor() -> SKColor{ let randomaval = arc4random_uniform(4) var color = SKColor() switch(randomaval) { case 0: color = redColor case 1: color = greenColor case 2: co

我有一个函数,将随机输出一个颜色

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
}
当两个物体碰撞时,我调用这个函数来改变颜色

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
以外的内容。大多数时候,当我的
条件为true时,它会再次调用
redColor
,我不知道如何避免这种情况。我基本上希望每次调用
getRandomColor
时都返回不同的颜色。我如何做到这一点

反复调用
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)
另一种方法是让getRandomColor跟踪自己的最后结果。在您的初始化贴花中:

var lastrandomcolor: SKColor
然后

然后使用:

aball.color = getRandomColor()

我更喜欢第二种方法,你的传球颜色是你不想要的,因为它给了你更多的控制权,也就是说,在某些时候,你可能不希望球是其他颜色,而不仅仅是自己的颜色。e、 如果它在天空中就不是蓝色的。您甚至可以传递一组不应返回的颜色。

每次发生碰撞时返回一对颜色(每个对象一种颜色)如何?通过这种方式,你可以确保它们是不同的。你可以在这里看到我对一个类似问题的回答:@KennethBruno我看过了,作为一个刚刚开始学习编码的初学者,我正在努力理解这将如何适用于我的情况。@Sharukh我们都曾经是初学者!我们的想法是用存储在其中的每种颜色构建一个数组。您将其洗牌,使其顺序为“随机”。然后你从末端取一个,使用它,然后把它放回一个随机的地方,但不要靠近你要挑选的末端。这样你就可以永远选择,而不是重复相同的颜色。明白了,我将尝试在中实现它,并让它工作。我正在尝试你的第二种方法,但它说
使用未解析的标识符“颜色”
。此外,我意识到我在这里写代码时犯了一个错误。
func-getRandomNumer()->SKColor
应该是
func-getRandomNumer->SKColor
。我不知道这是否是导致错误的原因。我已经更新了我的问题,这根本不是解决问题的好方法,最坏的情况意味着你陷入了无限循环。你真的应该将颜色从评估过程中一起移除,以确保100%成功地不拾取相同的颜色。陷入无限循环的唯一方法是,如果选择新颜色的算法总是返回相同的结果,而恰好是你不想要的颜色。在这种情况下,问题在于初始颜色选择器,而不是排除过程。但您是对的,您必须小心使用循环,以确保有一个get out子句。
aball.color = getRandomColor()