游戏动态

扑克牌发牌顺序的算法

2025-12-25 14:25:24

扑克牌发牌顺序算法主要涉及洗牌和发牌两个核心步骤。以下是几种常见的实现方法:

1. Fisher-Yates 洗牌算法牌算法

这是最常用且高效的洗牌算法,保证每个排列出现的概率相等。

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)

2. 简单轮转发牌

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}")

3. 完整实现

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):

洗牌

  • 使用Fisher-Yates算法"""
  • 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)}")

    4. 带底牌的斗地主发牌

    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. 可扩展性: 支持不同数量的玩家和发牌模式

    这些算法可以应用于各种扑克游戏,如德州扑克、桥牌、斗地主等,只需根据具体规则调整参数即可。