JS开发卡牌游戏随机抽牌时出现卡片未推入数组错误如何修复
问题原因
你的bug是边界值没有被包含在判断分支里,26和39两个数值完全没有匹配的if条件,抽到这两张牌时不会被推入手牌数组。
你当前的区间划分存在遗漏:
- 红桃分支
pickedNumber < 14:覆盖1~13,逻辑正常 - 梅花分支
pickedNumber > 13 && pickedNumber < 26:仅覆盖14~25,遗漏了26 - 方块分支
pickedNumber > 26 && pickedNumber < 39:仅覆盖27~38,遗漏了39 - 黑桃分支
pickedNumber > 39 && pickedNumber < 53:覆盖40~52,逻辑正常
你提到的其他数值触发bug属于误判,是因为同时抽到了26/39导致手牌数量不符合预期,误以为是其他数值的问题。
修复方案
调整if判断的边界条件即可,同时可以优化冗余逻辑:
- 删掉多余的下界判断,前面的if分支已经过滤了更小的数值,无需重复判断
- 将区间上界改为
<=覆盖边界值 - 不要直接修改
pickedNumber原变量,避免出现不可预期的变量污染 - 已经拿到随机索引
randomNumber,无需再调用indexOf查找卡牌位置,直接用索引删除即可 - 将
hand.push(card)统一放到判断逻辑外,避免重复代码和遗漏推送
修复后的完整代码如下:
function log(txt) { console.log(txt); } let cards = []; let hand = []; // 填充牌组 for (let i = 1; i < 53; i++) { cards.push(i); } // 抽3张牌 for (let i = 0; i < 3; i++) { // 生成随机索引 let randomNumber = Math.floor(Math.random() * cards.length); let pickedNumber = cards[randomNumber]; log(pickedNumber); // 直接用随机索引删除已抽卡牌 cards.splice(randomNumber, 1); let card = { value: 0, suit: "", }; // 调整后的花色判断逻辑 if (pickedNumber < 14) { card.value = pickedNumber; card.suit = "♥"; } else if (pickedNumber <= 26) { card.value = pickedNumber - 13; card.suit = "♣"; } else if (pickedNumber <= 39) { card.value = pickedNumber - 26; card.suit = "♦"; } else { card.value = pickedNumber - 39; card.suit = "♠"; } hand.push(card); } log(hand);
内容的提问来源于stack exchange,提问作者user17602118
相关产品推荐
相关产品推荐

