Python写的炸金花程序(含有特殊牌,可供2-17人重复玩耍)

下面附上运行示例

 输入1可再来一局

输入2可退出程序

下面附上源码,游戏规则在源码最后

import random

#生成一副扑克牌,除去大小王
poker1=[2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
poker2=["♠","♥","♦","♣"]

shun_zi= []
count1=0
while count1<=10:
    shun_zi.append(poker1[count1:count1+3])
    count1+=1
shun_zi.insert(0,['A',2,3])
total_card_type=["豹子","同花顺","金花","顺子","对子","特殊"]

def game_entry():
    # 游戏开始,输入玩家名称
    name_list = input("请输入玩家名称:").split(",")
    while True:
        if len(set(name_list))<len(name_list):
            name_list=input("名字有重复!换个人吧!\n"+"请重新输入玩家名称:").split(",")
        elif len(name_list) < 2:
            name_list = input("人太少啦!再拉点人来!\n" + "请重新输入玩家名称:").split(",")
        elif len(name_list) > 17:
            name_list = input("人太多啦!叫些人旁观!\n" + "请重新输入玩家名称:").split(",")
        else:
            break
    return name_list

#发牌
def give_card(name):
    three_card_list=random.sample(poker_card,3)
    for x in three_card_list:
        poker_card.remove(x)
    print(f"{name}的牌是:",end="")
    for y in three_card_list:
        print(y,end=" ")
    total_card_list.append(three_card_list)
    return three_card_list

#确定牌型
def find_card_type(three_card_list):
    card_type=""

    if {d[1] for d in three_card_list}=={"A"}:
        print("牌型是豹子!")
        card_type="豹子"

    for c in shun_zi:
            if {d[1] for d in three_card_list} ==set(c):
                if len({d[0] for d in three_card_list})==1:
                    print("牌型是同花顺!")
                    card_type="同花顺"
                else:
                    print("牌型是顺子!")
                    card_type="顺子"

    if len({d[0] for d in three_card_list}) == 1 and card_type !="同花顺":
                print("牌型是金花!")
                card_type="金花"

    if len({d[1] for d in three_card_list})==2:
        print("牌型是对子!")
        card_type="对子"

    if len({d[0] for d in three_card_list})!=1 and {d[1] for d in three_card_list}=={2,3,5}:
        print("牌型是特殊!")
        card_type="特殊"

    if card_type not in total_card_type:
        print("牌型是散牌!")
        card_type="散牌"

    card_type_list.append(card_type)
    return card_type

#比牌
def compare_card(name):
    if "豹子" in card_type_list:
        if "特殊" not in card_type_list:
            print(f"让我们恭喜{name[card_type_list.index('豹子')]}成为最后的赢家!")
        else:
            index_list1=[g for g,h in enumerate(card_type_list) if h =="特殊"]
            if len(index_list1)==1:
                print(f"让我们恭喜{name[index_list1[0]]}成为最后的赢家!")
            else:
                print(f"本局游戏有{len(index_list1)}个赢家!")
                for k in index_list1:
                    print(f"恭喜{name[k]}!", end=" ")

    elif "同花顺" in card_type_list:
        index_list2=[g for g,h in enumerate(card_type_list) if h=="同花顺"]
        if len(index_list2)==1:
            print(f"让我们恭喜{name[index_list2[0]]}成为最后的赢家!")

        else:                                                       #比较多个同花顺
            ths_index_dict={}
            for l in index_list2:
                for c in shun_zi:                                       #遍历所有顺子
                    if {m[1] for m in total_card_list[l]}==set(c):
                        ths_index_dict[l]=shun_zi.index(c)          #{1:1,2:2,3:5,4:5}
            ths_max_list=[n for n in ths_index_dict.keys() if ths_index_dict[n]==max(ths_index_dict.values())]
            if len(ths_max_list)==1:                            #可能存在相同的最大同花顺
                print(f"让我们恭喜{name[ths_max_list[0]]}成为最后的赢家!")
            else:
                print(f"本局游戏共有{len(ths_max_list)}个赢家!")
                for k in ths_max_list:
                    print(f"恭喜{name[k]}!", end=" ")

# poker1=[2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
    elif "金花" in card_type_list:
        index_list3=[g for g,h in enumerate(card_type_list) if h=="金花"]
        if len(index_list3)==1:
            print(f"让我们恭喜{name[index_list3[0]]}成为最后的赢家!")

        else:                                                           #金花不只一个,找出最大的金花
            poker_value_drop_dict={}
            for l in index_list3:
                poker_value_list=[m[1] for m in total_card_list[l]]
                poker_index_list=sorted([poker1.index(n) for n in poker_value_list],reverse=True)
                poker_value_drop_dict[l]=poker_index_list
            max_first=[p[0] for p in poker_value_drop_dict.values()]                                    #比较金花的第一张牌
            if max_first.count(max(max_first))==1:
                max_index_first=\
                    [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]==max(max_first)][0]
                print(f"让我们恭喜{name[max_index_first]}成为最后的赢家!")

            else:                                 #比较第二张牌#2,3,7\3,4,7/4,5,7
                del_list=[k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]!=max(max_first)]
                for k in del_list:
                    del poker_value_drop_dict[k]                    #删掉比较第一张牌输掉的人
                for k in poker_value_drop_dict.values():
                    k.remove(k[0])                        #删掉剩下的人的第一张牌(都是一样的)
                max_second=[p[0] for p in poker_value_drop_dict.values()]                   #存大家的第二张牌2,3/3,4/4,5
                if max_second.count(max(max_second))==1:
                    max_index_second=\
                        [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]==max(max_second)][0]
                    print(f"让我们恭喜{name[max_index_second]}成为最后的赢家!")

                else:                                                           #比较第三张牌
                    del_list1=\
                        [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]!=max(max_second)]
                    for k in del_list1:
                        del poker_value_drop_dict[k]                #删掉比较第二张牌输掉的人
                    for k in poker_value_drop_dict.values():
                        k.remove(k[0])                  #删掉剩下的人的第二张牌(都是一样的),大家手里还剩一张牌
                    max_third=[p[0] for p in poker_value_drop_dict.values()]
                    if max_third.count(max(max_third))==1:
                        max_index_third=\
                            [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]==max(max_third)][0]
                        print(f"让我们恭喜{name[max_index_third]}成为最后的赢家!")

                    else:
                        max_index_last=\
                            [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0]==max(max_third)]
                        print(f"本局游戏共有{len(max_index_last)}个赢家!")
                        for k in max_index_last:
                            print(f"恭喜{name[k]}!", end=" ")

    elif "顺子" in card_type_list:
        index_list4 = [g for g, h in enumerate(card_type_list) if h == "顺子"]
        if len(index_list4) == 1:
            print(f"让我们恭喜{name[index_list4[0]]}成为最后的赢家!")

        else:                                                       #比较多个顺子
            sz_index_dict={}
            for l in index_list4:
                for c in shun_zi:                                       #遍历所有顺子
                    if {m[1] for m in total_card_list[l]}==set(c):
                        sz_index_dict[l]=shun_zi.index(c)          #{1:1,2:2,3:5,4:5}
            sz_max_list=[n for n in sz_index_dict.keys() if sz_index_dict[n]==max(sz_index_dict.values())]
            if len(sz_max_list)==1:                            #可能存在相同的最大顺子
                print(f"让我们恭喜{name[sz_max_list[0]]}成为最后的赢家!")
            else:
                print(f"本局游戏共有{len(sz_max_list)}个赢家!")
                for k in sz_max_list:
                    print(f"恭喜{name[k]}!", end=" ")

    elif "对子" in card_type_list:
        index_list5 = [g for g, h in enumerate(card_type_list) if h == "对子"]
        if len(index_list5) == 1:
            print(f"让我们恭喜{name[index_list5[0]]}成为最后的赢家!")
        else:
            dz_index_dict = {}
            for l in index_list5:                                                                            #不止一个对子
                poker_value_list1 = [m[1] for m in total_card_list[l]]
                dz_index_dict[l]=[m for m in poker_value_list1 if poker_value_list1.count(m)==2][0]           #找出对子,构成字典
            for m,n in dz_index_dict.items():
                dz_index_dict[m]=poker1.index(n)                                            #确定牌的等值
            if list(dz_index_dict.values()).count(max(dz_index_dict.values()))==1:
                dz_winner=[m for m,n in dz_index_dict.items() if n ==max(dz_index_dict.values())][0]
                print(f"让我们恭喜{name[dz_winner]}成为最后的赢家!")

            else:                                                               #比较最后一张牌的大小
                del_list2=\
                    [m for m in dz_index_dict.keys() if dz_index_dict[m]!=max(dz_index_dict.values())]
                for l in index_list5:
                    poker_value_list2=[m[1] for m in total_card_list[l]]
                    dz_index_dict[l]=\
                        [m for m in poker_value_list2 if poker_value_list2.count(m)==1][0]     #将字典的值修改为第三张牌
                for k in del_list2:
                    del dz_index_dict[k]                                            #删掉比一次输了的人
                for m,n in dz_index_dict.items():
                    dz_index_dict[m]=poker1.index(n)
                if list(dz_index_dict.values()).count(max(dz_index_dict.values()))==1:
                    dz_winner1=[m for m,n in dz_index_dict.items() if n==max(dz_index_dict.values())][0]
                    print(f"让我们恭喜{name[dz_winner1]}成为最后的赢家!")

                else:
                    dz_winner2 = [m for m,n in dz_index_dict.items() if n == max(dz_index_dict.values())]
                    print(f"本局游戏共有{len(dz_winner2)}个赢家!")
                    for k in dz_winner2 :
                        print(f"恭喜{name[k]}!", end=" ")

    elif "散牌" in card_type_list:
        index_list3 = [g for g, h in enumerate(card_type_list) if h == "散牌"]
        poker_value_drop_dict = {}
        for l in index_list3:
            poker_value_list = [m[1] for m in total_card_list[l]]
            poker_index_list = sorted([poker1.index(n) for n in poker_value_list], reverse=True)
            poker_value_drop_dict[l] = poker_index_list
        max_first = [p[0] for p in poker_value_drop_dict.values()]  # 比较散牌的第一张牌
        if max_first.count(max(max_first)) == 1:
            max_index_first = \
            [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0] == max(max_first)][0]
            print(f"让我们恭喜{name[max_index_first]}成为最后的赢家!")

        else:  # 比较第二张牌#2,3,7\3,4,7/4,5,7
            del_list =\
                [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0] != max(max_first)]
            for k in del_list:
                del poker_value_drop_dict[k]  # 删掉比较第一张牌输掉的人
            for k in poker_value_drop_dict.values():
                k.remove(k[0])  # 删掉剩下的人的第一张牌(都是一样的)
            max_second = [p[0] for p in poker_value_drop_dict.values()]  # 存大家的第二张牌2,3/3,4/4,5
            if max_second.count(max(max_second)) == 1:
                max_index_second = \
                [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0] == max(max_second)][0]
                print(f"让我们恭喜{name[max_index_second]}成为最后的赢家!")

            else:  # 比较第三张牌
                del_list1 =\
                    [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0] != max(max_second)]
                for k in del_list1:
                    del poker_value_drop_dict[k]  # 删掉比较第二张牌输掉的人
                for k in poker_value_drop_dict.values():
                    k.remove(k[0])  # 删掉剩下的人的第二张牌(都是一样的),大家手里还剩一张牌
                max_third = [p[0] for p in poker_value_drop_dict.values()]
                if max_third.count(max(max_third)) == 1:
                    max_index_third = \
                    [k for k in poker_value_drop_dict.keys() if poker_value_drop_dict[k][0] == max(max_third)][0]
                    print(f"让我们恭喜{name[max_index_third]}成为最后的赢家!")

                else:
                    max_index_last = [k for k in poker_value_drop_dict.keys() if
                                      poker_value_drop_dict[k][0] == max(max_third)]
                    print(f"本局游戏共有{len(max_index_last)}个赢家!")
                    for k in max_index_last:
                        print(f"恭喜{name[k]}!", end=" ")

    else:                                                                       #全是散牌,最多四组
        print("本局游戏打成平局!")

