Python扑克牌游戏更新哦~【增加更多牌类】

server/2025/3/16 16:06:13/

以下是更新后的代码,包含了常见单牌、对子、三带、顺子、连对、飞机等

更新后的完整代码


import random

class Card:
    def __init__(self, suit, rank):
        self.suit = suit  # 花色:♠, ♥, ♣, ♦
        self.rank = rank  # 牌面:3, 4, 5, ..., K, A, 2, Joker

    def __str__(self):
        return f"{self.suit}{self.rank}"

    def __lt__(self, other):
        # 定义牌的大小比较规则
        rank_order = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', 'Joker']
        return rank_order.index(self.rank) < rank_order.index(other.rank)

class Deck:
    def __init__(self):
        suits = ['♠', '♥', '♣', '♦']
        ranks = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2']
        self.cards = [Card(suit, rank) for suit in suits for rank in ranks]
        self.cards.append(Card('Joker', 'Black'))
        self.cards.append(Card('Joker', 'Red'))
        random.shuffle(self.cards)

    def deal(self, num_players):
        hands = [[] for _ in range(num_players)]
        for i in range(17):
            for j in range(num_players):
                hands[j].append(self.cards.pop())
        return hands, self.cards[:3]  # 返回手牌和底牌

class Player:
    def __init__(self, name):
        self.name = name
        self.hand = []

    def play_card(self, card_indices):
        played_cards = [self.hand.pop(i) for i in sorted(card_indices, reverse=True)]
        return played_cards

    def __str__(self):
        return f"{self.name}: {', '.join(str(card) for card in self.hand)}"

