返回

线性表练习扑克牌游戏(炸金花)

后端

炸金花简介

扑克牌游戏炸金花,也叫牌九,是一种常见的博弈游戏。玩家们使用扑克牌来进行游戏,目标是通过比较牌型来赢得筹码。炸金花的玩法非常简单,适合不同年龄段的人群。

游戏规则

  1. 发牌:玩家们围坐在牌桌旁,发牌者将一副扑克牌洗牌后,逆时针发给每位玩家三张牌,牌面朝下。
  2. 下注:发牌后,玩家们可以根据自己的牌型进行下注。下注的筹码数额由玩家自己决定。
  3. 开牌:下注结束后,玩家们可以开牌了。玩家们依次亮出自己的牌型,牌型较大的玩家赢得本轮游戏的筹码。
  4. 结束:游戏持续进行,直到有一位玩家赢得所有筹码,或者玩家们达成平局。

线性表模拟

扑克牌游戏炸金花可以用线性表来模拟。我们可以将扑克牌看成是一个一维数组,数组中的每个元素都是一张牌。洗牌的过程就是将数组中的元素随机打乱。发牌的过程就是将数组中的元素依次取出,发给每位玩家。游戏的过程就是比较玩家们的牌型,牌型较大的玩家赢得本轮游戏的筹码。

import random

# 构造扑克牌
cards = []
for suit in ['♠', '♥', '♦', '♣']:
    for rank in ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']:
        cards.append(suit + rank)

# 洗牌
random.shuffle(cards)

# 发牌
players = [[] for _ in range(4)]
for i in range(3):
    for player in players:
        player.append(cards.pop())

# 游戏过程
while True:
    # 下注
    bets = []
    for player in players:
        bet = int(input(f"Player {player + 1}, please enter your bet: "))
        bets.append(bet)

    # 开牌
    for player in players:
        print(f"Player {player + 1} shows:")
        for card in player:
            print(card, end=" ")
        print()

    # 比较牌型
    winner = -1
    max_rank = -1
    for player in range(len(players)):
        rank = evaluate_hand(players[player])
        if rank > max_rank:
            max_rank = rank
            winner = player

    # 结算筹码
    for player in range(len(players)):
        if player == winner:
            for bet in bets:
                players[player] += bet
        else:
            players[player] -= bet

    # 检查是否结束
    if len(players) == 1:
        print(f"Player {winner + 1} wins!")
        break

# 定义牌型评估函数
def evaluate_hand(hand):
    # 同花顺
    if is_straight_flush(hand):
        return 8

    # 四条
    if is_four_of_a_kind(hand):
        return 7

    # 满堂红
    if is_full_house(hand):
        return 6

    # 同花
    if is_flush(hand):
        return 5

    # 顺子
    if is_straight(hand):
        return 4

    # 三条
    if is_three_of_a_kind(hand):
        return 3

    # 两对
    if is_two_pair(hand):
        return 2

    # 一对
    if is_one_pair(hand):
        return 1

    # 散牌
    return 0

# 定义同花顺判断函数
def is_straight_flush(hand):
    return is_straight(hand) and is_flush(hand)

# 定义四条判断函数
def is_four_of_a_kind(hand):
    ranks = [card[1] for card in hand]
    return ranks.count(ranks[0]) == 4

# 定义满堂红判断函数
def is_full_house(hand):
    ranks = [card[1] for card in hand]
    return ranks.count(ranks[0]) == 3 and ranks.count(ranks[1]) == 2

# 定义同花判断函数
def is_flush(hand):
    suits = [card[0] for card in hand]
    return len(set(suits)) == 1

# 定义顺子判断函数
def is_straight(hand):
    ranks = [card[1] for card in hand]
    ranks.sort()
    for i in range(1, len(ranks)):
        if ranks[i] - ranks[i - 1] != 1:
            return False
    return True

# 定义三条判断函数
def is_three_of_a_kind(hand):
    ranks = [card[1] for card in hand]
    return ranks.count(ranks[0]) == 3 or ranks.count(ranks[1]) == 3 or ranks.count(ranks[2]) == 3

# 定义两对判断函数
def is_two_pair(hand):
    ranks = [card[1] for card in hand]
    return ranks.count(ranks[0]) == 2 and ranks.count(ranks[1]) == 2

# 定义一对判断函数
def is_one_pair(hand):
    ranks = [card[1] for card in hand]
    return ranks.count(ranks[0]) == 2 or ranks.count(ranks[1]) == 2 or ranks.count(ranks[2]) == 2