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()