You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:30:04