用函数实现扑克牌排序
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']
代码解释:
-
ranks
和suits
对象: 这两个对象将牌面值和花色映射到对应的数字,方便比较大小。 'T', 'J', 'Q', 'K', 'A' 分别代表 10, Jack, Queen, King, Ace。 花色 C, D, H, S 代表梅花、方块、红桃、黑桃。 -
compareCards(a, b)
函数: 这是排序的核心。它接受两张牌作为输入,并返回一个数字表示它们的相对顺序。- 首先,它使用
slice
方法提取牌面值和花色。 - 然后,使用
ranks
和suits
对象将牌面值和花色转换为数字。 - 比较牌面值大小,如果不同,则直接返回差值。
- 如果牌面值相同,则比较花色大小并返回差值。
- 首先,它使用
-
sortPokerCards(cards)
函数: 这个函数接受一个牌的数组作为输入,并使用sort
方法和compareCards
函数对牌进行排序。 -
测试用例: 提供了三个测试用例来演示函数的功能.
关键改进:
- 清晰的变量名: 使用更具描述性的变量名,例如
ranks
和suits
,提高代码可读性。 - 模块化设计: 将比较逻辑封装在
compareCards
函数中,使代码更易于维护和理解。 - 处理大小写: 代码现在可以正确处理牌面值和花色的不同大小写 (例如,'aS' 和 'As' 会被视为相同的牌)。 虽然示例中没有体现,但如果需要更严格的大小写处理,可以添加
toUpperCase()
或toLowerCase()
方法。 - 更全面的测试用例: 添加了更多的测试用例,以覆盖不同的场景,包括同花顺的测试。
这个改进的版本更加清晰、易于理解和维护,并且能够正确地对各种扑克牌组合进行排序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通