2021-07-09

python面向对象实现斗地主洗牌发牌,牌面排序–最容易理解的方式

看了很多篇文章 看的很懵逼 于是自己也写了一个,浅显易懂的

import random
import operator


class PokeCard():
    # 扑克牌类
    def __init__(self, num, color, num_level, color_level):
        '''一张牌扑克牌要有的属性  游戏中牌的级别大小 '''
        # 牌表面数字大小
        self.num = num
        # 花色
        self.color = color
        # 牌的实际大小级别,区分比较谁的牌大的 如2就比10大
        self.num_level = num_level
        # 花色的大小级别 其实斗地主游戏中用不到花色大小比较,但是牌的顺序展示要用呀,黑桃要展示在红桃前面吧?
        self.color_level = color_level

    def __repr__(self):
        '''字符串展示显示这张牌的属性 数值大小、花色'''
        return "{color}{num}".format(color=self.color, num=self.num)


class GameManager():
    
    def __init__(self):
        self.poke_num = ['3', '4', '5',
                         '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', ]
        self.poke_color = ['♠', '♥', '♣', '♦']
        # 使用列表存储每张牌的对象的形式来装牌
        self.poke_cards = []
        self.playerA = []
        self.playerB = []
        self.playerC = []
        # 底牌
        self.hand_card = []

    def init_card(self):
        '''装牌+洗牌'''
        # for 循环创建每张牌,添加每一张牌的属性
        for num_level, num in enumerate(self.poke_num):
            for color_level, color in enumerate(self.poke_color):
                self.poke_cards.append(
                    PokeCard(num, color, num_level+3, color_level+1))
        # 小王入牌组 16是牌的展示大小,0是花色的级别
        self.poke_cards.extend([PokeCard('小王', '', 16, 0)])
        # 大王入牌组 17是牌的展示大小,0是花色的级别
        self.poke_cards.extend([PokeCard('大王', '', 17, 0)])
        
        # 洗牌打乱
        self.shuffle(self.poke_cards)

    def shuffle(self, poke_list):
        '''洗牌'''
        return random.shuffle(poke_list)

    def deal_cards(self):
        '''性感荷官在线发牌'''
        # 利用切片来分牌
        self.playerA = self.poke_cards[0:17]
        self.playerB = self.poke_cards[17:34]
        self.playerC = self.poke_cards[34:51]
        # 底牌是3张
        self.hand_card = self.poke_cards[51:54]
        return self.playerA, self.playerB, self.playerC, self.hand_card

    def sort_cards(self, cards):
        '''对牌组进行排序'''
        # 使用operator来排序,依据的排序方式是牌面数值+花色等级
        sort_key = operator.attrgetter('num_level', 'color_level')
        cards.sort(key=sort_key)


if __name__ == '__main__':
    game = GameManager()
    # 初始化牌组
    game.init_card()
    # 性感荷官在线发牌
    playerA, playerB, playerC, hand_card = game.deal_cards()

    print("playerA", playerA)
    print("playerB", playerB)
    print("playerC", playerC)
    print("底牌", hand_card)

    # 排序
    game.sort_cards(playerA)
    game.sort_cards(playerB)
    game.sort_cards(playerC)
    game.sort_cards(hand_card)

    print("playerA 洗牌后", playerA)
    print("playerB 洗牌后", playerB)
    print("playerC 洗牌后", playerC)
    print("底牌洗牌后", hand_card)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值