2016-04-04 53 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 
} 

當兩個物體發生碰撞我調用這個函數來改變顏色

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

每次發生碰撞時,如何返回**一對顏色**(每個對象一個)?這樣,你可以確保他們不同。 –

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

另一種方法是讓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

我試着你的第二種方法,但它說'使用未解決的標識符「顏色''。另外,我意識到我在寫下代碼時犯了一個錯誤。 'func getRandomNumer() - > SKColor'應該是'func getRandomColor - > SKColor'。我不知道這是什麼原因導致的錯誤。我也更新了我的問題 – Sharukh

+1

這不是一個很好的解決問題的方法,最壞的情況意味着你陷入了無限循環。您真的應該將評估過程中的顏色一起移除,以確保100%的成功不會挑選相同的顏色。 – Knight0fDragon

+0

陷入無限循環的唯一方法就是如果你選擇新顏色的算法總是返回相同的結果,而這恰好是你不想要的顏色。在這種情況下,問題是最初的顏色選擇器,而不是排除過程。但你是對的,因爲你必須小心循環,以確保有一個退出條款。 –

相關問題