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

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判断的边界条件即可,同时可以优化冗余逻辑:

  1. 删掉多余的下界判断,前面的if分支已经过滤了更小的数值,无需重复判断
  2. 将区间上界改为<=覆盖边界值
  3. 不要直接修改pickedNumber原变量,避免出现不可预期的变量污染
  4. 已经拿到随机索引randomNumber,无需再调用indexOf查找卡牌位置,直接用索引删除即可
  5. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:01