开发Blackjack游戏时调用shuffleDeck函数出现单张牌undefined问题求助
洗牌函数出现undefined牌的原因及修复
问题根源
你的shuffleDeck函数循环逻辑有误:
- 循环初始值
i = deck.length,但数组的有效索引范围是0到deck.length - 1,此时deck[i]本身就是undefined。 - 交换操作
[deck[i], deck[j]] = [deck[j], deck[i]]会把这个undefined交换到数组的有效索引位置,最终导致牌组中出现无效的undefined牌。
修复方案
使用标准的Fisher-Yates洗牌算法,调整循环的起始索引,确保只操作数组的有效元素:
function shuffleDeck(deck) { // 从最后一个有效索引开始遍历 for (let i = deck.length - 1; i > 0; i--) { // 生成0到i之间的随机索引(包含i) const j = Math.floor(Math.random() * (i + 1)); // 交换当前元素和随机选中的元素 [deck[i], deck[j]] = [deck[j], deck[i]]; } }
额外小优化
makeDeck函数里有个多余的分号:let weight = parseInt(cardValues[i]);;,可以去掉一个分号,让代码更整洁。
内容的提问来源于stack exchange,提问作者Thomas Smidt
相关产品推荐
相关产品推荐