if __name__=="__main__":
    print("欢迎来到炸金花游戏!理智赌博!理智消费!谢谢!")
    while True:
        poker_card=[[i,j] for i in poker2 for j in poker1]                  #每一局开始生成一副新的扑克牌
        total_card_list = []  # 存所有参加游戏的玩家的牌
        card_type_list = []  # 存所有游戏玩家的牌型
                                        #这三个变量后面要做修改不能申明为全局变量,否则玩第二局时会出问题
        name_list_=game_entry()
        for i in range(len(name_list_)):
            true_three_card_list=give_card(name_list_[i])
            find_card_type(true_three_card_list)
        print()
        compare_card(name_list_)
        go_on=input("赌博有风险,投资需谨慎!\n"+"1代表再来一局!\n"+"2代表不玩啦!\n"+"请输入您的选择:")
        while True:
            if go_on=="2":
                exit("Bye bye!")
            elif go_on=="1":
                break
            else:
                go_on=input("请输入1 or 2:")

#游戏规则
'''
一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。
有以下几种牌:
豹子:三张点相同的牌,AAA、222。
同花顺:花色相同的顺子,黑桃456、红桃789。
金花:花色相同,非顺子,黑桃368,方片945。
顺子:花色不同的顺子,黑桃5红桃6方片7。顺子AKQ>KQJ……432>32A。注:KA2不是顺子。
对子:两张点相同的牌,223,334。不可能出现对子金花
散牌:三张牌不组成任何类型的牌。
特殊:花色不同的235
豹子>同花顺>金花>顺子>对子>散牌;特殊>豹子。特殊<散牌。
胜负判定
 a. 豹子〉同花顺〉金花〉顺子〉对子〉散牌
 b. 当豹子存在时,“花色不同235”〉“豹子”>金花
c. AKQ >KQJ>…234>A23。单牌大小:A>K>Q…..>2。
 d. 对子的情况,先比对,再比单。
 e. 全部为单张时,由最大的单张开始依次分别比较
1. 先生成一付完整的扑克牌
2. 给2-17个玩家随机发牌
3. 统一开牌,比大小,输出赢家是谁
'''

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王翊珩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值