金字塔卡牌程序图片卡判定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
相关产品推荐
相关产品推荐

