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

金字塔卡牌程序图片卡判定Bug排查求助

修复卡牌程序中图片卡判定的Bug

看起来你的问题核心在于随机索引的生成逻辑错误以及卡牌展示/移除的逻辑混乱,这才导致了时而正常时而异常的情况,特别是当cardDeck元素被移除后,固定范围的随机数和错误的索引偏移会引发各种问题。咱们一步步拆解问题:

问题分析

  • 固定范围的随机数生成:你用了randomCard = Int.random(in: 0...51),但cardDeck是会不断移除元素的,当deck里的卡牌数量少于52张时,这个随机数很可能超出当前cardDeck的索引范围,直接引发错误或逻辑混乱。
  • 错误的索引偏移:else分支里你用了row1card1.image = cardDeck[randomCard+1],这完全不符合逻辑——随机选中的是randomCard对应的卡牌,却展示了下一个索引的卡牌,然后移除的是randomCard,这就导致展示的卡牌和操作逻辑完全不匹配,进而引发判定错误。
  • 不合理的判定条件:if cardDeck.count > randomCard + 1这个条件完全没必要,正确的判断应该是随机数是否在当前cardDeck的有效索引范围内,也就是randomCard < cardDeck.count。

修正后的代码示例

针对你提供的row1card1tapped方法,修正后的代码应该是这样的:

var randomCard: Int = 0
var cardPosition = 0
var cardDeck = [card0, card1, card2, card3 /* ... 其他卡牌元素 */]
let pictureCards = [0, 10, 11, 12, 13, 23, 24, 25, 26, 36, 37, 38, 39, 49, 50, 51]

// row1card1
@IBAction func row1card1tapped(_ sender: UITapGestureRecognizer) {
    // 先判断卡组是否为空,避免后续报错
    guard cardDeck.count > 0 else {
        // 这里可以加游戏结束的提示逻辑
        return
    }
    // 生成当前卡组范围内的随机索引,而非固定0-51
    randomCard = Int.random(in: 0..<cardDeck.count)
    
    if pictureCards.contains(randomCard) {
        print("current random card: \(randomCard)")
        print("bildekort")
        row1card1.image = cardDeck[randomCard]
        let lossAlert = UIAlertController(title: "Feil", message: "Bildekort! Start på nytt", preferredStyle: .alert)
        lossAlert.addAction(UIAlertAction(title: "OK", style: .default))
        self.present(lossAlert, animated: true)
    } else {
        // 直接展示选中的随机卡牌,移除多余的+1偏移
        row1card1.image = cardDeck[randomCard]
        // 移除当前选中的卡牌
        cardDeck.remove(at: randomCard)
        print("removed card number: \(randomCard)")
        score += 2
        currentPoints.text = "\(score)"
        // 用遍历简化禁用交互的代码
        [row1card1, row1card2, row1card3, row1card4, row1card5].forEach { $0?.isUserInteractionEnabled = false }
    }
}

额外优化建议

  • 把多行卡牌的点击逻辑封装成通用方法,避免重复编写相似代码。
  • 可以给pictureCards添加注释,说明这些数字对应的卡牌规则,方便后续维护。

这样修改后,随机索引始终在当前cardDeck的有效范围内,展示的卡牌和移除的卡牌完全一致,图片卡的判定也会准确无误,不会再出现第二行操作时的异常情况了。

内容的提问来源于stack exchange,提问作者lamalama69

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:54:49