扑克牌发牌顺序算法主要涉及洗牌和发牌两个核心步骤。以下是几种常见的实现方法:
这是最常用且高效的洗牌算法,保证每个排列出现的概率相等。
python
import random
def fisher_yates_shuffle(deck):
Fisher-Yates 洗牌算法
n = len(deck)
for i in range(n-1, 0, -1):
j = random.randint(0, i)
deck[i], deck[j] = deck[j], deck[i]
return deck
# 创建一副牌
deck = [f"{rank}{suit}" for suit in ["♠", "♥", "♦", "♣"]
for rank in ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]]
# 洗牌
shuffled_deck = fisher_yates_shuffle(deck.copy)
python
def deal_cards(shuffled_deck, num_players=4, cards_per_player=13):
发牌给多个玩家
hands = [[] for _ in range(num_players)]
# 轮转发牌
for i in range(cards_per_player * num_players):
player_index = i % num_players
if i
hands[player_index].append(shuffled_deck[i])
return hands
# 示例:4个玩家,玩家,每人13张牌
player_hands = deal_cards(shuffled_deck, 4, 13)
for i, hand in enumerate(player_hands):
print(f"玩家{i+1}: {hand}")
python
import random
class PokerDealer:
def __init__(self):
self.suits = ["♠", "♥", "♦", "♣"]
self.ranks = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
self.deck = self.create_deck
def create_deck(self):
创建一副完整的扑克牌
return [f"{rank}{suit}" for suit in self.suits for rank in self.ranks]
def shuffle(self):
洗牌
n = len(self.deck)
for i in range(n-1, 0, -1):
j = random.randint(0, i)
self.deck[i], self.deck[j] = self.deck[j], self.deck[i]
def deal(self, num_players=4, cards_per_player=None):
发牌
Args:
num_players: 玩家数量
cards_per_player: 每个玩家的牌数,None表示平均分配
if cards_per_player is None:
cards_per_player = len(self.deck) // num_players
hands = [[] for _ in range(num_players)]
# 轮转发牌
for i in range(cards_per_player * num_players):
if i >= len(self.deck):
break
player_index = i % num_players
hands[player_index].append(self.deck[i])
# 更新剩余的牌
self.deck = self.deck[cards_per_player * num_players:]
return hands
def reset(self):
重置牌堆
self.deck = self.create_deck
# 使用示例
dealer = PokerDealer
print("初始牌堆:", dealer.deck[:10], "...") # 显示前10张牌
dealer.shuffle
print("洗牌后:", dealer.deck[:10], "...")
hands = dealer.deal(num_players=4)
for i, hand in enumerate(hands):
print(f"玩家{i+1}的手牌 ({len(hand)}张): {sorted(hand)}")
python
def deal_doudizhu(deck):
斗地主发牌:3个玩家,留3张底牌
if len(deck) != 54: # 包含 包含大小王的完整牌
raise ValueError("斗地主需要54张牌")
shuffled = fisher_yates_shuffle(deck.copy)
# 发牌顺序:玩家1、2、3轮流,每人17张,最后3张为底牌
players = [[], [], []]
for i in range(51): # 前51张牌
player_idx = i % 3
微扑克h5链接players[player_idx].append(shuffled[i])
bottom_cards = shuffled[51:] # 最后3张为底牌
return players, bottom_cards
# 斗地主示例
full_deck = [f"{rank}{suit}" for suit in ["♠", "♥", "♦", "♣"]
for rank in ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]]
full_deck.extend(["小王", "大王"]) # 添加大小王
players, bottom_cards = deal_doudizhu(full_deck)
for i, hand in enumerate(players):
print(f"玩家{i+1}: {len(hand)}张牌")
print(f"底牌: {bottom_cards}")
1. 公平性: Fisher-Yates算法确保每个排列的概率相等
2. 效率: 时间复杂度O(n),空间复杂度O(1)
3. 灵活性: 可根据不同游戏规则调整发牌策略
4. 可扩展性: 支持不同数量的玩家和发牌模式
这些算法可以应用于各种扑克游戏,如德州扑克、桥牌、斗地主等,只需根据具体规则调整参数即可。