2017-03-16 58 views
0

我在所有視圖中都有不同的UIButton。所有的UIButtons都有一個標籤,並有一張圖片來表示一張卡片。一些UIButton被放置在其他卡的後面,並且如果特定的卡被成功播放,則可以被「解鎖」。我檢查,如果後面的卡可以解鎖的方法是如下:是否有可能縮短大量不斷檢查布爾值的代碼

if card1.enabled == false && card2.enabled == false { 

unlockCard3() 

} 
if card3.enabled == false && card4.enabled == false { 

unlockCard5() 

} 
if card8.enabled == false && card5.enabled == false { 

    unlockCard11() 

    } 

如果任何卡已經成功地出場,我沒有開啓他們獲得上述功能的工作。它確實有效,但是很多/重複代碼。我很好奇是否有辦法縮短這段代碼。看到這個圖像:enter image description here(左邊一個)。在這張圖片中,當10張黑桃成功播放時,應該解鎖10張黑桃的右邊和上邊的牌。當6張黑桃成功解鎖後,只有10張黑桃卡才能解鎖。所有這些檢查和長代碼...必須有一種方法來使這個過程更容易。感謝您的每一個建議。

+0

拳頭PLE ase不要使用== false或== true,!card1.enabled看起來要好很多 –

回答

2

浦牛逼你的按鈕在陣列中,並使用第二個數組來表示的卡的關係:

let buttons = [button0, button1, button2, button3, button4, button5, button6, button7, button8, button9, button10, button11] 

let relatives = [(1, 2, 3), (3, 4, 5), (5, 8, 11)] 

for (card1, card2, card3) in relatives { 
    if !buttons[card1].enabled && !buttons[card2].enabled { 
     unlockCard(card3) 
    } 
} 
+0

如果我早點知道這種方法,這將爲我節省像輸入所有這些if語句幾個小時:')。謝謝!! –

1

是的,你可以把所有的卡片和布爾變量放到一個數組中,然後用一個循環遍歷它們。比主要部分將looke這樣的:

for (int i = 2; i < number_of_cards; i++) 
{ 
    if (!cards[i - 2].enabled && !cards[i - 1].enabled) 
    unlockCard(i); 
} 

你將需要:

  • 使用陣列,用來初始化卡
  • 可能使用較少那麼現在指數的一個(即card3將成爲卡[2])
  • 更改unlockCard方法接受參數 - 索引卡的
+0

是的,如果所有的卡都可以以某種方式解鎖,那麼這是可行的,但是我的解決方案稍微複雜一些。我更新了信息。 –

+0

'for'循環不再有效Swift ... – Grimxn

1

一個替代方案是創建一個可跟蹤哪些被鎖卡對象,並採取行動時,卡播放和解鎖。例如:

class Card 
{ 
    //MARK - Public 
    func play() { 
     if locks > 0 {return}//it's locked - cannot be played 

     blockedCards.forEach({ (card) in 
      card.locks -= 1 
     }) 
     blockedCards = [Card]() 

     //do anything else you need to (e.g. hide/move the button) 
    } 

    func blockCard(card: Card) { 
     card.locks += 1 
     blockedCards.append(card) 
    } 

    //MARK - Private 
    private var blockedCards = [Card]() 

    private var locks = 0 { 
     didSet { 
      if locks == 0 { 
       //call your unlock function (e.g. flip the UIButton and show the card) 
      } 
     } 
    } 
} 

你的UIButton可以設置相應的卡play方法的目標 - 如果卡解鎖遊戲只會做一些事情。

例如,讓我們假設你有在頂端4卡A,B,C和d在底部d(用B阻斷和C)的水平和阻擋B:

D 
/\ 
    B C 
/
A 

您可以配置級別,如下所示:

let cardA = Card() 
let cardB = Card() 
let cardC = Card() 
let cardD = Card() 

cardB.blockCard(card: cardD) 
cardC.blockCard(card: cardD) 
cardA.blockCard(card: cardB) 

然後對象會在內部處理所有的事情,例如:

cardB.play()//nothing happens (blocked by A) 
cardD.play()//nothing happens (blocked by B and C) 
cardA.play()//PLAYED - B unlocked 
cardB.play()//PLAYED 
cardD.play()//nothing happens (blocked by C) 
cardC.play()//PLAYED - D unlocked 
cardD.play()//PLAYED