Swift卡片匹配游戏中如何添加5秒自动翻牌延迟
解决方案
要实现两张卡片点击后5秒自动翻面,你可以通过DispatchQueue.main.asyncAfter添加延迟任务,在判断两张卡片不匹配时执行翻面逻辑。以下是修改后的关键代码和说明:
修改cardClicked方法
替换你当前代码中的cardClicked方法,添加不匹配卡片的延迟翻面逻辑:
@IBAction func cardClicked(_ sender: UIButton) { cardDrawn = Int(sender.restorationIdentifier!)! // 原有翻牌逻辑 if faceDown[cardDrawn] == true { buttonsArray[cardDrawn].setBackgroundImage(UIImage(named: String(answers[cardDrawn])), for: .normal) faceDown[cardDrawn] = false } else { buttonsArray[cardDrawn].setBackgroundImage(UIImage(named: "back"), for: .normal) faceDown[cardDrawn] = true } numFaceUp = faceDown.filter({$0 == false}).count if numFaceUp == 2 { disabledCards = true // 记录两张翻面卡片的位置 var flippedCardFound = false var cardPos1 = -1 var cardPos2 = -1 for i in 0...11 { if faceDown[i] == true { buttonsArray[i].isUserInteractionEnabled = false } if faceDown[i] == false && !flippedCardFound { cardPos1 = i flippedCardFound = true } else if faceDown[i] == false && flippedCardFound { cardPos2 = i } } // 判断卡片是否匹配 if cardPos2 != -1 && answers[cardPos1] == answers[cardPos2] { // 匹配成功逻辑 matchedCards[cardPos1] = true matchedCards[cardPos2] = true buttonsArray[cardPos1].isUserInteractionEnabled = false buttonsArray[cardPos2].isUserInteractionEnabled = false numFaceUp = 0 if matchedCards.filter({ $0 == true }).count == 12 { let alertController = UIAlertController(title: "通关!", message: "恭喜你完成游戏!", preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "确定", style: .default)) present(alertController, animated: true) } } else { // 不匹配时,5秒后自动翻面 DispatchQueue.main.asyncAfter(deadline: .now() + 5) { [weak self] in guard let self = self else { return } // 翻转两张卡片 self.buttonsArray[cardPos1].setBackgroundImage(UIImage(named: "back"), for: .normal) self.faceDown[cardPos1] = true self.buttonsArray[cardPos2].setBackgroundImage(UIImage(named: "back"), for: .normal) self.faceDown[cardPos2] = true // 恢复未匹配卡片的交互权限 self.numFaceUp = 0 self.disabledCards = false for i in 0...11 { if !self.matchedCards[i] { self.buttonsArray[i].isUserInteractionEnabled = true } } } } } if timeRemaining == 0 { GameOver() } }
关键修改说明
- 延迟任务:用
DispatchQueue.main.asyncAfter实现5秒延迟,确保UI操作在主线程执行,避免界面卡顿。 - 弱引用self:闭包中使用
[weak self]防止循环引用,避免内存泄漏。 - 状态恢复:延迟结束后,不仅翻转卡片,还会恢复其他未匹配卡片的可点击状态,保证游戏流程正常。
内容的提问来源于stack exchange,提问作者chloe
相关产品推荐
相关产品推荐

