Doudizhu Case_Demonstration of initializing, shuffling, and dealing cards

running result

Landlord case

code show as below:

# 1. 扑克牌作为对象呈现
# 2, 创建未发牌的牌堆的列表
# 3. 创建三个玩家牌堆的列表
# 4. 创建底牌的元组
# 5. 最原始的牌堆初始化, 将54张牌加入到牌堆
# 6. 创建洗牌操作
# 7. 创建发牌操作
import random
import copy


class Poke(object):
    """扑克类"""
    # 原始牌堆
    pokes = list()
    # 洗好的牌堆
    washed_pokes = list()
    # 玩家一牌堆
    player1 = list()
    # 玩家二牌堆
    player2 = list()
    # 玩家三牌堆
    player3 = list()
    # 底牌牌堆
    last = list()

    def __init__(self, flower, num):
        # 花色
        self.flower = flower
        # 点数
        self.num = num

    def __str__(self):
        """打印对象时, 打印花色和点数"""
        return "{}{}".format(self.flower, self.num)

    @classmethod
    def init_pokes(cls):
        """初始化牌堆类方法"""
        # 花色
        flowers = ("♦", "♣", "♥", "♠")
        # 点数
        nums = ("3", "4", "5", "6", "7", "8", "9", "10", "J", "K", "Q", "A", "2")
        # 大小王
        kings = {
    
    "big": "大王", "small": "小王"}

        # 组成牌堆
        for num_ in nums:
            for flower_ in flowers:
                # 原始牌堆列表中 放入一个个扑克牌对象
                cls.pokes.append(Poke(flower_, num_))
        # 再将大小王加入原始牌堆
        # 放入小王
        cls.pokes.append(Poke(kings.get("small"), ""))
        # 放入大王
        cls.pokes.append(Poke(kings.get("big"), ""))


    @classmethod
    def wash(cls):
        """洗牌方法"""
        # 复制一份牌, 好用于洗牌操作
        cls.washed_pokes = copy.deepcopy(cls.pokes)
        # 从牌堆中拿一张牌 与 随机的一张牌交换位置
        # 54张牌, 循环交换54次
        for idx in range(54):
            # 随机产生一个索引, 范围0到53
            idx_random = random.randint(0, 53)
            # 交换牌位置
            cls.washed_pokes[idx], cls.washed_pokes[idx_random] = cls.washed_pokes[idx_random], cls.washed_pokes[idx]

    @classmethod
    def send_poke(cls):
        """发牌方法"""
        # 复制一份洗好的牌, 用于发牌操作
        washed_pokes = copy.deepcopy(cls.washed_pokes)
        # 每个玩家手里17张牌
        # 发牌给玩家一
        cls.player1.extend(washed_pokes[0:51:3])
        # for _ in range(0, 17):
        #     # 从洗好的牌中 连续发17张牌 给到玩家
        #     cls.player1.append(washed_pokes.pop(0))
        # 发牌给玩家二
        cls.player2.extend(washed_pokes[1:51:3])
        # for _ in range(0, 17):
        #     # 从洗好的牌中 连续发17张牌 给到玩家
        #     cls.player2.append(washed_pokes.pop(0))
        # 发牌给玩家三
        cls.player3.extend(washed_pokes[2:51:3])
        # for _ in range(0, 17):
        #     # 从洗好的牌中 连续发17张牌 给到玩家
        #     cls.player3.append(washed_pokes.pop(0))
        # 剩下三张牌 放入底牌中
        cls.last.extend(washed_pokes[51:54:1])

    @staticmethod
    def show_poke(poke_list, action_name):
        # 展示牌堆
        print("\n" + "-" * 100 + "\n{}:".format(action_name), end="")
        # for循环同时取出 索引 和 列表的值
        for idx, poke_ in enumerate(poke_list):
            print(poke_, end=" ")
            # 当索引一半时, 换行, 避免一行显示过长
            if idx == 54 / 2:
                print()
        print("\n" + "-" * 100)

    @classmethod
    def show_player(cls):
        """展示 牌堆"""
        # 展示原始牌堆
        cls.show_poke(cls.pokes, "初始化牌堆")
        # 展示洗好的牌堆
        cls.show_poke(cls.washed_pokes, "洗牌")
        # 展示三个玩家的牌堆
        cls.show_poke(cls.player1, "玩家一")
        cls.show_poke(cls.player2, "玩家二")
        cls.show_poke(cls.player3, "玩家三")
        # 展示底牌
        cls.show_poke(cls.last, "底牌")

    @classmethod
    def sort_poke(cls, player_poke_list):
        """根据初始化已排序的扑克牌 对玩家的牌进行排序"""
        temp_pokes = list()
        # 取出初始化已排序的扑克牌
        for poke in cls.pokes:
            # 取出玩家的扑克牌进行对比
            for player_poke in player_poke_list:
                # 判断两个对象的点数是否一致
                if poke.__str__() == player_poke.__str__():
                    temp_pokes.append(poke)
        # 反转列表, 大王排前面 ,从大到小
        temp_pokes.reverse()
        # 返回排序好的牌
        return temp_pokes

    @classmethod
    def sort_pokes_opt(cls):
        # 给玩家一的牌排序
        cls.player1 = cls.sort_poke(cls.player1)
        # 给玩家二的牌排序
        cls.player2 = cls.sort_poke(cls.player2)
        # 给玩家三的牌排序
        cls.player3 = cls.sort_poke(cls.player3)


def main():
    """主函数"""
    # 初始化牌
    Poke.init_pokes()
    # 洗牌
    Poke.wash()
    # 发牌给三个玩家
    Poke.send_poke()
    # 给玩家的牌排序
    Poke.sort_pokes_opt()
    # 展示牌
    Poke.show_player()
    # print()
    # print(Poke.player1.__len__())
    # print(Poke.player2.__len__())
    # print(Poke.player3.__len__())


if __name__ == '__main__':
    main()

Guess you like

Origin blog.csdn.net/u010684603/article/details/107581042