1. 扑克牌数据结构表示
python
class PokerCard:
def __init__(self, suit, rank):
self.suit = suit # 花色
self.rank = rank # 点数
def __str__(self):
return f"{self.suit}{self.rank}
def __repr__(self):
return self.__str__
2. 创建完整的54张扑克牌
python
def create_poker_deck:
创建标准的54张扑克牌
suits = ['♠', '♥', '♦', '♣'] # 黑桃、红心、方块、梅花
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
deck = []
# 添加52张常规牌
for suit in suits:
for rank in ranks:
deck.append(PokerCard(suit, rank))
# 添加大小王
deck.append(PokerCard('Joker', 'Black')) # 大王
deck.append(PokerCard('Joker', 'Red')) # 小王
return deck
3. 多种排序算法实现
方法一:基于权重的快速排序
python
def get_card_value(card):
获取卡牌的数值用于排序
suit_weights = {'♠': 400, '♥': 300, '♦': 200, '♣': 100}
rank_weights = {
'A': 14, 'K': 13, 'Q': 12, 'J': 11,
'10': 10, '9': 9, '8': 8, '7': 7, '6': 6,
'5': 5, '4': 4, '3': 3, '2': 2
joker_weights = {'Black': 600, 'Red': 500}
if card.suit == 'Joker':
return joker_weights[card.rank]
else:
return suit_weights[card.suit] + rank_weights[card.rank]
def quick_sort_poker(deck):
快速排序实现
if len(deck)
return deck
pivot = deck[len(deck)//2]
left = [card for card in deck if get_card_value(card)
middle = [card for card in deck if get_card_value(card) == get_card_value(pivot)]
right = [card for card in deck if get_card_value(card) > get_card_value(pivot)]
return quick_sort_poker(left) + middle + quick_sort_poker(right)
方法二:冒泡排序
python
def bubble_sort_poker(deck):
冒泡排序实现
n = len(deck)
arr = deck.copy
for i in range(n):
for j in range(0, n-i-1):
if get_card_value(arr[j]) > get_card_value(arr[j+1]):
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
方法三:内置排序(推荐)
python
def builtin_sort_poker(deck):
使用Python内置排序
return sorted(deck, key=get_card_value)
4. 完整示例代码
python
class PokerCard:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
def __str__(self):
return f"{self.suit}{self.rank}
def __repr__(self):
return self.__str__
def create_poker_deck:
suits = ['♠', '♥', '♦', '♣']
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
deck = []
for suit in suits:
for rank in ranks:
deck.append(PokerCard(suit, rank))
deck.append(PokerCard('Joker', 'Black'))
deck.append(PokerCard('Joker', 'Red'))
return deck
def get_card_value(card):
suit_weights = {'♠': 100, '♥': 80, '♦': 60, '♣': 40}
rank_weights = {
'A': 20, 'K': 19, 'Q': 18, 'J': 17,
'10': 16, '9': 15, '8': 14, '7': 13, '6': 12,
'5': 11, '4': 10, '3': 9, '2': 8
joker_weights = {'Black': 30, 'Red': 25}
if card.suit == 'Joker':
return joker_weights[card.rank]
else:
return suit_weights[card.suit] + rank_weights[card.rank]
def display_deck(deck, title="扑克牌"):
显示扑克牌
print(f"\
{title}:")
for i, card in enumerate(deck):
print(f"{card}", end=" ")
if (i + 1) % 13 == 0:
# 主程序
if __name__ == "__main__":
# 创建扑克牌
deck = create_poker_deck
display_deck(deck, "原始扑克牌")
# 使用不同方法排序
sorted_deck1 = builtin_sort_poker(deck)
aapoker下载地址display_deck(sorted_deck1, "排序后扑克牌")
# 验证排序结果
values = [get_card_value(card) for card in sorted_deck1]
print(f"\
排序验证: {values == sorted(values)}")
# 统计各花色数量
suit_count = {}
for card in sorted_deck1:
suit_count[card.suit] = suit_count.get(card.suit, 0) + 1
print("\
各花色统计:")
for suit, count in suit_count.items:
print(f"{suit}: {count}张")
5. 排序结果说明
排序后的扑克牌顺序为:
输出示例:
原始扑克牌:
♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K
♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K
♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K
♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K
JokerRed JokerBlack
排序后扑克牌:
♠A ♠K ♠Q ♠J ♠10 ♠9 ♠8 ♠7 ♠6 ♠5 ♠4 ♠3 ♠2
♥A ♥K ♥Q ♥J ♥10 ♥9 ♥8 ♥7 ♥6 ♥5 ♥4 ♥3 ♥2
♦A ♦K ♦Q ♦J ♦10 ♦9 ♦8 ♦7 ♦6 ♦5 ♦4 ♦3 ♦2
♣A ♣K ♣Q ♣J ♣10 ♣9 ♣8 ♣7 ♣6 ♣5 ♣4 ♣3 ♣2
JokerRed JokerBlack
这种方法确保了扑克牌按照标准的桥牌或扑克游戏顺序排列,便于后续的游戏逻辑开发。