扑克牌算法代码

以下是一些常见的扑克牌相关算法实现,包括洗牌、发牌和基本游戏逻辑:

1. 扑克牌类定义

python

import random

from enum import Enum

class Suit(Enum):

HEARTS = "♥

DIAMONDS = "♦

CLUBS = "♣

SPADES = "♠

class Rank(Enum):

TWO = 2

THREE = 3

FOUR = 4

FIVE = 5

SIX = 6

SEVEN = 7

EIGHT = 8

NINE = 9

TEN = 10

扑克牌算法代码

JACK = 11

QUEEN = 12

KING = 13

ACE = 14

class Card:

def __init__(self, suit, rank):

self.suit = suit

self.rank = rank

def __str__(self):

rank_str =

if self.rank.value

rank_str = str(self.rank.value)

else:

rank_str = {11: 'J', 12: 'Q', 13: 'K', 14: 'A'}[self.rank.value]

return f"{rank_str}{self.suit.value}

def __repr__(self):

return self.__str__

2. 扑克牌组类

python

class Deck:

def __init__(self):

self.cards = []

self.reset

def reset(self):

重置牌组为完整的一副牌

self.cards = [Card(suit, rank) for suit in Suit for rank in Rank]

def shuffle(self):

洗牌算法

  • Fisher-Yates洗牌算法"""
  • n = len(self.cards)

    for i in range(n-1, 0, -1):

    j = random.randint(0, i)

    self.cards[i], self.cards[j] = self.cards[j], self.cards[i]

    def deal(self, num_cards=1):

    发指定数量的牌

    if num_cards > len(self.cards):

    raise ValueError("牌不够了!")

    dealt_cards = self.cards[:num_cards]

    self.cards = self.cards[num_cards:]

    return dealt_cards

    def __len__(self):

    return len(self.cards)

    def __str__(self):

    return f"牌组剩余 {len(self)} 张牌: {self.cards}

    3. 德州扑克手牌评估

    python

    class PokerHandEvaluator:

    @staticmethod

    def evaluate_hand(cards):

    评估手牌强度

    返回:(手牌类型, 主要比较值)

    手牌类型从高到低:

    皇家同花顺 > 同花顺 > 四条 > 满堂红 > 同花 > 顺子 > 三条 > 两对 > 一对 > 高牌

    if len(cards)

    raise ValueError("至少需要5张牌进行评估")

    # 按花色和点数分组

    suits = {}

    ranks = {}

    for card in cards:

    suits.setdefault(card.suit, []).append(card)

    ranks.setdefault(card.rank.value, []).append(card)

    sorted_ranks = sorted([card.rank.value for card in cards], reverse=True)

    # 检查同花

    flush = False

    flush_cards = None

    for suit_cards in suits.values:

    if len(suit_cards) >= 5:

    flush = True

    flush_cards = sorted([card.rank.value for card in suit_cards], reverse=True)[:5]

    # 检查顺子

    straight = False

    straight_high = None

    unique_sorted = sorted(set(sorted_ranks), reverse=True)

    for i in range(len(unique_sorted)

  • 4):
  • if unique_sorted[i]

  • unique_sorted[i+4] == 4:
  • straight = True

    straight_high = unique_sorted[i]

    break

    # 特殊情况:A-2-3-4-5顺子

    if set([14, 2, 3, 4, 5]).issubset(set(sorted_ranks)):

    straight = True

    straight_high = 5

    # 检查各种组合

    pairs = []

    three_of_a_kind = False

    four_of_a_kind = False

    for rank_value, rank_cards in ranks.items:

    count = len(rank_cards)

    if count == 4:

    wepoker轻量版h5

    four_of_a_kind = True

    four_rank = rank_value

    elif count == 3:

    three_of_a_kind = True

    three_rank = rank_value

    elif count == 2:

    pairs.append(rank_value)

    pairs.sort(reverse=True)

    # 确定手牌类型

    if flush and straight:

    if straight_high == 14: # A-high straight flush

    return ("皇家同花顺", [14])

    return ("同花顺", [straight_high])

    if four_of_a_kind:

    kicker = max(r for r in sorted_ranks if r != four_rank)

    return ("四条", [four_rank, kicker])

    if three_of_a_kind and len(pairs) >= 1:

    return ("满堂红", [three_rank, max(pairs)])

    if flush:

    return ("同花", flush_cards[:5])

    if straight:

    return ("顺子", [straight_high])

    if three_of_a_kind:

    kickers = sorted([r for r in sorted_ranks if r != three_rank], reverse=True)[:2]

    return ("三条", [three_rank] + kickers)

    if len(pairs) >= 2:

    high_pair, low_pair = pairs[0], pairs[1]

    kicker = max(r for r in sorted_ranks if r not in [high_pair, low_pair])

    _pair])

    return ("两对", [high_pair, low_pair, kicker])

    if len(pairs) == 1:

    kickers = sorted([r for r in sorted_ranks if r != pairs[0]], reverse=True)[:3]

    return ("一对", [pairs[0]] + kickers)

    return ("高牌", sorted_ranks[:5])

    @staticmethod

    def compare_hands(hand1, hand2):

    比较两手牌的大小

    type_order = {

    高牌": 0, "一对": 1, "两对": 2, "三条": 3,

    顺子": 4, "同花": 5, "满堂红": 6,

    四条": 7, "同花顺": 8, "皇家同花顺": 9

    type1, values1 = hand1

    type2, values2 = hand2

    if type_order[type1] > type_order[type2]:

    return 1

    elif type_order[type1]

    return -1

    else:

    # 相同类型,比较值

    for v1, v2 in zip(values1, values2):

    if v1 > v2:

    return 1

    elif v1

    return -1

    return 0

    4. 使用示例

    python

    def main:

    # 创建并洗牌

    deck = Deck

    print("初始牌组:")

    print(deck)

    deck.shuffle

    print("\

    洗牌后:")

    print(deck)

    # 发牌给玩家

    players = [[] for _ in range(4)]

    for _ in range(2): # 每人发两张手牌

    for i in range(4):

    players[i].extend(deck.deal)

    print("\

    玩家手牌:")

    for i, hand in enumerate(players):

    print(f"玩家 {i+1}: {hand}")

    # 发公共牌

    community_cards = deck.deal(5)

    print(f"\

    公共牌: {community_cards}")

    # 评估每个玩家的最佳五张牌

    print("\

    玩家最佳手牌评估:")

    player_hands = []

    for i, hand in enumerate(players):

    all_cards = hand + community_cards

    best_hand_type, best_values = PokerHandEvaluator.evaluate_hand(all_cards)

    player_hands.append((best_hand_type, best_values))

    print(f"玩家 {i+1}: {best_hand_type} {best_values}")

    # 找出获胜者

    winner = 0

    for i in range(1, len(player_hands)):

    if pare_hands(player_hands[i], player_hands[winner]) > 0:

    winner = i

    print(f"\

    获胜者是玩家 {winner+1}!")

    if __name__ == "__main__":

    main

    5. 其他实用函数

    python

    def simulate_probability(num_simulations=10000):

    模拟特定手牌获胜的概率

    wins = 0

    for _ in range(num_simulations):

    deck = Deck

    deck.shuffle

    # 假设玩家1有特定的手牌

    player1_hand = [

    Card(Suit.HEARTS, Rank.ACE),

    Card(Suit.HEARTS, Rank.KING)

    # 从牌组中移除这些牌

    deck.cards = [card for card in deck.cards if card not in player1_hand]

    # 发牌给其他玩家

    other_players = [[] for _ in range(3)]

    for _ in range(2):

    for i in range(3):

    other_players[i].extend(deck.deal)

    # 发公共牌

    community_cards = deck.deal(5)

    # 评估所有玩家的手牌

    player1_all = player1_hand + community_cards

    player1_eval = PokerHandEvaluator.evaluate_hand(player1_all)

    is_winner = True

    for hand in other_players:

    player_all = hand + community_cards

    player_eval = PokerHandEvaluator.evaluate_hand(player_all)

    if pare_hands(player_eval, player1_eval) > 0:

    is_winner = False

    break

    if is_winner:

    wins += 1

    probability = wins / num_simulations

    print(f"在 {num_simulations} 次模拟中,该手牌获胜概率为: {probability:.2%}")

    return probability

    这些算法涵盖了扑克牌游戏中的核心功能,包括洗牌、发牌和手牌评估。您可以根据需要扩展这些基础功能来实现更复杂的扑克游戏逻辑。