class Game:
    def __init__(self, players):
        self.deck = Deck()
        self.players = [Player(name) for name in players]
        self.hands, self.bottom_cards = self.deck.deal(len(players))
        for i, player in enumerate(self.players):
            player.hand = self.hands[i]
        self.current_player = 0
        self.last_played = []

    def next_player(self):
        self.current_player = (self.current_player + 1) % len(self.players)

    def is_valid_play(self, played_cards):
        if not played_cards:
            return False  # 空牌无效

        # 判断牌型
        if len(played_cards) == 1:
            return True  # 单牌

        if len(played_cards) == 2:
            if played_cards[0].rank == played_cards[1].rank:
                return True  # 对子
            if all(card.rank == 'Joker' for card in played_cards):
                return True  # 王炸
            return False

        if len(played_cards) == 3:
            if all(card.rank == played_cards[0].rank for card in played_cards):
                return True  # 三张
            return False

        if len(played_cards) == 4:
            if all(card.rank == played_cards[0].rank for card in played_cards):
                return True  # 炸弹
            return False

        # 判断顺子(至少5张连续单牌)
        if len(played_cards) >= 5:
            ranks = sorted([card.rank for card in played_cards], key=lambda x: ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2'].index(x))
            for i in range(1, len(ranks)):
                if ranks[i] != ranks[i-1]:
                    return False
            return True

        # 其他牌型(如连对、飞机等)可以继续扩展
        return False

    def play_round(self):
        player = self.players[self.current_player]
        print(player)
        card_indices = input("选择要出的牌(用逗号分隔):").split(',')
        card_indices = [int(i) for i in card_indices]
        played_cards = player.play_card(card_indices)

        if not self.is_valid_play(played_cards):
            print("出牌无效,请重新选择!")
            player.hand.extend(played_cards)  # 将牌退回手牌
            return

        if self.last_played and not self.is_bigger_than_last(played_cards):
            print("出牌必须比上家大!")
            player.hand.extend(played_cards)  # 将牌退回手牌
            return

        self.last_played = played_cards
        print(f"{player.name} 出了:{', '.join(str(card) for card in played_cards)}")
        self.next_player()

    def is_bigger_than_last(self, played_cards):
        if not self.last_played:
            return True  # 如果没有上家出牌,任何牌都有效

        # 简单比较牌的数量和第一张牌的大小
        if len(played_cards) != len(self.last_played):
            return False  # 牌数不同不能比较

        return played_cards[0] > self.last_played[0]

    def start(self):
        while all(len(player.hand) > 0 for player in self.players):
            self.play_round()
        winner = [player for player in self.players if len(player.hand) == 0][0]
        print(f"{winner.name} 赢了!")

if __name__ == "__main__":
    players = ["Alice", "Bob", "Charlie"]
    game = Game(players)
    game.start()
 

---

### 新增功能说明

1. 牌型判断:
    支持单牌、对子、三张、炸弹、王炸、顺子等基本牌型。
    可以通过扩展`is_valid_play`方法支持更多牌型(如连对、飞机等)。

2. 出牌规则:
    玩家出牌必须符合牌型规则。
    出牌必须比上家的牌大(通过`is_bigger_than_last`方法判断)。

3. 错误处理:
    如果玩家出牌无效,程序会提示并让玩家重新选择。


### 示例运行



Alice: ♠3, ♥4, ♣5, ♦6, ♠7, ♥8, ♣9, ♦10, ♠J, ♥Q, ♣K, ♦A, ♠2, ♥Joker, ♣Joker
选择要出的牌(用逗号分隔):0,1,2
出牌无效,请重新选择!

Alice: ♠3, ♥4, ♣5, ♦6, ♠7, ♥8, ♣9, ♦10, ♠J, ♥Q, ♣K, ♦A, ♠2, ♥Joker, ♣Joker
选择要出的牌(用逗号分隔):0,1
Alice 出了:♠3, ♥4

Bob: ♠5, ♥6, ♣7, ♦8, ♠9, ♥10, ♣J, ♦Q, ♠K, ♥A, ♣2, ♦Joker
选择要出的牌(用逗号分隔):0,1
Bob 出了:♠5, ♥6



http://www.ppmy.cn/server/175468.html

相关文章

linux - 基础IO之操作与文件描述符全解析:从C语言到系统调用底层实现

目录 1.回顾c语言中所学的文件 2.提炼对文件的理解&#xff08;linux基础io第一阶段的学习&#xff09; a.在操作系统内部&#xff0c;一个进程和一个被打开的文件&#xff0c;他们到后面会变成两种对象之间的指针关系。 b.文件 属性 内容 c.在c语言中,以w的方式打开文件…

基于自定义线程池手写一个异步任务管理器

我们在后端执行某些耗时逻辑操作时往往会导致长时间的线程阻塞&#xff0c;在这种情况之下&#xff0c;我们往往会引一条异步线程去处理这些异步任务&#xff0c;如果每次都创建新的线程来处理这些任务&#xff0c;不仅会增加代码冗余&#xff0c;还可能造成线程管理混乱&#…

[设计模式]1_设计模式概览

摘要&#xff1a;设计模式原则、设计模式的划分与简要概括&#xff0c;怎么使用重构获得设计模式并改善代码的坏味道。 本篇作概览与检索用&#xff0c;后续结合源码进行具体模式深入学习。 目录 1、设计模式原理 核心原则&#xff08;语言无关&#xff09; 本质原理图 原…

深入理解 RTP、RTCP、RTMP、RTSP、HLS 及 live555 推拉流实现

流媒体技术在音视频传输中起着关键作用&#xff0c;其中 RTP、RTCP、RTMP、RTSP 和 HLS 是最常见的协议。本文将详细介绍它们的区别&#xff0c;并探讨为什么 HLS 逐渐取代 RTMP。此外&#xff0c;还将解析 RTSP 作为控制协议的作用&#xff0c;并讲解 live555 如何实现音视频的…

网络安全就业形势

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。 第一部分&am…

DeepSeek 与 ChatGPT的主要区别

DeepSeek 是由中国公司 DeepSeek AI &#xff08;杭州深度求索人工智能基础技术研究有限公司&#xff09;开发的 AI 聊天机器人&#xff0c;于 2024 年推出。相比之下&#xff0c;ChatGPT 是由美国 AI 研究实验室 OpenAI 创建的&#xff0c;自 2022 年以来就已上市。两者都是专…

【部署】ubuntu部署olmOCR

目录 一、安装依赖二、安装conda新环境和sglang三、PDF解析1. 运行2. 原始 PDF 并排查看结果3. 更换模型 四、可能出现的问题1.note: This error originates from a subprocess, and is likely not a problem with pip.2.转换单个PDF命令运行时3.ImportError: libnccl.so.2: ca…

【NLP】10. 机器学习模型性能评估指标(含多类别情况), ROC,PRC

机器学习模型性能评估指标&#xff08;含多类别情况&#xff09; 1. 模型评估指标简介 在机器学习中&#xff0c;模型的性能评估非常重要。常用的模型评估指标有&#xff1a; 准确率&#xff08;Accuracy&#xff09;精度&#xff08;Precision&#xff09;召回率&#xff0…