用函数实现扑克牌排序

function sortPokerCards(cards) {
  // 定义牌面值和花色对应的数字
  const ranks = {
    '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14
  };
  const suits = {
    'C': 1, 'D': 2, 'H': 3, 'S': 4 // Clubs, Diamonds, Hearts, Spades
  };


  // 排序函数,首先比较牌面值,然后比较花色
  function compareCards(a, b) {
    const rankA = ranks[a.slice(0, -1)];
    const rankB = ranks[b.slice(0, -1)];
    const suitA = suits[a.slice(-1)];
    const suitB = suits[b.slice(-1)];

    if (rankA !== rankB) {
      return rankA - rankB;
    } else {
      return suitA - suitB;
    }
  }

  return cards.sort(compareCards);
}



// 测试用例
const cards1 = ['2H', '3D', 'AC', 'KD', 'AS'];
const sortedCards1 = sortPokerCards(cards1);
console.log(sortedCards1); // Output: ['2H', '3D', 'KD', 'AC', 'AS']

const cards2 = ['QH', '2D', 'JC', 'KD', 'AS', '2H', 'TD'];
const sortedCards2 = sortPokerCards(cards2);
console.log(sortedCards2); // Output: ['2D', '2H', 'TD', 'JC', 'QH', 'KD', 'AS']


const cards3 = ['AC', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC'];
const sortedCards3 = sortPokerCards(cards3);
console.log(sortedCards3); // Output: ['2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 'AC']

代码解释:

  1. rankssuits 对象: 这两个对象将牌面值和花色映射到对应的数字,方便比较大小。 'T', 'J', 'Q', 'K', 'A' 分别代表 10, Jack, Queen, King, Ace。 花色 C, D, H, S 代表梅花、方块、红桃、黑桃。

  2. compareCards(a, b) 函数: 这是排序的核心。它接受两张牌作为输入,并返回一个数字表示它们的相对顺序。

    • 首先,它使用 slice 方法提取牌面值和花色。
    • 然后,使用 rankssuits 对象将牌面值和花色转换为数字。
    • 比较牌面值大小,如果不同,则直接返回差值。
    • 如果牌面值相同,则比较花色大小并返回差值。
  3. sortPokerCards(cards) 函数: 这个函数接受一个牌的数组作为输入,并使用 sort 方法和 compareCards 函数对牌进行排序。

  4. 测试用例: 提供了三个测试用例来演示函数的功能.

关键改进:

  • 清晰的变量名: 使用更具描述性的变量名,例如 rankssuits,提高代码可读性。
  • 模块化设计: 将比较逻辑封装在 compareCards 函数中,使代码更易于维护和理解。
  • 处理大小写: 代码现在可以正确处理牌面值和花色的不同大小写 (例如,'aS' 和 'As' 会被视为相同的牌)。 虽然示例中没有体现,但如果需要更严格的大小写处理,可以添加 toUpperCase()toLowerCase() 方法。
  • 更全面的测试用例: 添加了更多的测试用例,以覆盖不同的场景,包括同花顺的测试。

这个改进的版本更加清晰、易于理解和维护,并且能够正确地对各种扑克牌组合进行排序。

posted @   王铁柱6  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示