我的观点中有不同的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()
}
如果成功播放了任何一张牌,我就禁止他们使用以上功能。它确实有效,但它很多/重复代码。我很好奇是否有办法缩短这段代码。见图:(左一)。在这张照片中,当成功播放10个黑桃时,应该解锁10个黑桃的右侧和顶部的卡片。只有当黑桃6成功解锁时,才能解锁10只黑桃的左卡。所有这些检查和长代码......必须有一种方法可以使这个过程更容易。谢谢你的每一个建议。
答案 0 :(得分: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)
}
}
答案 1 :(得分:1)
是的,您可以将所有卡和布尔变量放入一个数组中,然后使用循环迭代它们。比主要部分更像这样:
for (int i = 2; i < number_of_cards; i++)
{
if (!cards[i - 2].enabled && !cards[i - 1].enabled)
unlockCard(i);
}
您需要:
unlockCard
方法以接受参数 - 卡片索引答案 2 :(得分: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
方法上设置目标 - 只有在卡片解锁时,播放才能执行操作。
例如,让我们假设你有一张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