python实现德州扑克的发牌程序

对一副扑克进行发牌,并且判断牌面的结果
代码实现:Poker.py

# coding=utf-8
from random import randint, random,shuffle

#扑克类
class Poker():

    def __init__(self, color, number):
        # 颜色1,2,3,4,代表红心,黑心,方块,梅花
        self.color = color
        # 花色1-13:A,2,3,4,5,6,7,8,9,10,J,Q,K
        self.number = number

#进行游戏得类
class Game():

    # 初始化一副有序的扑克
    def __init__(self):
        self.pokers = []
        self.color_dict = [" ", "红心", "黑心", "方块", "梅花"]
        #为了更好判断皇家同花顺,把A放最后
        self.number_dict = [' ', ' ', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K','A']

        for c in range(1, 5):
            for n in range(2, 15):
                poker = Poker(c, n)
                # 添加到0-len的位置
                self.pokers.append(poker)
        
    


#----------------输出类------------------

    # 输出洗好牌后的牌
    def output_poker(self):
        index = 1

        for p in self.pokers:
            color = self.color_dict[p.color]
            number = self.number_dict[p.number]

            print(f"{index}:{color}{number}")
            index += 1

    #输出一幅指定扑克牌面
    def output_poker(self,my_poker):
        index = 1

        for p in my_poker:
            color = self.color_dict[p.color]
            number = self.number_dict[p.number]

            print(f"{index}:{color}{number}")
            index += 1

#-----------------功能类-------------------
    #洗牌
    def shuffle(self):
        shuffle(self.pokers)

    # 发牌功能
    def deal(self):
        my_pokers = []
        count=0


        #打乱好顺序,直接发前五张就可以了
        self.shuffle()
        for poker in self.pokers:
            if(count==5):
                break
            my_pokers.append(poker)
            count+=1

        return my_pokers



    #判断是否是一个颜色
    def is_same_color(self,my_pokers):
        count=0
        color=my_pokers[0].color

        for poker in my_pokers:
            if(color==poker.color):
                count+=1
            else:
                count=0
                color=poker.color

        return count==5



    def get_straight_len(self,count):
        tem_len=0
        #记录最长顺子的长度
        straight_len=0

        for n in count:
            if(n==0):
                tem_len=0
            else:
                tem_len+=1
            straight_len=max(straight_len,tem_len)

        return straight_len



    #检查牌面
    def check(self,my_pomker):
        #计算每种牌分别有多少个
        count=[0]*15
        
        #判断是否有数量为i的牌
        is_have=[0]*5
        
        #计算出是否有同数字数量为3,4,5的牌
        for poker in my_pomker:
            i=poker.number
            count[i]+=1

            if count[i]==4:
                is_have[4]+=1
            elif count[i]==3:
                is_have[3]+=1
            elif count[i]==2:
                is_have[2]+=1


        #判断是否是同花
        flag=self.is_same_color(my_pomker)
        #计算顺子长度
        straight_len=self.get_straight_len(count)


        self.output_poker(my_pomker)
        print()
        #如果是同花
        if flag:
            if straight_len==5 and count[14]==1:
                print("皇家同花顺")
                self.output_poker(my_pomker)
            else:
                print("同花")
        else:
            if straight_len==5:
                print("顺子")
                self.output_poker(my_pomker)

            #到这里,已经不是顺子,又不是同花,接下俩对牌数进行判断
            else:
                if is_have[4]:
                    print("四条")
                    self.output_poker(my_pomker)

                elif is_have[3]:
                    if is_have[2]==2:
                        print("满堂红")
                    else:
                        print("三条")

                #对子要判断有一对还是两队
                elif is_have[2]:
                    if is_have[2]==2:
                        print("两对")
                    else:
                        print("一对")

                else:
                    print("普通牌")




if __name__ == "__main__":
    game = Game()
    my_poker=game.deal()
    game.check(my_poker)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值